我試圖使用Devart庫連接到使用Windows身份驗證的Oracle服務器。基本上,客戶端將模擬可以訪問與使用的登錄類型LOGON32_LOGON_NEW_CREDENTIALS中的LogonUser Windows API函數數據庫的Windows用戶,然後嘗試連接到服務器,但是服務器抱怨說,用戶沒有權限訪問該數據庫(用戶具有權限,因爲我可以使用以該用戶身份運行的sqlplus客戶端連接到服務器)。我檢查了服務器日誌的連接嘗試之後,我可以看到,嘗試連接的用戶啓動該客戶端,而不是模擬的用戶的用戶(因此它是有道理的,連接失敗)。問題是爲什麼這個用戶被使用,而不是預期的模擬用戶?有趣的是,如果使用登錄類型LOGON32_LOGON_NETWORK_CLEARTEXT調用LogonUser函數,則使用模擬用戶完成連接並且連接正常工作。問題是我們不能使用這種登錄類型,因爲客戶端在連接打開時需要訪問其他資源,並且在這種模擬模式下這是不可能的。與Windows身份驗證的Oracle連接錯誤
這是所使用的連接字符串:
data source="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))";unicode=true;Connect Mode=;Pooling=False
我嘗試添加「集成安全性=是」連接字符串建議here但抱怨說,「綜合安全」不存在。
總結問題:客戶端使用LogonUser函數和登錄類型LOGON32_LOGON_NEW_CREDENTIALS模擬具有數據庫權限的用戶,但是使用啓動進程的用戶而不是模擬用戶完成連接。這是爲什麼發生?我懷疑連接字符串需要別的東西,但我無法弄清楚它是什麼。
謝謝。
詳細說明:
堆棧跟蹤:
Devart.Data.Oracle.OracleException : ORA-01017: invalid username/password; logon denied
at Devart.Data.Oracle.an.b(Int32 A_0)
at Devart.Data.Oracle.a.c(Int32 A_0)
at Devart.Data.Oracle.a.a(aj A_0, f A_1)
at Devart.Data.Oracle.ak..ctor(aj A_0, ak A_1)
at Devart.Data.Oracle.c.a(DbConnectionOptions A_0, Object A_1, DbConnectionBase A_2)
at Devart.Common.DbConnectionFactory.a(DbConnectionBase A_0, DbConnectionOptions A_1)
at Devart.Common.DbConnectionFactory.a(DbConnectionBase A_0)
at Devart.Common.DbConnectionClosed.Open(DbConnectionBase outerConnection)
at Devart.Common.DbConnectionBase.Open()
at Devart.Data.Oracle.OracleConnection.Open()
at NHibernate.Connection.DriverConnectionProvider.GetConnection()
at NHibernate.AdoNet.ConnectionManager.GetConnection()
at NHibernate.Impl.SessionImpl.get_Connection()
的 「啓動該客戶端用戶」 是啓動該進程的用戶,例如用戶A.「模擬用戶」是具有數據庫許可權的用戶,例如,用戶B.用戶A對數據庫沒有權限。用戶B沒有權限訪問運行此進程的計算機上的資源。所以處理開始爲用戶A,則該過程被模擬到用戶B(使用LogonUser函數和登錄類型LOGON32_LOGON_NEW_CREDENTIALS)來訪問數據庫,但數據庫接收連接嘗試與來自用戶A的憑證,而不是從用戶B,因此錯誤「登錄被拒絕」。
NUnit測試。
如果我試圖用sqlplus進行連接,它的工作原理。基本上我打開一個命令提示作爲用戶B(從在第2項的實施例)和運行下面的命令(主機,端口和服務名這裏是佔位符):
sqlplus /@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))"
感謝您的回覆。我編輯帖子回答你的問題。關於你最後的評論:是的,連接字符串沒有用戶ID /密碼。我剛剛嘗試過'Integrated Security = yes',因爲我在另一個問題中將它看作是答案。 – Paul