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

Kerberos error when connecting to Oracle database in .NET Core

我有一个使用 .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核。这在 Oracle 站点 here.

上进行了讨论

当 Oracle 安装配置为使用 Kerberos 时,您 遇到此错误,通常是通过将 SQLNET.AUTHENTICATION_SERVICES 设置为 'all'(或者可能是 'kerberos5' ).当此设置为 all 时,kerberos5 位于要尝试的第一层身份验证方法中,因此 ODP.NET 尝试加载提供 Kerberos 身份验证接口的 Oracle.ManagedDataAccessIOP 程序集,但没有一个适用于 .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 身份验证,那么您至少要等到 November 2020 并且可能更长,因为 Microsoft 必须提供 API 和然后 Oracle 必须在它们之上构建。

编辑 截至 2022 年 4 月,此问题仍未得到解决,并且没有任何迹象表明已得到解决。 Microsoft 已经关闭了创建所需库的请求,而 Oracle 没有表现出要接受它的迹象。如果您想要 Kerberos 和 Oracle,那么您就不能使用 .NET Core。

我为这个错误苦苦挣扎,完全相同的代码在所有其他开发人员机器上运行,并且它在大型应用程序中被大量使用,所以添加 OracleConfiguration.SqlNetAuthenticationServices 不是一个选项。

我能够通过更新位于 c:\Program Files ()\Oracle_Admin\sqlnet.ora

的 sqlnet.ora 文件来解决这个问题

更新配置

SQLNET.AUTHENTICATION_SERVICES=(NONE)

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