我尝试使用Devart库使用Windows身份验证连接到Oracle服务器。基本上,客户端使用登录类型为LOGON32_LOGON_NEW_CREDENTIALS的LogonUser Windows API函数模拟可以访问数据库的Windows用户,然后尝试连接到服务器,但是服务器抱怨用户没有访问数据库的权限(用户确实拥有权限,因为我可以使用以该用户身份运行的sqlplus客户端连接到服务器)。我在连接尝试后检查了服务器日志,我可以看到尝试连接的用户是启动客户端的用户,而不是模拟用户(因此连接失败是有意义的)。问题是为什么这个用户被使用而不是模仿的用户?有趣的是,如果使用登录类型LOGON32_LOGON_NETWORK_CLEARTEXT调用LogonUser函数,则使用模拟用户完成连接,并且连接正常。问题是我们无法使用此登录类型,因为客户端需要在连接打开时访问其他资源,并且在此模拟模式下,这是不可能的。
这是使用的连接字符串:
data source="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))";unicode=true;Connect Mode=;Pooling=False
我尝试添加' Integrated Security = yes'建议使用here的连接字符串,但它抱怨“集成安全性”#39;不存在。
总结问题:客户端使用LogonUser函数和登录类型LOGON32_LOGON_NEW_CREDENTIALS模拟对数据库具有权限的用户,但是使用启动进程的用户而不是模拟用户完成连接。为什么会这样?我怀疑连接字符串需要其他东西,但我无法弄清楚它是什么。
感谢。
详细信息:
1 堆栈跟踪:
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()
2 启动客户端的"用户"是启动该过程的用户,例如用户A."模拟用户"是拥有数据库权限的用户,例如用户B.用户A没有数据库权限。用户B无权访问运行此进程的计算机上的资源。因此,进程以用户A开始,然后该进程被模拟给用户B以访问数据库(使用LogonUser函数和登录类型LOGON32_LOGON_NEW_CREDENTIALS),但数据库使用来自用户A的凭证而不是来自用户B的凭证接收连接尝试,因此错误"登录被拒绝"。
3 NUnit测试。
4 如果我尝试使用sqlplus进行连接,则可以正常工作。基本上我打开一个命令提示符作为用户B(来自第2项的示例)并运行以下命令(host,port和serviceName是占位符):
sqlplus /@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))"
答案 0 :(得分:0)
请向我们提供以下有关复制问题的信息:
...我尝试添加' Integrated Security = yes'这里建议的连接字符串,但它抱怨'集成安全性'不存在......
没有集成安全性'连接字符串参数。如果您想使用Windows身份验证,只需省略用户ID'和密码'连接字符串参数。有关详细信息,请参阅http://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~UserId.html