2014-05-06 63 views
0

我試圖使用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)))" 

回答

0

請提供用於再現的以下信息問題:

  1. 異常的消息和堆棧跟蹤;
  2. '啓動客戶端的用戶'和'模擬用戶'之間有什麼區別?
  3. 嘗試使用Windows身份驗證建立連接的應用程序的類型;
  4. 您在SQL * Plus中使用的連接字符串;

...我嘗試添加「集成安全性=是」連接字符串在這裏建議,但抱怨說,「綜合安全」不存在....

沒有「集成安全性」連接字符串參數。如果您想使用Windows身份驗證,只需省略「用戶標識」和「密碼」連接字符串參數即可。欲瞭解更多信息,請參閱http://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~UserId.html

+0

感謝您的回覆。我編輯帖子回答你的問題。關於你最後的評論:是的,連接字符串沒有用戶ID /密碼。我剛剛嘗試過'Integrated Security = yes',因爲我在另一個問題中將它看作是答案。 – Paul