Asp.net mvc 3 在IIS上运行时,ASP.NET web应用程序中的模拟不起作用

Asp.net mvc 3 在IIS上运行时,ASP.NET web应用程序中的模拟不起作用,asp.net-mvc-3,.net-4.0,windows-authentication,impersonation,kerberos,Asp.net Mvc 3,.net 4.0,Windows Authentication,Impersonation,Kerberos,我正在开发在intranet环境下工作的ASP.NET 4.0 MVC3 web应用程序。该应用程序使用Windows身份验证。其应用程序池由在域控制器上设置了spn的域用户运行。身份验证使用Kerberos工作(在IE和Firefox上进行一些额外配置后) 现在,我想将文件上载到sharepoint,但当用户当前登录到应用程序时,上载文件对我来说很重要(因此文件是使用其凭据在sharepoint上创建的) 我在ResourceExists(Uri)函数中有以下代码: '... Dim

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

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

我在
ResourceExists(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...
using (((WindowsIdentity)User.Identity).Impersonate())
using (var client = new WebClient { Credentials = CredentialCache.DefaultNetworkCredentials })
{
    string result = client.DownloadString("http://sharepoint");
}
您知道为什么在IIS服务器上运行时模拟不起作用吗?

在web.config中设置
后,请尝试以下操作:

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

您需要在IIS中正确配置站点,模拟才能正常工作


参见

我在这里找到了答案:

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

事实就是这样。我现在尝试使用另一台负载不平衡的机器,它可以工作


唯一让我感到惊讶的是身份的模拟级别仍然是
模拟
而不是
委托

,我的应用程序一直以该用户的身份运行。我不能允许这样。web应用程序需要作为自定义域帐户运行,并且已经为此进行了配置。仅对于这一行代码,我需要以当前登录用户的身份访问网络资源,而不是以运行应用程序的自定义域帐户的身份。我是在这里还是我错过了什么?我目前正在研究协议转换(),我认为这适用于我的情况。您能确认吗?我必须使用impersonate=“true”否则我将获得ImpersonationLevel
标识。因此,我将其与我想要运行应用程序的域\用户的用户名和密码一起使用。我有IIS6。但无论如何,这只配置web.config。我不想那样。我的应用程序需要以域\用户的身份运行,并且只有我的应用程序中的一些对外部资源的请求必须以登录用户的身份执行。我得到WindowsIdentity并调用Impersonate(),但CredentialCache中没有凭据(它们都是空的…)我对这两个答案都投了赞成票,因为它们包含了需要完成的部分配置。在我的例子中,问题是负载平衡器。。。