如何使用Windows身份验证将System.Data.OracleClient连接到oracle数据库?



使用Oracle SQL Developer,我可以将/字符添加到用户名并将密码留空,然后我就可以连接了。我在数据库中创建了OP$MYWINDOWS用户名用户。

编辑:如果我选中操作系统身份验证复选框(清空并禁用用户名 + pwd),SQL 开发人员将无法正常工作。此外,首选项->数据库->高级->使用Oracle Client未选中,所以我想SQL开发人员做什么或不做什么与我的System.Data.OracleClient.OracleConnection问题关系不大。

但是,当我尝试形成这样的连接字符串时:

string.Format("Data Source={0}; user id=/;password=;Integrated Security=yes", dbName);

我收到 ORA-01017:用户名/密码无效:登录被拒绝

string.Format("Data Source={0}; user id=/;password=;Integrated Security=no", dbName);

我得到 ORA-01005。

string.Format("Data Source={0};Integrated Security=yes", dbName);

我收到 ORA-01017:用户名/密码无效:登录被拒绝

string.Format("Data Source={0}; user id=/;", dbName);

我得到 ORA-01005

string.Format("Data Source={0};User Id=/;Integrated Security=yes;", dbName);

我得到 ORA-01017

当我指定用户名和密码时,我的程序中的 OracleConnection 和 Oracle SQL Developer 都可以工作。

编辑:这适用于

string.Format("Data Source={0};Integrated Security=yes", dbName);

当 sqlnet.ora 行

SQLNET.AUTHENTICATION_SERVICES= (NTS) 

更改为

SQLNET.AUTHENTICATION_SERVICES= (NONE)

如果有人写简短的答案正在发生的事情和原因,我很乐意给他/她赏金。

您的问题不在于连接字符串,而在于您的 Active Directory 结构,以及 Oracle 设置以能够使用 AD 的 LDAP 数据库,为什么如果您在本地数据库(例如 OracleXE)上尝试代码,而不使用活动目录,您可能会成功,但同时在分布式 Oracle 服务器上您可能会收到授权错误, 因此,请找到一个强大的管理员来正确设置您的AD和Oracle。

SQL Developer 有时会有无法理解的行为。此"操作系统身份验证"功能不可靠。

应从身份验证字符串中完全删除id

string.Format("Data Source={0}; Integrated Security=yes;", dbName);

编辑

它仅在删除 NTS 选项时起作用的事实可能意味着预期的服务未运行,或者 NTS 不支持所有用户的操作系统身份验证,而仅适用于SYS。在这里找到一些解释:

NTS 服务在 Windows 环境中用于基于 o/s 级别的身份验证进行 Sys 用户身份验证。因此,如果您不愿意每次都提供Sys用户的密码,则应设置此密码。

在这里,有人使用您可以在其sqlnet.ora中尝试的东西:

SQLNET.AUTHENTICATION_SERVICES =(NONE, NTS)

它也可能取决于你的Oracle版本;这里说Oracle 12c不支持NTS

从 Oracle Database 12c Release 1 (12.1) 开始,NTS 身份验证适配器不再支持使用 NTLM 对 Windows 域用户进行身份验证。因此,NTS 不能用于对旧 Windows NT 域或具有旧 Windows NT 域控制器的域中的用户进行身份验证。但是,本地连接和以 Windows 本地用户身份运行的 Oracle 数据库服务将继续使用 NTLM 进行身份验证。

简而言之,它是NTS指示的Windows本机操作系统身份验证。

指定 NTS 后,Oracle 客户端会将用户名标识为与您的 OP$MYWINDOWSUSERNAME 数据库用户不匹配的工作组\用户名或域\用户名

为了使它与NTS选项一起使用,您需要在数据库用户名中包含域/工作组名称:

CREATE USER "OPS$<DOMAIN_NAME><OS_USERNAME>" IDENTIFIED EXTERNALLY;

Oracle 支持文档 750436.1 通过详细步骤确认了这一点。

您的问题是不能从数据库计算机本身外部使用/作为用户 ID。 此外,在某些情况下,/不能用于连接到数据库,除非指定为"/作为 sysdba"。 因此,如果要通过客户端库(如 ADO.NET)进行连接,则必须指定用户名和密码,否则将无法连接。

如果您希望使用 LDAP 用户进行身份验证以访问数据库,您还可以使用 OAM 和 ORACLE SSO 以及 OUD/EUM

最新更新