Windows身份验证的Oracle连接错误

时间:2014-05-06 14:11:53

标签: windows oracle authentication

我尝试使用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)))"

1 个答案:

答案 0 :(得分:0)

请向我们提供以下有关复制问题的信息:

  1. 异常的消息和堆栈跟踪;
  2. 启动客户端的用户'之间的区别是什么?和'模仿用户'?
  3. 尝试使用Windows身份验证建立连接的应用程序的类型;
  4. 您在SQL * Plus中使用的连接字符串;
  5.   

    ...我尝试添加' Integrated Security = yes'这里建议的连接字符串,但它抱怨'集成安全性'不存在......

    没有集成安全性'连接字符串参数。如果您想使用Windows身份验证,只需省略用户ID'和密码'连接字符串参数。有关详细信息,请参阅http://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~UserId.html