【问题标题】:Impersonation in ASP.NET web application does not work when running on IIS在 IIS 上运行时,ASP.NET Web 应用程序中的模拟不起作用
【发布时间】:2012-06-20 05:37:08
【问题描述】:

我正在开发适用于 Intranet 环境的 ASP.NET 4.0 MVC3 Web 应用程序。该应用程序使用 Windows 身份验证。它的应用程序池由在域控制器上设置了 spn 的域用户运行。使用 Kerberos 进行身份验证(经过一些额外配置后在 IE 和 Firefox 上)。

现在我想将文件上传到 sharepoint,但在用户当前登录到应用程序时上传文件对我来说很重要(因此文件是使用他/她的凭据在 Sharepoint 上创建的)。

我在ResourceExists(Uri uri)函数中有如下代码:

'...
    Dim identity As System.Security.Principal.WindowsIdentity = HttpContext.User.Identity
    Dim impersonationContext = identity.Impersonate()
    response = request.GetResponse()
    impersonationContext.Undo()
'...

这在本地运行时有效,但是当我部署到服务器时出现异常:

System.Net.WebException: The remote server returned an error: (401) Unauthorized.\r\n   at WebDav.WebDavClient.ResourceExists(Uri uri)\r\n   at Website.Website.WebdavController.Upload(HttpPostedFileBase file, UploadViewModel vm)

我读到了一些关于传递凭据的信息,这在 NTLM 中是不可能的,但我确定我使用的是 Kerberos(我使用 wireshark 和 fiddler 检查了标头)并且我看到了以下内容:

Authorization: Negotiate YIIFpQYGKwYBBQUCoIIFmTCCBZWgJDAiBgkqhkiC9x...

任何想法为什么在 IIS 服务器上运行时模拟不起作用?

【问题讨论】:

    标签: asp.net-mvc-3 .net-4.0 windows-authentication impersonation kerberos


    【解决方案1】:

    我在这里找到了答案:

    http://support.microsoft.com/kb/810572

    “Kerberos 在负载平衡的体系结构中不起作用,IIS 退回到 NTLM 身份验证。由于您不能使用 NTLM 进行委派,因此任何需要委派的应用程序或服务都不起作用。有关详细信息,请单击以下文章编号在微软查看文章”

    情况正是如此。我现在尝试使用另一台没有负载平衡的机器,它可以工作。

    唯一让我感到惊讶的是,身份的 ImpersonationLevel 仍然是 Impersonate 而不是 Delegate...

    【讨论】:

      【解决方案2】:

      在您的 web.config 中设置 <identity impersonate="true"/> 后,尝试以下操作:

      using (((WindowsIdentity)User.Identity).Impersonate())
      using (var client = new WebClient { Credentials = CredentialCache.DefaultNetworkCredentials })
      {
          string result = client.DownloadString("http://sharepoint");
      }
      

      【讨论】:

      • 使用<identity impersonate="true"/>,我的应用程序始终以该用户身份运行。我不能允许这样。 Web 应用程序需要作为自定义域帐户运行,并且已经为此进行了配置。仅对于这一行代码,我需要以当前登录的用户身份访问网络资源,而不是作为运行应用程序的自定义域帐户。我在这里还是我错过了什么?我目前正在研究协议转换 (msdn.microsoft.com/en-us/library/ms998355.aspx) 我认为这适用于我的情况。你能确认一下吗?
      • 我必须使用 impersonate="true" 否则我会得到 ImpersonationLevel Identify。所以我将它与我想要运行应用程序的 DOMAIN\USER 的用户名和密码一起使用。
      【解决方案3】:

      您需要在 IIS 中正确配置您的站点才能进行模拟。

      Configure ASP.NET Impersonation Authentication (IIS 7)

      【讨论】:

      • 我有 IIS6。但无论如何,这只配置了web.config。我不要那个。我的应用程序需要以 DOMAIN\USER 身份运行,并且只有在我的应用程序中对外部资源的一些请求必须以登录用户的身份完成。我获得了 WindowsIdentity 并调用了 Impersonate(),但 CredentialCache 中没有凭据(它们都是空的...)
      • 我赞成这两个答案,因为它们包含需要完成的部分配置。就我而言,问题是负载均衡器...
      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多