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

时间:2017-03-16 13:14:20

标签: oracle ado.net connection-string oracleclient system.data.oracleclient

使用Oracle SQL Developer,我可以将/ -character放入用户名并将密码保留为空,然后连接。我在数据库中创建了OP $ MYWINDOWSUSERNAME用户。

编辑:如果我检查操作系统身份验证复选框(清空并禁用用户名+密码),则SQL Developer不起作用。此外,首选项 - >数据库 - >高级 - >使用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)

如果有人写简短的回答发生了什么以及为什么,我很乐意给予他/她赏金。

4 个答案:

答案 0 :(得分:2)

SQL Developer有时候会有不可理解的行为。对于这种"操作系统认证"它不可靠。特征

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

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

修改

只有当您删除NTS选项时,它才能运行,或者NTS不支持所有用户的操作系统身份验证,但仅适用于{{ 1}} 即可。找到here一些解释:

  

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

here使用您可以在其SYS中尝试的内容的人:

sqlnet.ora

它也可能取决于您的Oracle版本; here it says NTS is not supported with Oracle 12c

  

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

一旦指定NTS,oracle客户端将用户名识别为workgroup \ username或domain \ username,它与您的OP $ MYWINDOWSUSERNAME数据库用户不匹配

为了让它使用NTS选项,您需要在db用户名中包含域/工作组名称:

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

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

答案 3 :(得分:1)

您的问题是您不能在数据库机器外部使用/作为用户ID。在某些情况下/不能用于连接到数据库,除非它被指定为“/ as sysdba”。因此,如果您想通过ADO.NET等客户端库进行连接,则必须指定用户名和密码,否则将无法连接。

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