模拟和CredentialCache.DefaultCredentials提供HTTP 401 Unauthorized

时间:2009-04-07 20:18:02

标签: asmx impersonation credentials

我有一个ASMX Web服务(在我的localhost上 - WinXP IIS 5.1),我从webclient调用。我的web服务必须使用另一个ASMX Web服务(在Win 2003服务器IIS 6.0上)。

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

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

...后续调用远程Web服务 正常

现在我正在尝试冒充一些初步测试。我对此的初步阅读告诉我这可能是一个很大的主题,但这是我为初学者所做的:

  1. UNCHECKED我的“匿名访问” WebClient的虚拟目录 我本地主机上的网站

  2. 在我的webclient网站的web.config中,我建立了:authentication mode =“Windows”和identity impersonate =“true”

  3. 在我的webservice的web方法中,必须调用远程服务, 我改为:

    engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
  4. 使用这些来调用远程Web服务时 DefaultCredentials,我明白了 以下错误:

    System.Web.Services System.Web.Services.Protocols.SoapException:服务器无法处理请求.--->

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

    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse    (SoapClientMessage消息,WebResponse响应,Stream responseStream,布尔asyncCall)

    at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object [] parameters)

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

5 个答案:

答案 0 :(得分:2)

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

网站A呼叫服务B也是如此,后者又呼叫服务C.

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

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

此外,如果您使用的是IIS 7+,则必须在ApplicationHost.config中设置一些细节(如果您要保持启用内核模式身份验证(强烈建议)):useAppPoolCredentials = true 。必须在configuration \ system.webServer \ security \ authentication \ windowsAuthentication上设置此值。这是因为默认情况下,Kernel-mode auth will use the Computer account,而不是池帐户,这将使我们回到多用户场景。

在所有情况下,必须启用AD委托人的Trust this user for ... of the Delegation tab才能使委派工作。然后,您必须决定是否要使用一般约束或约束委派。

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

  • 如果您的DNS条目是A条目,则直接使用
  • 如果您的条目是CName,在我们的测试中,它使用了与之关联的A条目
  • 我们遇到了使用CName的情况,它似乎与浏览器的版本有关。

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

还要记住,如果要在从NTLM转到Kerberos时限制停机时间,则应首先修改ApplicationHost,然后使用SetSPN。您还可以禁用任何操作的协商,并且只保留NTLM直到所有设置完成,然后,如果可能,只启用协商(不使用NTLM)。这应该强制客户修改他们访问您网站的方式。如果你不这样做,缓存机制似乎倾向于保留NTLM一段时间。

希望这可以提供帮助。如果您仍然无法配置Kerberos,WireShark是您最忠实的朋友。您可以在以下页面中找到有关如何调试Kerberos的信息:   - Debug Kerberos for a website   - Debug AD problems with Kerberos(最大令牌大小是其中之一)   - Kerberos tools and other links   - General network capture Kerberos debugging

答案 1 :(得分:1)

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

编辑:

也许是一个HostingEnvironment.Impersonate()块 - 它默认使用应用程序池的标识,或者传递它的任何用户令牌的标识。

答案 2 :(得分:0)

根据以下MSDN article,它不适用于HTTP和FTP protcols。在建立与远程服务器的连接时,您必须明确提供凭据。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这是典型的双跳问题 - 除非在您的域中正确配置Kerberos委派,否则您无法使用通过模拟获得的用户凭据来访问其他服务器。 this问题重复