English 中文(简体)
模拟和CredentialCache.DefaultCredentials赋予HTTP 401未经授权的权限
原标题:
  • 时间:2009-04-07 20:18:01
  •  标签:

我有一个ASMX web服务(在我的本地主机-WinXP IIS 5.1上),我从web客户端调用它。我的web服务必须使用另一个ASMX web服务(在Win 2003服务器IIS 6.0上)。

当我以“硬编码”的方式在Web服务代码中提供凭据时:

engineWSE.Credentials = new System.Net.NetworkCredential("myUser", "myPass", "myDomain");

…远程web服务的后续调用工作正常

现在,我正试图在一些初步测试中模仿自己。我对这一点的初步了解告诉我,这可能是一个很大的主题,但以下是我为初学者所做的工作:

  1. UNCHECKED "Anonymous access" in my virtual directory for the WebClient site on my localhost

  2. 在我的web客户端站点的web.config中,我建立了:身份验证模式=“Windows”,身份模拟=“true”

  3. in the webmethod of my webservice that has to call the remote service, I changed to:

    engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
  4. When the remote webservice gets invoked with these DefaultCredentials, I get the following error:

    System.Web.Services System.Web.Services.Protocols.SoapException: Server was unable to process request.--->

    System.Net.WebException:请求失败,HTTP状态为401:未授权。

    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse (SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)

    位于System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object[]参数)

我不确定我是否误解并试图过度简化“模拟”,或者远程Web服务是否以某种方式连接到只接受带有3个参数(即用户名、密码、域)的凭据。

问题回答

正如@Michael Levy所说,这是一个双跳问题。这意味着,除非您配置Kerberos(协商),否则NTLM可能会在运行IIS的windows环境中使用,如果机器a上有浏览器的客户端尝试访问机器B上的网站,则可以访问该站点,但是,当该站点尝试联系机器C上的服务时,应使用池凭据。

对于呼叫服务B的网站A也是如此,而服务B又呼叫服务C。

为网站配置Kerberos时,应考虑多种因素。首先是要知道它是否是一个农场。如果是,则必须为服务器场的所有计算机部分的池定义一个通用用户。这是必需的,因为Kerberos使用域名来标识用于加密安全令牌的主体。如果您在同一服务器场的不同计算机上有不同的用户,由于他们都将通过同一域名访问,因此所有请求都将搜索同一条目。更多详细信息可在Kerberos和负载平衡

例如,假设您有一个以myApp.intranet为URL的网站。在AD中,您会将SPN设置为,例如,域MyDomain中的myUser(setspn-S MyDomainmyUser HTTP/myapp.intranet)。当请求发送到KDN时(有关KDN上的更多信息,请参阅末尾的kerberos链接),它将始终返回用myUser加密的令牌,但IIS将尝试用不同的用户对其进行解密。为同一服务(HTTP/myapp.intranet)创建多个SPN可能很诱人,但这会导致KRB出错。

此外,如果您在IIS 7+上,如果您想保持启用内核模式身份验证(强烈建议),则必须在ApplicationHost.config中设置一些详细信息:useAppPoolCredentials=true。必须在configurationsystem.webServersecurityauthenticationwindowsAuthentication上设置此值。这是因为默认情况下,内核模式身份验证将使用计算机帐户,而不是池帐户,这将使我们回到多用户场景。

在所有情况下,信任此用户…必须启用AD主体的委派选项卡的委派才能工作。然后,您必须决定是使用常规委派还是限制委派。

正如我前面所说,您还必须为正确的用户和正确的服务设置SPN。用户很容易识别sinc,它将是您在池中定义的sinc,但根据您的配置,服务可能会变得有点棘手。DNS、浏览器和可能的其他变量可能会改变应该使用的内容。我们的试验和错误显示如下:

  • If your DNS entry is an A entry, you use it directly
  • If your entry is a CName, in our tests, it used the A entry associated with it
  • We have had cases where the CName would be used and it seemed to be related to the version of the browser.

请注意,如果没有专门设置SPN,并且您通过NetBIOS名称访问您的网站,则会请求HTTP/机器服务,并且默认情况下,HOST服务(搜索额外的)可以代替HTTP使用,因此可以使用HOST/machine。这对于在小型网络上轻松配置非常有用。

还需要记住的是,如果您想在从NTLM转换为Kerberos时限制停机时间,则应首先修改ApplicationHost,然后使用SetSPN。您也可以在执行任何操作之前禁用协商,只保留NTLM,直到设置好所有内容,然后,如果可能,只启用协商(不启用NTLM)。这应该会迫使客户修改他们访问您网站的方式。如果不这样做,缓存机制似乎会在一段时间内保持NTLM。

Hoping this can help. If you still have problem configuring Kerberos, WireShark is your most faithful friend. You can find information on how to debug Kerberos in the following pages: - Debug Kerberos for a website - Debug AD problems with Kerberos (max token size is one of them) - Kerberos tools and other links - General network capture Kerberos debugging

你有没有使用netmon或wireshark来确保证书通过?服务提供商的日志告诉你什么?此外,请确保在web.config(或其他.config)中没有配置模拟标记。

编辑:

可能是HostingEnvironment.Impersonate()块,它默认使用应用程序池的标识,或者您传递给它的任何用户令牌的标识。

这是典型的双跳问题-除非在域中正确配置了Kerberos委派,否则无法使用通过模拟获得的用户凭据访问另一台服务器。这个问题

根据以下MSDN文章,它不适用于HTTP和FTP保护。当您连接到远程服务器时,必须明确提供凭据。

@Michael Kniskern-使用HTTP当然是可能的。模拟功能将凭据从ASP.Net应用程序传递到IIS。使用集成Windows身份验证,将使用最终用户的凭据,而不是默认的ASPNET帐户(或附加到应用程序池的帐户)。我相信MSDN文章中提到的HTTP和FTP是针对DefaultNetworkCredentials的。





相关问题
热门标签