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

11
使用Oracle SQL Developer,我可以在用户名中输入“/”字符并留空密码即可连接。我在数据库中创建了名为OP$MYWINDOWSUSERNAME的用户。
编辑:如果我选中OS身份验证复选框(清空并禁用用户名+密码),则SQL开发人员无法工作。此外,偏好设置->数据库->高级->使用Oracle客户端未被选中,因此我认为SQL Developer所做或未做的与我的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)
如果有人简短回答发生了什么以及为什么,我很愿意授予他/她赏金。

只需移除“用户ID”和“密码”标记。 - Alex K.
我也尝试了来自同一来源的那个。 - char m
@SimonMourier: 我知道这已被弃用并且我也了解ODP.NET。但我只是需要解决这个问题。 - char m
1
如果您想使用操作系统用户名,则System.Data.OracleClient的正确连接字符串为Data Source=INSTANCE;Integrated Security=yes,不需要用户和密码(可能还要添加Unicode=true)。为什么这不起作用是特定于您的配置,并且很难在没有更多信息的情况下重现。例如:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/171079fd-d836-4fb8-a7ba-fed9916fbb62/cannot-connect-to-oracle-using-integrated-security?forum=sqlreportingservices - Simon Mourier
对于上一次的编辑,你的数据库是远程还是本地连接的,如果是远程连接,服务器使用了什么身份验证协议,以及服务器端操作系统是什么? - Seyran
显示剩余5条评论
4个回答

2

您的问题不在连接字符串中,而在于您的Active Directory结构以及Oracle设置是否能够使用AD的LDAP数据库。如果您在本地DB(例如OracleXE)上尝试代码且没有使用Active Directory,则可能会成功,但是在分布式Oracle服务器上可能会出现授权错误,因此请找到一位强大的管理员来设置您的AD和Oracle。


2
SQL Developer有时表现出难以理解的行为。对于这个“操作系统认证”功能来说,它并不可靠。
您应该从认证字符串中完全删除id
string.Format("Data Source={0}; Integrated Security=yes;", dbName);

编辑

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

NTS服务用于Windows环境中,使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进行身份验证。


2
简而言之,NTS是指Windows本地操作系统身份验证。
一旦指定了NTS,Oracle客户端将把用户名识别为工作组\用户名或域\用户名,这与您的OP$ MYWINDOWSUSERNAME数据库用户不匹配。
为了让NTS选项正常工作,您需要在db用户名中包含域/工作组名称:
CREATE USER "OPS$<DOMAIN_NAME>\<OS_USERNAME>" IDENTIFIED EXTERNALLY;

Oracle支持文档750436.1确认了这一点,并提供了详细的步骤。


1
你的问题是,你无法从数据库机器外部使用 / 作为用户 ID。在某些情况下,除非指定 "/ as sysdba",否则也不能使用 / 连接到数据库。因此,如果你想通过像 ADO.NET 这样的客户端库连接,则必须指定用户名和密码,否则将无法连接。
如果你想要使用 LDAP 用户进行身份验证来访问数据库,你还可以使用 OAM 和 ORACLE SSO 和 OUD/EUM。

但是我说过,“使用Oracle SQL Developer,我可以将/字符放到用户名中并将密码留空”。我的意思是从尝试ADO.NET连接的同一台机器。所以/可以从另一台机器上工作。 - char m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接