通过Windows身份验证的代理调用WCF Web服务时出现错误407

时间:2010-06-29 18:18:28

标签: wcf proxy

我有以下设置:

  1. 运行WCF服务的服务器计算机通过需要Windows身份验证的IIS应用程序公开。
  2. 需要Windows身份验证的代理服务器(Squid)。
  3. 运行Windows服务的客户端计算机,它尝试通过代理服务器建立与WCF服务的连接。该服务使用域帐户凭据设置。
  4. 所有计算机都在同一个域中。 如果我从设置中删除代理并在客户端安全绑定上仅设置以下属性,则一切正常:

    1. SecurityMode = TransportCredentialOnly
    2. Transport.ClientCredentialType = Windows
    3. 成功建立连接,并将正确的凭据传递给服务器。

      如果我添加代理但在代理服务器上删除了所需的Windows身份验证,那么一切正常。我在安全绑定上更改的唯一设置是:

      ProxyAddress = http://myproxyserver:3128

      我可以看到呼叫通过代理服务器使用正确的凭据。

      问题是,当我在代理服务器上设置Windows身份验证要求时,代理服务器返回407错误。当我检查日志文件时,我可以看到没有第二次尝试使用正确的凭据响应407错误。我添加的设置是:

      Transport.ProxyCredentialType = Windows

      我尝试过但没有用的东西:

      1. 设置UseDefaultProxy - 由于这是Windows服务,因此它不接受默认代理。
      2. 在ClientCredentials.Windows(包括域)中手动设置Windows凭据。
      3. 在app.config和machine.config中添加默认代理。
      4. 有关正在发生的事情以及如何解决问题的任何想法?

1 个答案:

答案 0 :(得分:0)

可能是问题的两件事。首先,我无法确定这一点,因为我没有尝试使用TransportCredentialOnly,的Windows凭据,因为传输安全性往往是点对点的。这意味着中间服务(如代理)必须对您的传输凭据本身进行身份验证,并重新建立相应的凭据,以便将请求重复到真实端点。同样,我不确定它如何与Windows凭证一起工作......但鉴于它是传输级安全设置,我怀疑它是否可以通过代理而无需额外设置以确保代理重复相应的凭据。 (请记住,这样做会有效地使您在代理处的安全性无效......在受控设置中这不是问题,但可以在现实世界中。)

其次,绑定配置的transport元素的security子元素应该具有proxyCredentialType设置。如果您的代理干扰了您的安全性,您可能需要针对代理本身进行身份验证。 proxyCredentialType设置定义用于对代理本身进行身份验证的代理凭据类型。然后,您需要在发送邮件之前提供代理凭据。