使用Windows身份验证时发生Oracle连接错误

使用Windows身份验证时发生Oracle连接错误,windows,oracle,authentication,Windows,Oracle,Authentication,我正在尝试使用Devart库通过Windows身份验证连接到Oracle服务器。基本上,客户端使用登录类型为LOGON32\u logon\u NEW\u凭据的LogonUser Windows API函数模拟有权访问数据库的Windows用户,然后尝试连接到服务器,但服务器抱怨用户没有访问数据库的权限(该用户确实有权限,因为我可以使用作为该用户运行的sqlplus客户端连接到服务器)。我在尝试连接后检查了服务器日志,可以看到尝试连接的用户是启动客户端的用户,而不是模拟用户(因此连接失败是有意义

我正在尝试使用Devart库通过Windows身份验证连接到Oracle服务器。基本上,客户端使用登录类型为LOGON32\u logon\u NEW\u凭据的LogonUser Windows API函数模拟有权访问数据库的Windows用户,然后尝试连接到服务器,但服务器抱怨用户没有访问数据库的权限(该用户确实有权限,因为我可以使用作为该用户运行的sqlplus客户端连接到服务器)。我在尝试连接后检查了服务器日志,可以看到尝试连接的用户是启动客户端的用户,而不是模拟用户(因此连接失败是有意义的)。问题是为什么使用此用户而不是预期的模拟用户?有趣的是,如果使用登录类型LOGON32\u logon\u NETWORK\u 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”添加到连接字符串中,但它抱怨“Integrated Security”不存在

总结一下问题:客户端使用LogonUser函数和登录类型LOGON32\u logon\u NEW\u凭据模拟对数据库具有权限的用户,但连接是使用启动进程的用户完成的,而不是模拟用户。为什么会发生这种情况?我怀疑连接字符串需要其他内容,但我不能弄清楚是什么

谢谢


详细信息:

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\u logon\u NEW\u凭据),但数据库接收到来自用户a而不是用户B的凭据连接尝试,因此出现错误“logon denied”

3NUnit测试

4如果我尝试使用sqlplus进行连接,它会工作。基本上,我以用户B的身份打开一个命令提示符(从第2项的示例中),然后运行以下命令(主机、端口和服务名在这里是占位符):


请向我们提供以下信息,以便复制该问题:

  • 异常的消息和堆栈跟踪
  • “启动客户端的用户”和“模拟用户”之间有什么区别
  • 尝试使用windows身份验证建立连接的应用程序类型
  • SQL*Plus中使用的连接字符串
  • …我尝试按照此处的建议将“Integrated Security=yes”添加到连接字符串中,但它抱怨“Integrated Security”不存在


    没有“集成安全性”连接字符串参数。如果要使用Windows身份验证,只需省略“用户id”和“密码”连接字符串参数。有关详细信息,请参阅

    ,感谢您的回复。我编辑了这篇文章以回答您的问题。关于您最后的评论:是,连接字符串没有我没有用户名/密码。我只是尝试了“Integrated Security=yes”,因为我认为这是另一个问题的答案。
    sqlplus /@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))"