问题描述
我在.net Core 3.1中编写了一个Web API,该API托管在不受托管的APP POOL上。 API的作用是对访问它的客户端进行身份验证。客户端正在发送JSON有效负载,其中包含查询和命名数据库。
在检索到有效负载之后,API应该使用应用程序池的用户凭据打开与远程数据库的连接。我不希望转发客户的凭据,我希望使用应用程序池凭据。与数据库的连接使用MIT-Kerberos作为客户端身份验证方法。
这是失败的地方。我得到的只是以下堆栈跟踪:
2020-08-14 09:46:31.5417 COM.Core.ComLog错误用户:Uner erreur无意中获得的收益:System.Data.OleDb.OleDbException(0x80004005):[HY000]
[本地代码:30155]
[ASEOLEDB]无法加载gssapi库。
在System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString构造,OleDbConnection连接)
在System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions选项,DbConnectionPoolKey poolKey,对象poolGroupProviderInfo,DbConnectionPool池,DbConnection owningObject)
在System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions选项,DbConnectionPoolKey池密钥,对象poolGroupProviderInfo,DbConnectionPool池,DbConnection拥有的连接,DbConnectionOptions用户选项)
在System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionOptions userOptions)
在System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,TaskCompletionSource 1 retry,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource
1重试,DbConnectionOptions userOptions)处
在System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection externalConnection,DbConnectionFactory connectionFactory,TaskCompletionSource`1重试,DbConnectionOptions userOptions)
在System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection externalConnection,DbConnectionFactory connectionFactory)
在System.Data.OleDb.OleDbConnection.Open()
....
还有更多,但不是特定原因,也没有列出原因。此外,没有内部异常。我也尝试过ODBC,并且使用两种连接协议都得到了完全相同的消息。
我编写了一个非常基本的控制台程序,该程序执行相同的操作,但没有控制器和.net核心中间件。当我使用与服务器上的app_pool相同的ID运行它时,连接成功。
API托管在IIS上的事实似乎正在引起问题,但我似乎无法弄清楚为什么API无法连接到远程服务器。在应用程序池的提供程序中,使用Negotiate和NTLM将身份验证设置为拒绝匿名访问,并将Windows身份验证设置为true。
我们已经为kerberos查找了所有PATH变量目标,并确保每个位置都可以访问64位版本库。还是不行。
我要么愚蠢到无法解决,要么因这个问题而傻眼了。我希望外面有人对可能发生的事情有所了解。除了通用的kerberos安装指南之外,我在网上找不到任何其他内容。嗯。
解决方法
此操作的关键可能是将IIS AppPool高级设置中的“加载用户配置文件”选项设置为“ false”。尝试将其设置为“ true”。 这样,您可以确保自己的应用程序池将使用这些凭据。