我有一个 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 委派权限?
第二个问题:是否甚至可以仅使用用户名来冒充用户?