Windows 身份验证的 Oracle 连接错误
Posted
技术标签:
【中文标题】Windows 身份验证的 Oracle 连接错误【英文标题】:Oracle connection error with Windows authentication 【发布时间】:2014-05-06 14:11:52 【问题描述】:我正在尝试使用 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
我尝试按照here 的建议将“Integrated Security=yes”添加到连接字符串,但它抱怨“集成安全”不存在。
总结问题:客户端使用 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 项的示例)并运行以下命令(主机、端口和服务名称是这里的占位符):
sqlplus /@"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port)))(CONNECT_DATA=(SERVICE_NAME=serviceName)))"
【问题讨论】:
【参考方案1】:请向我们提供以下信息以重现问题:
-
异常的消息和堆栈跟踪;
“启动客户端的用户”和“模拟用户”有什么区别?
尝试使用 Windows 身份验证建立连接的应用程序类型;
您在 SQL*Plus 中使用的连接字符串;
...我尝试按照此处的建议将“Integrated Security=yes”添加到连接字符串,但它抱怨“集成安全性”不存在...。
没有“集成安全”连接字符串参数。如果要使用 Windows 身份验证,只需省略 'user id' 和 'password' 连接字符串参数。更多详情请参考http://www.devart.com/dotconnect/oracle/docs/?Devart.Data.Oracle~Devart.Data.Oracle.OracleConnection~UserId.html
【讨论】:
感谢您的回复。我编辑了帖子以回答您的问题。关于您的最后一条评论:是的,连接字符串没有用户 ID/密码。我刚刚尝试了“Integrated Security=yes”,因为我将其视为另一个问题的答案。以上是关于Windows 身份验证的 Oracle 连接错误的主要内容,如果未能解决你的问题,请参考以下文章
windows10远程桌面连接身份验证错误:函数不受支持,这可能是由于 CredSSP 加密 Oracle 修正
远程连接Windows云服务器报错:出现身份验证错误,要求的函数不受支持
windows连接远程win服务器失败,win7win10都存在此问题,显示出现身份验证错误,要求的函数不受支持,可能由于CredSSP加密Oracle修正