【发布时间】:2018-07-11 18:13:57
【问题描述】:
我意识到这个问题可能有点含糊,但我有点被这个问题困扰。
我想使用托管 ODP.NET 驱动程序(来自 NuGet 的 12.2.1100 版)连接到 oracle db 11.2.0.3.0 版本 - 我正在从本机驱动程序迁移旧版应用程序。
连接代码很简单:
var connectionString = "Data Source=MY_TNS_ALIAS;User ID=first.last;Password=mypassword";
using (OracleConnection cn = new OracleConnection(connectionString))
{
cn.Open();
}
但我收到一个异常:
Oracle.ManagedDataAccess.Client.OracleException Message=ORA-01017: invalid username/password; logon denied
我添加了TNS_ADMIN 环境变量并使用Procmon 检查tnsnames.ora 和sqlnet.ora 正在被读取。
旧的本机驱动程序在相同的代码(和不同的导入)下工作得很好。此外,该代码适用于非 Ldap 用户(在dba_users 中输入的用户)
我尝试使用OracleConnectionStringBuilder,但没有成功。
我还检查了如果我只在 NAMES.DIRECTORY_PATH 中使用 LDAP,则将在 LDAP 中查询 TNS 别名并读取 ldap.ora - 但这不是我的目标。
我的问题
- 本机驱动程序是否支持 LDAP 身份验证?
- 本机驱动程序和托管驱动程序之间是否存在必须考虑的差异?任何额外的变量?转义用户名中的点号?
- 可以使用哪些附加工具来调试此问题(我使用过
TraceLevel、TraceOption、TraceFileLocation)
任何帮助将不胜感激。
【问题讨论】:
-
Mabey 试试OracleConnectionStringBuilder 课程。即
connectionString.Password = "...";和connectionString.UserID = "..."; -
也许你混合了两个不同的项目。一种是 Oracle 名称服务器(使用通用 LDAP 协议)的 TNS 别名解析。另一种是通过网络和 LDAP 目录进行用户身份验证。 TNS 别名解析似乎有效,因为您从数据库中收到一条错误消息。因此
TraceLevel和TraceOption没有帮助。出于安全原因,很难追踪任何用户凭据。 -
我用
OracleConnectionStringBuilder方法更新了这个问题。我意识到 LDAP 身份验证和 LDAP Tns 别名解析是两件不同的事情,我只对前者感兴趣。我看到我的密码是OraclePoolManager.InitializeSEPSCredentials(),但在这之后代码很快就会变得混乱。 -
你设置
SQLNET.AUTHENTICATION_REQUIRED = 1了吗? -
添加了这个选项,没有成功