我有一个使用 .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."}
这里的问题是,.NET Core 的托管 ODP.NET 包尚不支持 Kerberos 身份验证,并且在 .NET Core 5 之前不太可能这样做,因为Microsoft会将所需的 Kerberos API 添加到 .NET Core。 这在甲骨文网站上进行了讨论。
仅当 Oracle 安装配置为使用 Kerberos 时,通常通过设置 SQLNET,才会收到此错误。AUTHENTICATION_SERVICES到"全部"(或者也许是"kerberos5"(。 当它设置为all
kerberos5 位于身份验证方法的第一层中,ODP.NET 尝试加载 Oracle.ManagedDataAccessIOP 程序集,该程序集为 Kerberos 身份验证提供接口,并且没有适用于 .NET Core 的版本。
我为此提出的唯一解决方案是更改SQLNET。AUTHENTICATION_SERVICES值,以便不需要 Kerberos,一种方法是使用 OracleConfiguration 方法:
OracleConfiguration.SqlNetAuthenticationServices = "none";
var con = new Oracle.ManagedDataAccess.Client.OracleConnection($"User Id={env.UserName};Password={env.UserPassword};Data Source={env.TNSName}")
conn.Open();
然后,这会阻止 ODP.NET 尝试加载Oracle.ManagedDataAccessIOP.dll
,连接将继续。 这确实意味着,如果您真的希望在.NET Core 应用程序中进行 Kerberos 身份验证,那么您至少要到 2020 年 11 月才能走运,甚至可能更长,因为Microsoft必须提供 API,而 Oracle 必须在它们之上构建。
编辑截至 2022 年 4 月,这仍未解决,也没有解决的迹象。 Microsoft已经关闭了创建所需库的请求,Oracle 没有表现出想要获取它的迹象。 如果你想要Kerberos和Oracle,那么你就不能使用.NET Core。
编辑 2023 年 2 月可能终于有一些动向,GitHub 上的这个页面表明Microsoft和 Oracle 现在正在努力解决 .Net Core #237 中对 Oracle DB 的 Kerberos 身份验证支持的问题。此线程现在以以下内容结束:
甲骨文和微软已经结束了我们的 ODP.NET 核心 Kerberos.NET 支持 讨论。官方Oracle支持将从 ODP.NET 核心开始 21.10.
我经常为这个错误而挣扎,完全相同的代码在所有其他开发人员机器中都可以工作,并且在大型应用程序中大量使用代码,因此添加OracleConfiguration.SqlNetAuthenticationServices不是一种选择。
我能够通过更新 sqlnet.ora 文件来解决此问题:\程序文件 ((\Oracle_Admin\sqlnet.ora
更新的配置
SQLNET.AUTHENTICATION_SERVICES=(无(
感谢杰克逊指出正确的方向。