首页 > 解决方案 > 将经过身份验证的用户传递到同一 IIS 实例中的 API 应用程序

问题描述

环境

我有两个应用程序,一个调用 API 的客户端应用程序:

ClientApplication.Web My.Api

两者都作为具有自己的应用程序池的应用程序托管在 IIS 中。两者都设置为使用 Windows 身份验证,并禁用所有其他身份验证选项。

要求

公司政策是应用程序池必须在服务帐户下运行SRV\iis_sa,因此我将两个应用程序池设置为在该服务帐户下运行。

应用程序池

行为

当我浏览到时My.Api/swagger,它会提示输入凭据...我可以调用任何控制器方法,并且使用调试器可以看到User.Identity.Name确实是domain\MyName..

当我浏览到ClientApplication.Web我输入我的凭据时,这很好。我domain\MyName在右上角看到我的(使用 显示User.Identity.Name)这告诉我 Windows Auth 工作正常。

但是,当ClientApplication.Web页面加载时,它会立即调用 api,然后我得到一个身份验证错误。我可以通过将ClientApplication.Web应用程序池的标识设置为 . 来克服此错误domain\MyName。这会导致GetData调用成功。

ApproveRow然后,当我调用在 api 端使用的 API 控制器方法调用时User.Identity.Name,它始终记录domain\MyName为执行操作的用户(在应用程序池中为 设置的相同用户帐户ClientApplication.Web)。我已经和同事核对过了,它总是记录我的名字,而不是他们自己的名字。我认为这是因为应用程序池标识设置为我的名字。

问题

如何将当前经过身份验证的用户从我的 Web 应用程序传递到 IIS 中的 api 应用程序?

或者

我需要在 IIS 中更改什么设置,以便通过身份验证的用户,ClientApplication.Web以便我可以使用User.Identity.Name(等)My.Api

我尝试过的

(或试图尝试...)

  1. 尝试了应用程序池中的所有内置帐户ClientApplication.Web- LocalService、LocalSystem、NetworkService 和 ApplicationPoolIdentity(这些选项中的任何一个都会产生与我使用的相同的身份验证错误SRV\iis_sa
  2. 启用了模拟My.Api(不同的错误,但似乎不兼容,所以避开了这个)
  3. 对两个应用程序文件夹启用完全控制权限SRV\iis_sa(没有区别)
  4. 试图添加SRV\iis_saImpersonate a client after authentication本地安全策略中,但是这被 GPO 覆盖,我不确定它是否有助于解决问题。
  5. 将两个应用程序设置useAppPoolCredentials为 true,并为每个应用程序设置 true/false 的所有组合。使用AppPoolCredentials
  6. 在每个应用程序的基本设置中,Connect as 设置为透传身份验证通过身份验证

也许我缺少一些简单的东西,如果有人能指出的话,我将不胜感激。

谢谢。

标签: asp.net-coreiiswindows-authentication

解决方案


推荐阅读