我想知道是否有人在编写使用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,但我认为这是想要直接与钱包内容交互的应用程序(即添加/删除凭据等)。也许这是我不正确的假设...
关于如何以编程方式执行此操作,有很少的信息,所以如果有人有任何指针,或者只是以这种方式连接到数据库的小工作示例,我将非常感激。
非常感谢
本
答案 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.