我有一个使用.NET Core 3.1创建的应用程序,需要连接到Oracle数据库,连接代码非常简单,我使用用户名和密码进行连接:
var con = new Oracle.ManagedDataAccess.Client.OracleConnection($"User Id={env.UserName};Password={env.UserPassword};Data Source={env.TNSName}")
conn.Open();
但是,Open()
失败,并显示以下错误:
{"NA Kerberos5:
Authentication handshake failure at stage: Could not load file or assembly 'Oracle.ManagedDataAccessIOP, Version=2.0.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342'.
The system cannot find the file specified."}
添加对Oracle.ManagedDataAccessIOP.dll
的引用(尝试了32位和64位版本)不能解决错误,它只是将其更改为如下所示的错误:
{"NA Kerberos5:
Authentication handshake failure at stage:
Could not load file or assembly 'Oracle.ManagedDataAccessIOP, Version=2.0.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342'.
An attempt was made to load a program with an incorrect format."}
2条答案
按热度按时间7uzetpgm1#
这里的问题是.NET Core的托管ODP.NET包还不支持Kerberos身份验证,而且在.NET Core 5之前也不太可能支持Kerberos身份验证,因为Microsoft将在.NET Core中添加所需的Kerberos API。Oracle站点here上讨论了这一问题。
当Oracle安装配置为使用Kerberos时,仅会出现此错误,通常通过将SQLNET.AUTHENTICATION_SERVICES设置为“all”(也可能是“kerberos5”)。当此值设置为
all
时,kerberos5位于要尝试的第一层身份验证方法中,因此ODP.NET尝试加载Oracle.ManagedDataAccessIOP程序集,该程序集提供Kerberos身份验证的接口,但不存在“测试一个可以与.NET核心一起工作的版本。对此,我提出的唯一解决方案是更改SQLNET.AUTHENTICATION_SERVICES的值,以便不需要Kerberos,实现此目的的一种方法是使用OracleConfiguration方法:
这会阻止ODP.NET尝试加载
Oracle.ManagedDataAccessIOP.dll
,连接继续进行。这意味着如果你真的想在你的.NET核心应用程序中使用Kerberos身份验证,你至少要等到November 2020,也许更长,因为微软必须提供API,Oracle必须在它们之上构建。EDIT截至2022年4月,这个问题仍然没有得到解决,也没有迹象表明会得到解决。微软已经关闭了创建所需库的请求,甲骨文也没有迹象表明想接手这个问题。如果你想要Kerberos和甲骨文,那么你就不能使用.NET核心。
EDIT Feb 2023可能最终会有一些动作,GitHub上的这个页面建议微软和甲骨文现在正在努力解决Support for Kerberos Authentication For Oracle DB in .Net Core #237问题。
甲骨文和微软已经结束了关于ODP.NET核心Kerberos.NET支持的讨论。甲骨文官方支持将从ODP.NET核心21.10开始。
6yoyoihd2#
我与这个错误斗争了很多,完全相同的代码是在所有其他开发人员的机器上工作,它是大量使用的代码在大型应用程序,所以添加OracleConfiguration. SqlNetAuthenticationServices是不是一个选项。
我可以通过更新c:\Program Files()\Oracle_Admin\sqlnet.ora中的sqlnet.ora文件来修复此问题
更新配置
SQLNET.身份验证服务=(无)
谢谢Jackson指出正确的方向。