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

时间:2014-10-16 18:00:39

标签: c# oracle12c odp.net-managed ora-01017

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

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设置。

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

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

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

  3. 下载
  4. 将您的服务器升级到Oracle 12.2c。 12.2c之前的Oracle 12c版本仍然存在此问题。

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

10 个答案:

答案 0 :(得分:11)

我几周来一直在努力解决这个问题,并最终得到了解决方案。我必须禁用FIPS安全策略,尝试设置此密钥:

[HKEY_LOCAL_MACHINE \ SYSTEM \ CURRENTCONTROLSET \控制\ LSA \ FipsAlgorithmPolicy] &#34;启用&#34; = DWORD:00000000

为零,它对我来说很完美

我关注你的帖子你的空白密码问题最终指向我:

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

答案 1 :(得分:9)

根据Jeff的回答(2014年10月31日)......

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位)。已经有一个元素,所以把元素放在里面。

答案 2 :(得分:2)

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

答案 3 :(得分:0)

我的情况并不像这种情况那样,但我确实有非常相似的结果。我解决问题的方法是,我将密码用下面的引号括起来(VB.NET):

{ "author": "Joe Bloggs", "name": "test-app", "main": "server.js", "version": "1.0.0", "private": true, "scripts": { "test": "NODE_ENV=production node test.js run()", }, "dependencies": { "express": "~4.10.6", } }

或使用chr(34)如下

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

答案 4 :(得分:0)

我有完全相同的问题。当我直接从SqlDeveloper连接到数据库时,它工作正常。但我的应用程序(基于VB6构建)无法连接到Oracle并出现错误&#34; ORA-01017无效的ID /密码。
关闭后,对我的数据库ID进行区分大小写的登录,它解决了问题。

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

我正在尝试使用以下命令:

ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;

但是没有用。 我必须使用“ DBA”选项卡中的SQL Developer对其进行更改。

  1. 找到参数“ sec_case_sensitive_logon”并将其值更改为“ FALSE” enter image description here
  2. 使用按钮提交更改: enter image description here
  3. 它将询问提交策略,您必须同时选择以下两者: enter image description here
  4. 点击“应用”
  5. 我不知道是否需要执行此步骤,但是我还更改了用户密码。 (我设置了相同的密码)

以防万一,您不知道如何打开“初始化参数”:

  1. 打开“ Oracle SQL Developer”
  2. 转到“查看”菜单,然后选择“ DBA”
  3. 选择连接
  4. 然后单击“初始化参数”

enter image description here

答案 7 :(得分:0)

检查用户名和密码的大小写。

答案 8 :(得分:0)

由于某种原因(也不知道为什么),即使我将用户名写为小写,我的C#代码也将用户名大写。

例如,我的用户名是kullaniciadi,您可能会认为它的大写字母是KULLANICIADI,但事实并非如此。我的服务器的语言环境是土耳其语(我认为是这个原因),因此我的用户名的大写版本变为KULLANİCİADİ,因为在土耳其语中,i的大写字母是İ,而ı的大写字母是I。这将导致无效的用户名错误。

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

全部用大写字母键入用户名即可解决问题。

这也只能与已接受的答案结合使用。如果接受的答案中提到的注册表项设置为1,则此答案可能无效。

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

答案 9 :(得分:0)

我正在使用 Oracle xe 11g 数据库在 C# 中编程,以前从未发生过这种情况,但是我在数据库中创建的新用户,当我尝试从 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;";
相关问题