无法使用应用程序池用户从托管在IIS上的Web API打开kerberos连接

问题描述

我在.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”。 这样,您可以确保自己的应用程序池将使用这些凭据。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...