5

我正在研究适用于 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 服务器上运行时模拟不起作用?

4

3 回答 3

4

我在这里找到了答案:

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

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

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

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

于 2012-06-21T08:18:09.130 回答
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");
}
于 2012-06-18T09:19:04.083 回答
1

您需要在 IIS 中正确配置您的站点才能使模拟工作。

请参阅配置 ASP.NET 模拟身份验证 (IIS 7)

于 2012-06-18T09:19:59.980 回答