3

谁能解释一下下面几行的功能:

WindowsIdentity wId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext wIdCon = wId.Impersonate();

这用于具有 IIS 基本身份验证的 POST 方法并且工作正常。但是,如果将 IIS 身份验证设置为 windows,则上述内容不再有效。

例如,要转储的代码太多了。

4

1 回答 1

4

从那时起,对 的调用Impersonate()使 IIS 伪装成请求用户。出于多种原因,这很有用,主要是后续代码仅在请求用户未被拒绝访问时才有效。

这适用于基本,因为网站被赋予了用户名和密码,因此可以作为用户登录。Windows 身份验证失败,因为它使用了 kerberos,并且只给出了一张引用用户的票证 - 而不是用户密码。

要使 Windows 身份验证正常工作,您需要允许网站帐户(即您的应用程序的应用程序池标识)模拟用户。这是在 Active Directory 中其帐户的委派选项卡中完成的。

如果他们没有委托选项卡,您首先需要添加一个 SPN(服务主体名称)。SPN 允许客户知道哪个帐户正在运行网站,因此如何加密到 kerberos 票证以便网站可以打开它。只要客户端和服务器都信任第 3 方(标准 MS 实现中的 AD 服务器),这完全是一种允许客户端和服务器进行交谈的方式,而无需彼此告知他们的密码。

这都是被称为 kerberos 双跳的常见问题的一部分。这一切都源于从客户端到网站的 Kerberos 有效(网站对客户端用户凭据以提供页面等有足够的了解),但是从网站到需要 Web 用户凭据的资源的第二跳没有给出他们作为网站帐户是不允许的。有关详细信息,请参阅msdn 上的理解-kerberos-double-hop

编辑:

尝试运行setspn /q http/machine_name_or_fqdn例如

setspn /q http/mywebbox
setspn /q http/mywebbox.my.domain.com

这些 spn 的对象是哪些用户?IIS 需要让网站的 appPool 以与 SPN 相同的用户身份运行。

确认后,我建议使用fiddler工具检查客户端和服务器之间传递的内容 - 确认收到 401 错误响应(即您需要进行身份验证)并立即重试具有有效的 kerberos 标头。

一旦您通过 kerberos 让客户端与服务器对话,您需要确保已在 AD 中将 appPool 帐户设置为允许代表用户进行委派。

于 2012-08-14T14:40:03.150 回答