WCF:无法满足安全令牌请求,因为身份验证失败

时间:2008-12-27 09:19:30

标签: wcf wcf-authentication

我编写了一个非常简单的WCF服务,用于发送和接收消息。我已经通过VS 2008默认Web服务器主机测试了应用程序,一切正常。但是,当我将WCF服务部署到另一台计算机的IIS时,我收到以下错误:

“无法满足安全令牌请求,因为身份验证失败。”

如何设置身份验证类型以在配置文件中使用我的自定义用户名和密码? 如果不可能,请告诉我如何设置其Windows凭据,因为我使用的2台计算机不共享相同的用户。

4 个答案:

答案 0 :(得分:31)

您需要关闭绑定的安全性。否则,我相信,默认情况下,wsHttpBinding将尝试协商安全上下文令牌(SCT)。

因此,修改端点定义以指向绑定配置部分。这是一个例子:

<endpoint address="" 
          binding="wsHttpBinding" 
          contract="HelloWorldService.IService1"
          bindingConfiguration="TheBindingConfig">

然后在web.config的<services>部分的<system.serviceModel>部分后面添加类似以下绑定配置的内容。

<bindings>
  <wsHttpBinding>
    <binding name="TheBindingConfig">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

将安全性设置为“无”是关键。

希望这有帮助!


以上对我有所帮助 - 但是不明显的是如何添加到服务结束(一旦你完成它所需要的就明确了,但直到你这样做) 。其不完全明显的原因是因为默认情况下没有绑定部分,而客户端中可能存在绑定部分。

所以,只是要非常清楚 - 在服务端,添加绑定部分(如上所述),然后添加到bindingSfiguration =“TheBindingConfig”属性的相应端点。一旦你完成它就明显了......

答案 1 :(得分:20)

您实际上并不需要关闭安全性,在某些情况下您不应该这样做。在bindingConfiguration中,您可以指定不建立安全上下文的消息级安全性,如下所示:

<security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
                        realm="" />
    <message clientCredentialType="Windows" negotiateServiceCredential="true"
        algorithmSuite="Default" establishSecurityContext="false" />
</security>

请注意establishSecurityContext属性。客户端和服务都应该具有安全配置,并将establishSecurityContext设置为相同的值。值true也可以正常工作,但建议在服务器负载平衡的环境中使用false。

答案 2 :(得分:12)

请务必在 客户端和服务器上设置此bindingConfiguration(指定安全模式“无”),否则您将收到此消息 - 这是一个非常红色的鲱鱼调试问题。

  

无法处理邮件。   这很可能是因为这个动作   'http://tempuri.org/IInterfaceName/OperationName'   不正确或因为消息   包含无效或过期   安全上下文令牌或因为   绑定之间存在不匹配。   安全上下文令牌将是   如果服务中止,则无效   由于不活动而导致频道。阻止   中止闲置的服务   会议过早地增加了   接收服务超时   端点的绑定。

答案 3 :(得分:0)

如果您处于调试模式,则将调试属性设置为

<serviceDebug includeExceptionDetailInFaults="true"/>

默认情况下,它设置为false ..so,当你进行调试时,它会抛出异常。

希望它有所帮助。