在.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,PublicKeyToken=89b483f429c47342'. 
An attempt was made to load a program with an incorrect format."}
xqxqwps 回答:在.NET Core中连接到Oracle数据库时出现Kerberos错误

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

仅当将Oracle安装配置为使用Kerberos时,您会收到此错误,通常是通过将SQLNET.AUTHENTICATION_SERVICES设置为“全部”(或也许是“ 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则需要在它们之上建立。

本文链接:https://www.f2er.com/2886196.html

大家都在问