Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝

Posted

技术标签:

【中文标题】Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝【英文标题】:Oracle.ManagedDataAccess and ORA-01017: invalid username/password; logon denied 【发布时间】:2014-12-12 04:57:38 【问题描述】:

我在我们的一台服务器上遇到了具有挑战性的情况。我有一个需要连接到 Oracle 12c 数据库的 ASP.NET MVC 3 应用程序。它使用以下连接字符串:

User ID=myuserid;Password=mypass;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<IP ADDRESS>)(PORT = 1521)))(CONNECT_DATA=(SERVICE_NAME=PDB1)));

我也在使用 Oracle 的 Oracle.ManagedDataAccess,版本 4.121.1.0。每次尝试连接都会导致以下错误:

ORA-01017: invalid username/password; logon denied

我可以使用上述凭据在我的桌面上成功连接。我在另一台服务器上有相同的代码,但使用的是旧的、非托管版本的库,它可以使用上述凭据成功连接。但是,我希望运行我的代码的服务器每次使用相同的凭据都会失败,这些凭据可以在不同的服务器上成功连接。

在失败的服务器上,我可以:

通过 SQLPLUS 连接 使用 TNSPING 访问数据库 创建系统 DSN 以建立 ODBC 连接

我检查了所有位置的 TNSNAMES.ORA,它们似乎是正确的。

在多次访问数据库后,帐户实际上被锁定,这表明我确实在访问数据库,并且数据库不喜欢提供的凭据。我检查了以前成功连接的应用程序,它们也失败了,错误提示帐户已被锁定。解锁帐户会导致这些应用程序成功连接,但我遇到问题的服务器除外。

我无计可施。

是否有人对可能导致此问题的原因有任何其他建议?

编辑

我在本地计算机和有问题的服务器上安装了 WireShark。我捕获了我的桌面和数据库以及有问题的服务器和数据库之间的通信。我发现我的桌面传达了密码:

0080  35 42 31 41 43 34 30 00 01 01 01 0d 0d 41 55 54   5B1AC40......AUT
0090  48 5f 50 41 53 53 57 4f 52 44 01 40 40 43 30 36   H_PASSWORD.@@C06
00a0  37 39 42 31 31 42 46 36 42 41 43 44 39 30 38 44   79B11BF6BACD908D
00b0  37 39 34 34 31 31 46 34 32 33 30 42 34 36 44 36   794411F4230B46D6
00c0  35 36 36 33 31 42 45 39 39 41 36 43 36 37 42 44   56631BE99A6C67BD
00d0  43 33 35 42 42 44 36 44 42 45 37 34 36 00 01 0d   C35BBD6DBE746...

而我遇到问题的服务器没有(或至少这是假设):

0080  39 33 39 37 32 33 46 00 01 01 01 0d 0d 41 55 54   939723F......AUT
0090  48 5f 50 41 53 53 57 4f 52 44 01 40 40 00 00 00   H_PASSWORD.@@...
00a0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00b0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00c0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00d0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0d   ................

是否有人知道即使密码存在于连接字符串中也会阻止密码传输的安全/配置设置?

编辑 (20180713):

在我的特殊情况下,问题在于 FIPS 设置。

对于那些从事研究的人来说,有几种方法可以解决这个问题。

    您可以更改位于 HKLM\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy\Enabled 的注册表设置。如果启用 FIPS,则值为 1。如果禁用,则值为 0。您无需重新启动。

    您遇到此问题的原因很可能是启用了 FIPS 并且您正在使用 Oracle 托管数据访问库。一个可靠的解决方法是使用非托管库。但是,要使用这个库,您需要安装 Oracle Instant Client。客户端可在Oracle Data Access Components下载。

    将您的服务器升级到 Oracle 12.2c。 12.2c之前的Oracle 12c版本还是有这个问题。

如果您没有启用 FIPS,您很可能需要调查您的数据库是否将 SEC_CASE_SENSITIVE_LOGON 设置设置为 true。您将需要执行 ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;然后重置所有密码。

【问题讨论】:

在黑暗中拍摄,也许:我很感激您不想与我们分享用户名和密码,但至少可以与我们分享他们使用哪些非字母数字字符,如果有的话? 所有都是标准的字母字符 (d,g,c,m,n,e)。都是小写的。没有数字。我相信您可能指的是登录到 oracle 的一些问题,其中用户名和/或密码具有特殊字符,例如带有变音符号的“e”。在这一点上,拥有像这样简单的东西将是天赐之物。 :-) 其实我想的更多的是符号,比如:或者?。如果您的用户名和密码只包含小写字母,我所能做的就是祝您好运。对不起! 在黑暗中射击:oracle 是否在 Oracle 服务器和尝试连接的机器上修补到相同版本?它们都使用相同的 32 位或 64 位 Oracle 版本吗? 我将不得不检查你的问题,StarPilot。我使用的 Oracle.ManagedDataAccess 版本是 64 位版本 12.1.0.1.2 Release 2。Oracle 数据库是 12c。但是,服务器是 64 位的,在服务器上,我的 DBA 安装了 11g 的 Oracle Forms and Reports。 11g 的 ODAC 也安装在服务器上,但看起来没有正确安装,因为它没有列在已安装的组件列表中,我不得不手动删除文件和注册表项。不知道 Forms & Reports 是不是 32 位,假设 12C 是 64 位。 【参考方案1】:

我已经为同样的问题苦苦挣扎了几个星期,终于有了一个解决方案。我不得不禁用 FIPS 安全策略,尝试设置此密钥:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FipsAlgorithmPolicy] “启用”=dword:00000000

归零,对我来说效果很好

我一直在关注你的帖子,你的空白密码问题最终将我指向这里:

https://community.oracle.com/thread/2557592?start=30&tstart=0

【讨论】:

遇到了这个问题并发布了我自己的问题,不知道我是否看到了和你一样的问题——dba.stackexchange.com/questions/142085/…——结果我遇到了同样的问题,这就是建议的方式我的也修。工作!因此,将这个问题与我的问题联系起来,以防其他人通过不同的故障排除程序到达我所在的位置。 必须在 Web 服务器或数据库服务器 oracle 上禁用 FIPS 的位置? 非常感谢,我禁用 SSL 3 和 TLS 1.1 后数据库无法连接,需要设置这个 你救了我的命。非常感谢【参考方案2】:

根据 Jeff 的回答 (10/31/2014)...

GPO 可以将注册表设置设置为仅允许符合 FIPS 的算法。按照指示将其设置为 0 可能会违反某些安全策略并被 GPO 覆盖。此注册表设置控制的不仅仅是 IIS 或 ASP.NET。

还有另一种特定于 .NET 的方法,可以在应用程序级别工作。与修改整个服务器的设置相比,这更容易证明。

应用特定方法:

在您的 Web.config 或 App.config 文件中,添加以下设置:

<configuration> <!-- Will already be there -->
  <runtime>
    <enforceFIPSPolicy enabled="false"/>
  </runtime>
...  the rest of your .config

如果我没记错的话,这一定是你配置文件的开头。

所有.NET应用方法:

将上述设置放在 machine.config 文件中。每个 .NET 版本和体系结构(64 位/32 位)都有一个。已经有一个元素,所以把元素放在里面。

【讨论】:

此时最重要的是确定问题。您在安全性方面一针见血,这就是为什么我真的不想使用注册表设置的原因。我真的不想在 web.config 中使用 enforceFIPSPolicy 元素,因为您仍在围绕安全要求进行最终运行;只是在每个应用程序的基础上。感谢您提供有关将其放在配置文件开头的提示。它可能在将来的某个时候有用。【参考方案3】:

我在使用 Entity Framework 和 Oracle.ManagedDataAccess.Client 时遇到了同样的问题,但是通过在配置连接字符串部分中将我的密码大写,我取得了一些成功。

【讨论】:

【参考方案4】:

我的情况与这个案例不太一样,但我确实得到了非常相似的结果。我为解决这个问题所做的是,我将密码用引号括起来,如下所示(VB.NET):

cnx.ConnectionString = "User ID=MYID;Password=""MyPass"" ;Data Source=MyTEST"

或使用 chr(34) 如下

cnx.ConnectionString = "User ID=MYID;Password="+chr(34)+"MyPass"+chr(34)+" ;Data Source=MyTEST"

【讨论】:

【参考方案5】:

我遇到了完全相同的问题。当我直接从 SqlDeveloper 连接到数据库时,它工作正常。但是我的应用程序(基于 VB6 构建)无法连接到 Oracle 并给出错误“ORA-01017 Invalid ID/password. 关闭我的数据库 ID 的区分大小写登录后,它解决了问题。

【讨论】:

【参考方案6】:

我遇到了同样的问题!我没有尝试更改 RegKey,但我确实尝试更改了网络和机器配置。这没有用。

解决问题的方法是更改​​我正在运行的应用程序池!

应用程序池在服务帐户下运行,一旦我将其移动到仅使用默认系统帐户的新应用程序池,它就会开始从配置中获取用户 ID 和密码。

【讨论】:

【参考方案7】:

我正在尝试使用命令:

ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;

但它没有用。 我必须使用 DBA 选项卡中的 SQL Developer 更改它。

    找到参数“sec_case_sensitive_logon”并将其值更改为“FALSE” 使用按钮提交您的更改: 它会询问提交策略,您必须同时选择: 点击“应用” 不知道这一步是否需要,不过我也改了用户密码。 (我设置了相同的密码)

如果您不知道如何打开“初始化参数”:

    打开“Oracle SQL Developer” 转到“查看”菜单并选择“DBA” 选择一个连接 然后点击“初始化参数”

【讨论】:

【参考方案8】:

出于某种原因(并且不知道为什么)我的 c# 代码将我的用户名发送为大写,即使我将其写为小写。

例如,我的用户名是kullaniciadi,您可能认为它的大写是KULLANICIADI,但似乎不是。我的服务器的语言环境是土耳其语(我相信这就是原因),所以我的用户名的大写版本变成了KULLANİCİADİ,因为在土耳其语中,i 的大写是İı 的大写是I。这会导致无效的用户名错误。

无法控制数据库,因此无法更改其上的任何设置。

输入我的用户名全部大写解决了这个问题。

这也只适用于接受的答案的组合。如果接受的答案中提到的注册表项设置为 1,则此答案可能不起作用。

为了这个愚蠢的事情花了很多时间。我把这个写下来,这样你就不会了。

【讨论】:

【参考方案9】:

我在 C# 中使用 Oracle xe 11g 数据库进行编程,以前从未发生过这种情况,但是我在数据库中创建的新用户,当我尝试从 C# 应用程序连接时,我得到了错误:ORA-01017: invalid username / password ; logon denied,只有新用户(我从 xe 10g 迁移到 xe 11g)从 10g 版本迁移的用户正常工作。

我在连接字符串中进行了此更改并设法解决了问题

之前

private string cadenaCone = "User Id=AAA111;Password=BBB222;Data Source=CCC333;Connection Timeout=60;";

之后

private string cadenaCone = "User Id=AAA111;Password=" + ((char)34).ToString() + "BBB222"+((char)34).ToString()+";Data Source=CCC333;Connection Timeout=60;";

【讨论】:

以上是关于Oracle.ManagedDataAccess 和 ORA-01017:用户名/密码无效;登录被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Oracle.ManagedDataAccess:TNS:无法解析指定的连接标识符

Oracle.ManagedDataAccess 错误地读取 DST 日期

ManagedDataAccess连数据库

ManagedDataAccess连数据库

C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装

如何使用 Oracle.ManagedDataAccess.EntityFramework 提供程序从不同的架构中选择表?