0

我有一个 IdentityServer 设置来连接到外部 ADFS 服务器。我可以通过 OAuth2 / OpenId Connect 登录并获取访问令牌。AspNet.Core WebApi 在 IIS AppPool 中运行,用户启用了 Kerberos 委派(应该有,不知道如何检查,因为我没有进入基础设施)。

我想要实现的是,我从 WebApi 上的 IdentityServer 获得的 ClaimsIdentity 使用模拟转换回 WindowsIdentity,无需密码。只需一个用户名就足够了。使用实际模拟的 WindowsIdentity,我应该登录到数据库并进行一些突变。

我不确定这是否可能,但我已经为此苦苦挣扎了一段时间。

将此作为模拟实施的基础。我唯一的问题是Context.User.Identity不返回 a WindowsIdentity,而是 a ClaimsIdentity

我尝试的另一种方法是使用var user = new WindowsIdentity(username);其中的用户名是 UPN。这将创建一个身份,ImpersonationLevel.Identity而不是ImpersonationLevel.Impersonated. 当我WindowsIdentity.RunImpersonated()使用此用户运行时,访问令牌将在加载所需的程序集时给出拒绝访问或 IOException。

所以第一个问题:如何检查 IIS AppPool 用户是否具有正确的 Kerberos 委派权限?

第二个问题:是否甚至可以仅使用用户名来冒充用户?

4

1 回答 1

1

您所描述的是使用“任何”身份验证方法的委托。就协议而言,这称为 Service-for-User-to-Proxy。它要求服务帐户被授予该权限,并且您需要检查是否为此配置了 Active Directory 服务帐户。您还需要指明哪些服务可以接收模拟连接。

一旦您配置了服务帐户,您应该重新启动运行代码的机器(事情会被负面缓存在内存中,这需要一段时间才能超时)。如果您的应用程序在 IIS 中运行,您的服务帐户应该已经配置为使用正确的 Windows 本地权限进行模拟。

但是,请记住,此权限为您的应用程序授予您请求服务票证的任何服务的全局权限。这意味着您的应用程序可以冒充所有人,这确实有点危险。

在此处输入图像描述

于 2020-05-26T19:11:48.467 回答