【问题标题】:How to connect with System.Data.OracleClient to oracle db with windows authentication?如何使用 Windows 身份验证将 System.Data.OracleClient 连接到 oracle db?
【发布时间】:2017-08-07 16:33:57
【问题描述】:

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

编辑:如果我检查操作系统身份验证复选框(清空并禁用用户名 + 密码),SQL Developer 将不起作用。此外,Preferences->Database->Advanced->Use Oracle Client 未选中,所以我猜 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)

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

【问题讨论】:

  • 只需删除 user idpassword 令牌
  • 这不起作用。这是我的第一次迭代。
  • 啊显然是Data Source=myOracleDB;User Id=/; - connectionstrings.com/net-framework-data-provider-for-oracle/…
  • 我也从同一来源尝试过
  • 如果您想使用操作系统用户名,那么 System.Data.OracleClient 的正确连接字符串是 Data Source=INSTANCE;Integrated Security=yes w/o 用户和 w/o 密码(并且可能添加 Unicode=true)。为什么这不起作用取决于您的配置,并且很难在没有更多信息的情况下重现。例如:social.msdn.microsoft.com/Forums/sqlserver/en-US/…

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    SQL Developer 有时会出现无法理解的行为。这个“操作系统身份验证”功能不可靠。

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

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

    编辑

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

    windows环境下使用NTS服务,在o/s级别的认证基础上进行Sys用户认证。所以如果你不愿意每次都提供 Sys 用户的密码,你应该设置这个。

    还有here 有人使用你可以在其sqlnet.ora 中尝试的东西:

    SQLNET.AUTHENTICATION_SERVICES =(NONE, NTS)
    

    这也可能取决于您的 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 域控制器的域中的用户。但是,以 Windows 本地用户身份运行的本地连接和 Oracle 数据库服务继续使用 NTLM 进行身份验证。

    【讨论】:

      【解决方案3】:

      简而言之,就是NTS表示的Windows原生操作系统认证。

      一旦指定了 NTS,oracle 客户端将用户名识别为与您的 OP$MYWINDOWSUSERNAME 数据库用户不匹配的工作组\用户名或域\用户名

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 但我说“使用 Oracle SQL Developer,我可以将 / - 字符放入用户名并将密码留空”。我的意思是来自尝试 ADO.NET 连接的同一台机器。所以 / 在另一台机器上工作。
        猜你喜欢
        • 2014-09-14
        • 1970-01-01
        • 2016-11-05
        • 2020-09-30
        • 1970-01-01
        • 2011-10-20
        • 2013-09-07
        • 1970-01-01
        相关资源
        最近更新 更多