使用ODP.NET版本19.3(可用的最新Oracle Managed Dataaccess)通过安全外部密码存储(SEPS)连接到Oracle 11g时遇到问题,其中Oracle登录凭据存储在客户端中Oracle钱包。
如果我切换到传统的登录名/密码连接字符串,则数据库连接和命令没有问题。
此外,我报告说,使用经典ODP 11(非托管Dataaccess)的所有其他.net应用程序在SEPS模式下连接都没有问题。实际上,我正在建立将ODP.NET 19.3与SEPS和Oracle钱包模式一起使用的第一种情况。
为了我有:
-
为我们的应用程序创建了一个钱包(带有mkstore utils)并将其放置在服务器目录中,即
C:\ users \%APP_POOL_ID%\ wallet
-
为所有应用程序创建了一个sqlnet.ora文件,并将其放在服务器的Oracle Home目录中:即
%ORACLE_HOME%\ Network \ Admin
具有以下内容:
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
-
使用以下ConnectionString:
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,字符串亲和力实例名称,布尔值bForceMatch)
在OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword,布尔值bGetForApp,OracleConnection connRefForCriteria,字符串亲和力实例名称,布尔值bForceMatch)
OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs,PM conPM,ConnectionString pmCS,SecureString securePassword,SecureString secureProxyPassword,OracleConnection connRefForCriteria)
在Oracle.ManagedDataaccess.Client.OracleConnection.Open()
这是我通过<oracle.manageddataaccess.client>
config部分启用的跟踪的一部分:
>[...]
>(PRI) (TUN) OracleTuningAgent::Unegister(): Unegistered pool Data Source=DS_NAME_1; User ID=;Proxy User Id=[USER_ID_1];
>[...]
另外,在另一个跟踪文件中,可能会看到 WriteOAuthMessage将空白密码传递给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命令测试与数据库的连接。
有人可以帮助我吗?
非常感谢!