我有一个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服务 正常 。
现在我正在尝试冒充一些初步测试。我对此的初步阅读告诉我这可能是一个很大的主题,但这是我为初学者所做的:
UNCHECKED我的“匿名访问” WebClient的虚拟目录 我本地主机上的网站
在我的webclient网站的web.config中,我建立了:authentication mode =“Windows”和identity impersonate =“true”
在我的webservice的web方法中,必须调用远程服务, 我改为:
engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
使用这些来调用远程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)
我不确定我是否误解并试图过度简化“模拟”或者远程网络服务是否以某种方式连接到仅接受带有3个参数的凭证(即用户名,密码,域)。
答案 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,浏览器和其他可能的变量可能会改变应该使用的内容。我们的试验和错误表明如下:
请注意,如果没有专门设置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问题重复