我想知道是否有人成功编写了使用 Oracle OCI API 并使用 Oracle 钱包进行身份验证的 C/C++ 应用程序。
我已使用 mkstore 成功创建了钱包并将凭据存储在其中。我的 tnsnames.ora 和 sqlnames.ora 文件具有正确的内容,并且我的 ORACLE_HOME 和 ORACLE_SID 环境变量设置正确,因为我可以使用 sqlplus/@XE 成功使用它来验证 sqlplus session 。
在同一终端中,我创建了一个简单的 C 程序,用于分配 OCIEnv、OCIServer、OCIError 和 OCIsvcCtx 句柄并调用 OCIEnvCreate()。一切都很好。
然后,我尝试调用任何一个“连接”函数,例如 OCILogon(也尝试过 OCILogon2 和 OCISessionPoolCreate),但我总是得到“无效的用户名/密码”。我试图调用它,因为我看到它是为我的 sqlplus 调用定义的,即长度为 0 的空用户名和密码,以及具有适当长度的“XE”数据库名称。 (为了完整性,我还尝试了“@XE”和“/@XE”的数据库名称)
我看到有一个安全 API 用于打开钱包并询问其内容,但我认为这是想要直接与钱包内容交互的应用程序(即添加/删除凭据等)。也许这对我来说是一个错误的假设......
关于如何以编程方式执行此操作的信息很少,因此,如果有人有任何指示,或者一个可以通过这种方式简单连接到数据库的小型工作示例,我将非常感激。
非常感谢
本
最佳答案
这也是我发现的,关于如何以编程方式执行此操作的信息很少。我终于通过实验弄清楚了。看来您的 sqlnet.ora 和 tnsnames.ora 文件设置正确,因此您需要做的就是修改用于连接到服务器并启动 session 的代码。
连接到服务器时,您的 dblink 文本字符串应该是 tnsnames.ora 中 Oracle 钱包条目的连接字符串。在你的情况下“XE”。
OCIServerAttach(OCIServer *srvhp, OCI错误*errhp, CONST 文本 *dblink, sb4 dblink_len, ub4 模式)
开始 session 时,credt 应设置为 OCI_CRED_EXT。这会在外部验证凭据,并且由于 SQLNET.WALLET_OVERRIDE = TRUE 位于 sqlnet.ora 中,因此它使用 Oracle wallet 来验证连接字符串。此外,将 credt 设置为 OCI_CRED_EXT 会忽略用户名和密码 session 属性。
OCISessionBegin(OCISvcCtx *svchp, OCI错误*errhp, OCISession *usrhp, ub4信用, ub4 模式);
就是这样。我没有在代码中使用 OCILogin 或 OCISessionPoolCreate 。
祝你好运, 大卫·M.
关于c++ - 使用 OCI 的 Oracle Wallet 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21762885/