在 .NET Core 中连接到 Oracle 数据库时出现 Kerberos 错误



我有一个使用 .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"(。 当它设置为allkerberos5 位于身份验证方法的第一层中,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=(无(

感谢杰克逊指出正确的方向。

最新更新