gpt4 book ai didi

asmx - 模拟和 CredentialCache.DefaultCredentials 给 HTTP 401 Unauthorized

转载 作者:行者123 更新时间:2023-12-01 01:37:48 25 4
gpt4 key购买 nike

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

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

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

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

现在我试图在一些初步测试中冒充自己。我对此的初步阅读告诉我这可能是一个大主题,但这是我为初学者所做的:
  • 在我的未选中“匿名访问”
    WebClient 的虚拟目录
    我的本地主机上的站点
  • 在我的 webclient 站点的 web.config 中,我建立了: authentication mode="Windows"和 identity impersonate="true"
  • 在我的 web 服务的 web 方法中,它必须调用远程服务,
    我改为:
    engineWSE.Credentials = System.Net.CredentialCache.DefaultCredentials;
  • 当使用这些调用远程 Web 服务时
    DefaultCredentials,我得到了
    以下错误:

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

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

    在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse
    (SoapClientMessage 消息、WebResponse 响应、流 responseStream、 bool asyncCall)

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

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

    最佳答案

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

    网站 A 调用服务 B 反过来调用服务 C 也是如此。

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

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

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

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

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

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

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

    还要记住,如果您想在从 NTLM 到 Kerberos 时限制停机时间,您应该首先修改 ApplicationHost,然后使用 SetSPN。您还可以在任何操作之前禁用协商并仅保留 NTLM,直到一切都设置好,然后,如果可能,仅启用协商(不启用 NTLM)。这应该会迫使客户修改他们访问您网站的方式。如果您不这样做,缓存机制似乎倾向于在 NTLM 上保留一段时间。

    希望这能有所帮助。如果您在配置 Kerberos 时仍有问题, WireShark是你最忠实的 friend 。您可以在以下页面中找到有关如何调试 Kerberos 的信息:
    - Debug Kerberos for a website
    - Debug AD problems with Kerberos (最大 token 大小就是其中之一)
    - Kerberos tools and other links
    - General network capture Kerberos debugging

    关于asmx - 模拟和 CredentialCache.DefaultCredentials 给 HTTP 401 Unauthorized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com