2014-02-13 37 views
2

我想知道是否有人在編寫使用Oracle OCI API的C/C++應用程序並使用Oracle錢包進行身份驗證方面取得任何成功。使用來自OCI的Oracle Wallet認證

我已經使用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」的dbnames)

我看到有一個用於打開錢包和詢問其內容的安全API,但我認爲這是想要交互的應用程序直接與錢包的內容(即添加/刪除憑證等)。也許這是我的錯誤假設...

有關於如何以編程方式執行此操作的寶貴信息,所以如果任何人有任何指針或一個可以簡單連接到數據庫的小型工作示例這樣我會非常感激。

非常感謝

回答

2

這就是我發現也有珍貴的一點信息告訴我們怎樣做到這一點編程。我終於通過體驗找到了它。看起來你的sqlnet.ora和tnsnames.ora文件設置正確,所以你只需要修改你的代碼以便連接到服務器並啓動會話。

當連接到服務器時,您的dblink文本字符串應該是您的oracle錢包條目的tnsnames.ora中的連接字符串。在你的情況「XE」。

OCIServerAttach(OCIServer * srvhp, OCIError * errhp, CONST文本* DBLINK, SB4 dblink_len, UB4模式)

當開始會話,credt應設置爲OCI_CRED_EXT。這將在外部驗證憑據,因爲SQLNET.WALLET_OVERRIDE = TRUE在sqlnet.ora中,它使用oracle wallet來驗證連接字符串。另外,有信用卡設置爲OCI_CRED_EXT忽略用戶名和密碼會話屬性。

OCISessionBegin(OCISvcCtx * svchp, OCIError * errhp, OCISession * usrhp, UB4 credt, UB4模式);

就是這樣。我沒有在我的代碼中使用OCILogin或OCISessionPoolCreate。

祝你好運, 大衛·M·

+0

大衛,非常感謝您的回答。自發布原始問題以來,我也完全按照您的建議採用了相同的方式工作。我還發現,沒有辦法通過任何類型的連接池進行此操作,所以很高興知道我們最終獲得了相同的解決方案。非常感激。問候。 Ben – user3307344

+0

你們中的任何一個人都知道這是否也適用於EZ-Connect?我們根本沒有使用ORACLE_HOME或ORACLE_SID,也沒有任何.ora文件(使用Instant-Client),並且寧願留在EZ-Connect中。 – ddevienne

相關問題