使用OCI的Oracle Wallet身份验证

时间:2014-02-13 18:45:18

标签: c++ c oracle authentication oci

我想知道是否有人在编写使用Oracle OCI API的C / C ++应用程序并使用Oracle钱包进行身份验证方面取得了成功。

我已经使用mkstore成功创建了钱包并将凭据存储在其中。我的tnsnames.ora和sqlnames.ora文件具有正确的内容,我的ORACLE_HOME和ORACLE_SID环境变量设置正确,因为我可以使用sqlplus / @XE成功使用它来验证sqlplus会话。

在同一个终端中,我创建了一个简单的C程序,它分配OCIEnv,OCIServer,OCIError和OCIsvcCtx句柄并调用OCIEnvCreate()。一切正常。

然后我尝试调用任何一个“连接”函数,例如OCILogon(也尝试过OCILogon2和OCISessionPoolCreate),我总是得到“无效的用户名/密码”。我试图调用它,因为我看到它定义为我调用sqlplus,即null用户名和密码为0长度,dbname为“XE”具有适当的长度。 (我也尝试过“@XE”和“/ @ XE”的dbnames以获得完整性)

我看到有一个用于打开钱包和查询其内容的安全API,但我认为这是想要直接与钱包内容交互的应用程序(即添加/删除凭据等)。也许这是我不正确的假设...

关于如何以编程方式执行此操作,有很少的信息,所以如果有人有任何指针,或者只是以这种方式连接到数据库的小工作示例,我将非常感激。

非常感谢

1 个答案:

答案 0 :(得分:2)

这也是我发现的,有关于如何以编程方式执行此操作的宝贵信息。我终于通过体验来弄清楚了。您似乎已正确设置了sqlnet.ora和tnsnames.ora文件,因此您需要做的就是修改代码以附加到服务器并启动会话。

连接到服务器时, dblink 文本字符串应该是tnsnames.ora中用于oracle钱包条目的连接字符串。在您的情况下“ XE ”。

OCIServerAttach (OCIServer * srvhp,                  OCIError * errhp,                  CONST文本 * dblink ,                  sb4 dblink_len,                  ub4模式)

开始会话时,信用应设置为 OCI_CRED_EXT 。这会在外部验证凭据,因为SQLNET.WALLET_OVERRIDE = TRUE在sqlnet.ora中,它使用oracle wallet来验证连接字符串。此外,将 credt 设置为 OCI_CRED_EXT 会忽略用户名和密码会话属性。

OCISessionBegin (OCISvcCtx * svchp,                  OCIError * errhp,                  OCISession * usrhp,                  ub4 信任,                  ub4模式);

就是这样。我没有在我的代码中使用OCILogin或OCISessionPoolCreate。

祝你好运, 大卫M.