WCF Windows身份验证无法与wsHttpBinding

时间:2017-08-16 21:14:53

标签: c# wcf authentication iis

问题是我无法使用wsHttpBinding进行Windows身份验证。

这是配置:

<services>
  <service name="WcfService1.Service1">
    <endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="testbinding">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

这是尝试调用方法时服务器的响应: HTTP请求未经授权使用客户端身份验证方案“Negotiate”。从服务器接收的认证头是'Negotiate oXMwcaADCgEBomoEaGBmBgkqhkiG9xIBAgIDAH5XMFWgAwIBBaEDAgEepBEYDzIwMTcwODE2MjA1MjQwWqUFAgMK8G2mAwIBKakOGwxDT1JQLlNBQUIuU0WqGjAYoAMCAQGhETAPGw1jb3JwYXBwbDU5ODgk'。 还有一个内部异常说: “目标主要名称不正确”

我已经在IIS中设置了一个新站点,用于测试目的,启用了Windows身份验证,其他所有功能都被禁用(我没有进行任何ASP模拟/双跳)。 Windows身份验证的提供商是Negotiate,Ntlm。启用内核模式身份验证。 应用程序池正在运行Active Directory服务帐户。 最终的目标是使用Kerberos进行身份验证,但由于它甚至不能与Ntlm一起使用,我还没有开始使用SPN以及那些让kerberos正常工作的东西。

如果我将应用程序池更改为使用“ApplicationPoolIdentity”而不是AD服务帐户运行,它确实有效吗? 我必须使用AD服务帐户运行应用程序池。

如果我将配置更改为:

<services>
  <service name="WcfService1.Service1">
    <endpoint address="" bindingConfiguration="hbinding" contract="WcfService1.IService1" binding="basicHttpsBinding"/>
  </service>
</services>
<bindings>
  <basicHttpsBinding>
    <binding name="hbinding">
      <security mode="Transport">
        <transport clientCredentialType="Windows"/>
      </security>
    </binding>
  </basicHttpsBinding>

它工作正常(保持AD服务帐户),为什么? 我不想使用basicHttpsBinding

我看到客户端配置文件(使用wcftestclient)的区别在于使用wshttp时它有:

  <identity>
      <userPrincipalName value="serviceaccount@contoso.com" />
  </identity>

这与此有关吗? (在这里疯狂地猜测)

端点是Windows Server 2012R2上的https,IIS 8。

2 个答案:

答案 0 :(得分:0)

很大程度上取决于您的域名设置方式,但您可以尝试不同类型的客户端凭据类型:

<services>
  <service name="WcfService1.Service1">
    <endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="testbinding">
      <security mode="Transport">
        <transport clientCredentialType="Ntlm"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

此外,使用wsHttpBinding,会在场景后面进行协商。因为关于该谈判的指导没有具体定义,所以有时候将其关闭是有道理的:

<services>
  <service name="WcfService1.Service1">
    <endpoint address="" bindingConfiguration="testbinding" contract="WcfService1.IService1" binding="wsHttpBinding"/>
  </service>
</services>
<bindings>
  <wsHttpBinding>
    <binding name="testbinding">
      <security mode="Transport">
        <message negotiateServiceCredential="false" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

必须存在Kerberos域才能使其正常工作。

答案 1 :(得分:0)

在客户端,生成的身份标签导致了问题

<identity>
  <userPrincipalName value="serviceaccount@contoso.com" />
</identity>

如果我清除它的值,它可以正常工作。 所以我在web.config中清除了该值。 我现在可以设置kerberos并且它也可以正常工作,也可以尝试设置servicePrincipalName标记。