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

Jac*_*son 5 c# oracle odp.net .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();
Run Code Online (Sandbox Code Playgroud)

但是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."}
Run Code Online (Sandbox Code Playgroud)

添加对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."}
Run Code Online (Sandbox Code Playgroud)

Jac*_*son 9

这里的问题是,.NET Core 的托管 ODP.NET 包尚不支持 Kerberos 身份验证,并且在 .NET Core 5 之前,当 Microsoft 将所需的 Kerberos API 添加到 .NET Core 时,不太可能支持 Kerberos 身份验证。Oracle 网站对此进行了讨论。

当 Oracle 安装配置为使用 Kerberos 时,通常会通过将SQLNET.AUTHENTICATION_SERVICES设置为“all”(或可能为“kerberos5”),才会出现此错误。当此项设置为allkerberos5 时,它处于要尝试的第一层身份验证方法中,因此 ODP.NET 会尝试加载提供 Kerberos 身份验证接口的 Oracle.ManagedDataAccessIOP 程序集,但没有可与 . NET 核心。

我为此提出的唯一解决方案是更改 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();
Run Code Online (Sandbox Code Playgroud)

然后,这将阻止 ODP.NET 尝试加载Oracle.ManagedDataAccessIOP.dll并继续连接。这确实意味着,如果您确实希望在 .NET Core 应用程序中进行 Kerberos 身份验证,那么您至少要到2020 年 11 月才能走运,甚至可能更久,因为 Microsoft 必须提供 API,而 Oracle 则必须在它们之上进行构建。

编辑截至 2022 年 4 月,此问题仍未解决,也没有显示解决的迹象。微软已经结束了创建所需库的请求,而甲骨文没有表现出愿意接受这个请求的迹象。如果您需要 Kerberos 和 Oracle,则不能使用 .NET Core。

编辑 2023 年 2 月 这方面可能最终会有一些进展,GitHub 上的此页面表明 Microsoft 和 Oracle 现在正在努力解决问题Support for Kerberos Authentication For Oracle DB in .Net Core #237。该线程现在得出以下结论:

Oracle 和 MS 结束了我们的 ODP.NET Core Kerberos.NET 支持讨论。官方 Oracle 支持将从 ODP.NET Core 21.10 开始。