如果应用程序池是本地系统,则约束委派有效,但如果 IIS 7 中的网络服务无效

如果应用程序池是本地系统,则约束委派有效,但如果 IIS 7 中的网络服务无效

我在 Windows Server 2008 上的约束委派和 IIS 7 方面遇到了问题。

我们有一个使用模拟来访问 SQL 报告服务器的 Web 应用程序。这在 IIS 6 上工作正常,无论是信任委派还是约束委派。然而,我们在 IIS 7 上遇到了问题。

我可以将其归结为以下情况:在 IIS 7 上,当应用程序池作为 NetworkService 运行并配置了约束委派时,我们从报告服务器收到 HTTP 401 未授权错误,当应用程序池作为本地系统运行时,模拟工作正常。

我已经在 Classic 和 Integrated Pipeline 中进行了测试。下面是模拟此问题的非常简单的测试页面的代码。从 Windows 2003 的 IIS 6 服务器运行相同的测试页面可以正常工作。有没有关于安全策略、IIS 配置甚至服务器功能和角色可能会影响此问题的想法?

请注意,我已检查 Kerberos 是否运行正常,并且约束委派配置是否正确。

private void testImpersonation()
{
  string url = "http://testsvr7/reportserver/";

  System.Security.Principal.WindowsIdentity user =
    (System.Security.Principal.WindowsIdentity)Context.User.Identity;
  System.Security.Principal.WindowsImpersonationContext WICTX = null;

  StringBuilder results = new StringBuilder();

  try
  {
     if (user != null)
     {
        WICTX = user.Impersonate();
        results.AppendFormat("<br />Impersonating, user: {0}",   
             System.Security.Principal.WindowsIdentity.GetCurrent().Name);

        System.Net.HttpWebRequest myHttpWebRequest =
             (HttpWebRequest)WebRequest.Create(url);

        // Assign the credentials of the user being impersonated.
        myHttpWebRequest.Credentials = CredentialCache.DefaultCredentials;

        System.Net.HttpWebResponse myHttpWebResponse =
             (HttpWebResponse)myHttpWebRequest.GetResponse();

        results.AppendFormat("<br />Authentication successful - {0}, {1}",
             url, CredentialCache.DefaultCredentials);
     }
  }
  catch (Exception ex)
  {
     results.AppendFormat("<br />Exception: {0}", ex.Message);
  }
  finally
  {
     if (WICTX != null)
     WICTX.Undo();
  }
  Response.Write(results.ToString());

答案1

我相信我已经找到了解决方案 - 如果我将 system.webServer/security/authentication/windowsAuthentication 的 useAppPoolCredentials 属性设置为“true”,那么具有 NetworkService 的 AppPool 就可以与约束委派一起正常工作。

在 Windows Server 2008 和 2008 R2 上进行了测试。

我不确定这是为什么,而且我确实发现很难找到关于此设置的作用以及它如何影响这种情况的真正清晰的文档。您可以通过 2008 R2 上的 IIS 管理器中的配置编辑器为 IIS 设置此值。
或者使用以下命令(我发现对 2008(不是 R2)执行此操作的唯一方法):

%windir%\system32\inetsrv\appcmd set config "Default Web Site/MyApplication" /section:system.webServer/security/authentication/windowsAuthentication /useAppPoolCredentials:true /commit:MACHINE/WEBROOT/APPHOST

相关内容