在 IIS 上运行时,ASP.NET Web 应用程序中的模拟不起作用

Mic*_* B. 5 impersonation kerberos .net-4.0 windows-authentication asp.net-mvc-3

我正在开发适用于 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()
'...
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

Authorization: Negotiate YIIFpQYGKwYBBQUCoIIFmTCCBZWgJDAiBgkqhkiC9x...
Run Code Online (Sandbox Code Playgroud)

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

Mic*_* B. 4

我在这里找到了答案:

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

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

事实确实如此。我现在尝试使用另一台未负载平衡的机器并且它可以工作。

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