c++ - 使用 OCI 的 Oracle Wallet 身份验证

标签 c++ c oracle authentication oracle-call-interface

我想知道是否有人成功编写了使用 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/

相关文章:

java - 转义 JDBCPreparedStatement 参数中的两个单引号

c++ - 如何将 void 指针转换为类数组

c - 如何将 MSB 复制到字节的其余部分?

sql - 为什么你讨厌 Oracle 上的序列?

ios - 如何在 build.sh 中正确设置编译器以在 iOS 中构建 VLC

c - 两种情况下指针的内存分配相同吗?

在 where 子句中使用 sum() 进行 Oracle 查询

c++ - 运算符重载中的 const 返回类型

c++ - 用调试版本覆盖 new 而不会损坏 placement new

c++ - 删除此保护互斥示例中的定义