使用OCI的Oracle钱包身份验证

Using Oracle Wallet authentication from OCI

本文关键字:钱包 身份验证 Oracle OCI 使用      更新时间:2023-10-16

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

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

在同一个终端中,我创建了一个简单的C程序,用于分配OCIEnv、OCIServer、OCISvcError和OCIsvcCtx句柄并调用OCIEvcreate()。这一切都很好。

然后,我尝试调用任何一个"连接"函数,如OCILogon(也尝试了OCILogon2和OCSessionPoolCreate),但我总是得到"无效的用户名/密码"。我试图按照我所看到的为调用sqlplus定义的方式来调用它,即长度为0的空用户名和密码,以及长度适当的"XE"dbname。(为了完整起见,我还尝试了"@XE"answers"/@XE"的数据库名)

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

关于如何用程序实现这一点,几乎没有什么信息,所以如果有人有任何指针,或者有一个小的工作示例可以用这种方式简单地连接到数据库,我将不胜感激。

非常感谢

Ben

我也发现了这一点,关于如何用程序实现这一点的信息很少。我终于通过经验弄明白了。您似乎已经正确设置了sqlnet.ora和tnsnames.ora文件,所以您所需要做的就是修改代码,以便连接到服务器并启动会话。

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

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

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

OCISessionBegin(OCISvctx*svchp,OCIError*errhp,OCISession*usrhp,ub4credt,ub4模式);

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

祝你好运,David M.