1

我在使用 ODP.NET 版本 19.3(可用的最新 Oracle 托管数据访问)使用安全外部密码存储 (SEPS) 连接到 Oracle 11g 时遇到问题,其中 Oracle 登录凭据存储在客户端 Oracle 钱包中。

如果我切换到经典的登录名/密码连接字符串,则数据库连接和命令没有问题。

此外,我报告所有其他使用经典 ODP 11(非托管 DataAccess)的 .net 应用程序在 SEPS 模式下连接都没有问题;事实上,我正在构建第一个使用 ODP.NET 19.3 和 SEPS 和 Oracle 钱包模式的案例。

为了我有:

  1. 为我们的应用程序创建了一个钱包(使用 mkstore utils)并将其放在服务器目录中:即

    C:\users\%APP_POOL_ID%\wallet

  2. 创建(对于所有应用程序)一个 sqlnet.ora 文件并将其放在服务器的 Oracle 主目录中:即

    %ORACLE_HOME%\网络\管理员

内容如下:

SQLNET.AUTHENTICATION_SERVICES=(NTS)
NAMES.DIRECTORY_PATH=(TNSNAMES,LDAP,EZCONNECT,HOSTNAME)
names.ldap_conn_timeout = 1
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=c:\users\%APP_POOL_ID%\wallet)))
SQLNET.WALLET_OVERRIDE = TRUE
DIAG_ADR_ENABLED = off
  1. 使用以下连接字符串:

    Data Source=DS_NAME_1; User ID=[USER_ID_1];Proxy User Id=[USER_ID_1];
    

注意:用户 ID 和代理用户 ID 在连接字符串内用方括号指定。

这是我们获得的堆栈跟踪异常:

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

在 OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd,布尔 bGetForApp,OracleConnection connRefForCriteria,字符串 affinityInstanceName,布尔 bForceMatch)

在 OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword,布尔 bGetForApp,OracleConnection connRefForCriteria,字符串 affinityInstanceName,布尔 bForceMatch)

在 OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs,PM conPM,ConnectionString pmCS,SecureStringsecurePassword,SecureStringsecureProxyPassword,OracleConnection connRefForCriteria)

在 Oracle.ManagedDataAccess.Client.OracleConnection.Open()

这是我通过<oracle.manageddataaccess.client>配置部分启用的跟踪的一部分:

>[...]
>(PRI) (TUN) OracleTuningAgent::Unegister(): Unegistered pool Data Source=DS_NAME_1; User ID=;Proxy User Id=[USER_ID_1];
>[...]

此外,在另一个跟踪文件中,可以看到WriteOAuthMessage 将 BLANK 密码传递给 DB:

>(PRI) (TTC) (EXT) TTCAuthenticate.ReadOSessKeyResponse()
>(PRI) (SVC) (ENT) OracleConnectionImpl.CheckForAnyErrorFromDB()
>(PRI) (SVC) (EXT) OracleConnectionImpl.CheckForAnyErrorFromDB()
>(PRI) (TTC) (ENT) TTCAuthenticate.WriteOAuthMessage()
>(PRI) (TTC) (ENT) TTCAuthenticate.WriteOAuthMessage()
>(PRI) (TTC) (ENT) TTCFunction.WriteFunctionHeader()
>(PRI) (TTC) (ENT) TTCMessage.WriteTTCCode()
>(PRI) (TTC) (EXT) TTCMessage.WriteTTCCode()
>(PRI) (TTC) (EXT) TTCFunction.WriteFunctionHeader()
>(PRI) (TTC) (EXT) TTCAuthenticate.WriteOAuthMessage()
>(PRI) (TTC) (EXT) TTCAuthenticate.WriteOAuthMessage()
>(NET) (SND) 00 00 03 80 06 00 00 00   |........|
>(NET) (SND) 00 00                     |..      |
>(NET) (SND) 03 73 00 01 01 06 02 01   |.s......|
>[..user removed..]
>(NET) (SND) 41 55 54 48 5F 50 41 53   |AUTH_PAS|
>(NET) (SND) 53 57 4F 52 44 01 40 40   |SWORD.@@|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|
>(NET) (SND) 00 00 00 00 00 00 00 00   |........|

通过使用用户凭据登录服务器计算机并通过 sqlplus 命令测试与数据库的连接,我排除了问题是一个真正错误的登录名/密码。

谁能帮我?

非常感谢!

4

0 回答 0