【问题标题】:Using Oracle Wallet authentication from OCI使用 OCI 的 Oracle Wallet 身份验证
【发布时间】:2014-02-13 18:45:18
【问题描述】:

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

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

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

然后我尝试调用任何一个“连接”函数,例如 OCILogon(也尝试过 OCILogon2 和 OCISessionPoolCreate),但我总是得到“无效的用户名/密码”。我正在尝试调用它,因为我看到它是为我调用 sqlplus 定义的,即长度为 0 的空用户名和密码,以及具有适当长度的“XE”的 dbname。 (为了完整起见,我还尝试了“@XE”和“/@XE”的数据库名称)

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

关于如何以编程方式执行此操作的宝贵信息很少,因此,如果有人有任何指针或可以简单地以这种方式连接到数据库的小型工作示例,我将非常感激。

非常感谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    祝你好运, 大卫 M.

    【讨论】:

    • 大卫,非常感谢您的回答。自从发布原始问题以来,我也以与​​您建议的方式完全相同的方式进行了这项工作。我还发现,任何类型的连接池会话都无法做到这一点,所以很高兴知道我们最终得到了相同的解决方案。非常感激。问候。本
    • 你们知道这是否也适用于 EZ-Connect 吗?我们根本没有使用 ORACLE_HOME 或 ORACLE_SID,也没有任何 .ora 文件(使用 Instant-Client),我们更愿意继续使用 EZ-Connect。
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多