wsHttpbinding与TransportWithMessageCredential和Windows身份验证

时间:2014-09-10 08:53:53

标签: windows-authentication wshttpbinding transport-security

我有一个IIS托管的WCF服务,其中包含以下绑定配置(我从空间绑定中删除了所有属性),用于wsHttpBinding和TransportWithMessageCredential

   <wsHttpBinding>
    <binding name="BindingName" .../>
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>   

服务行为:

  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceCredentials>
       <userNameAuthentication userNamePasswordValidationMode="Windows" />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>

禁用匿名身份验证并启用Windows身份验证。

在客户端,使用有效的Windows用户和密码设置凭据,但每次调用该服务时都会出现以下异常:

  

HTTP请求未经授权使用客户端身份验证方案   &#39;匿名&#39 ;.从服务器收到的身份验证标头是   &#39;协商,NTLM&#39 ;. ---&GT;   System.ServiceModel.Security.MessageSecurityException:HTTP   请求未经授权使用客户端身份验证方案&#39; Anonymous&#39;。   从服务器收到的身份验证标头是   &#39;协商,NTLM&#39 ;. ---&GT; System.Net.WebException:远程服务器   返回错误:(401)未经授权。

使用自托管版本的WCF服务,它可以在有效的Windows帐户下正常运行。

感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

在IIS中启用Windows身份验证要求在传输层上提供凭据,而您的配置定义在消息层进行身份验证

要解决此问题,您需要执行以下操作之一

1)在IIS中启用匿名访问,因为身份验证将在消息层处理

2)将您的安全模式更新为传输

<wsHttpBinding>
    <binding name="BindingName" .../>
      <security mode="Transport">
        <transport clientCredentialType="Ntlm" />
      </security>
    </binding>
  </wsHttpBinding>