【问题标题】:IdentityServer ClaimsIdentity to Impersonated WindowsIdentityIdentityServer ClaimsIdentity to Impersonated WindowsIdentity
【发布时间】:2020-05-27 16:06:32
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net-core identityserver4 asp.net-core-identity kerberos-delegation


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-29
      • 2016-01-28
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多