【问题标题】:WCF: The request for security token could not be satisfied because authentication failedWCF:由于身份验证失败,无法满足对安全令牌的请求
【发布时间】:2010-09-28 12:47:16
【问题描述】:
我编写了一个非常简单的 WCF 服务来发送和接收消息。我已经通过 VS 2008 默认 Web 服务器主机测试了该应用程序,一切正常。但是当我将 WCF 服务部署到另一台计算机的 IIS 时,我收到以下错误:
“由于身份验证失败,无法满足对安全令牌的请求。”
如何设置身份验证类型以在配置文件中使用我的自定义用户名和密码?
如果不可能,请告诉我如何设置其 Windows 凭据,因为我使用的两台计算机不共享相同的用户。
【问题讨论】:
标签:
wcf
wcf-authentication
【解决方案1】:
您需要关闭绑定的安全性。否则,我相信默认情况下,wsHttpBinding 会尝试协商一个安全上下文令牌 (SCT)。
因此,修改端点定义以指向绑定配置部分。这是一个例子:
<endpoint address=""
binding="wsHttpBinding"
contract="HelloWorldService.IService1"
bindingConfiguration="TheBindingConfig">
然后在 web.config 的 <system.serviceModel> 部分中的 <services> 部分之后添加类似以下绑定配置的内容。
<bindings>
<wsHttpBinding>
<binding name="TheBindingConfig">
<security mode="None" />
</binding>
</wsHttpBinding>
</bindings>
将安全设置为“无”是关键。
希望这有帮助!
以上内容帮助了我 - 但不是立即显而易见的是如何添加到 service 端(一旦你完成了所需的内容,它就很清楚了,但直到你这样做了) .它不完全明显的原因是因为默认情况下没有绑定部分,而客户端中可能有一个。
所以,要非常清楚 - 在服务端,添加绑定部分(如上所述),然后向适当的端点添加 bindingConfiguration="TheBindingConfig" 属性。一旦你做过一次就很明显......
【解决方案2】:
您实际上不需要关闭安全性,在某些情况下也不应该。在 bindingConfiguration 中,您可以指定不建立安全上下文的消息级安全性,如下所示:
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="false" />
</security>
注意建立安全上下文属性。客户端和服务都应具有将建立安全上下文设置为相同值的安全配置。值 true 也可以正常工作,但建议在服务器负载平衡的环境中使用 false。
【解决方案3】:
请务必在客户端和服务器上设置此bindingConfiguration(指定安全模式'none'),否则您将收到此消息 - 就调试而言,这是一个相当红的鲱鱼问题。
无法处理该消息。
这很可能是因为该操作
'http://tempuri.org/IInterfaceName/OperationName'
不正确或因为消息
包含无效或过期的
安全上下文令牌或因为
绑定之间不匹配。
安全上下文令牌将是
如果服务中止,则无效
由于不活动而导致的频道。阻止
中止空闲的服务
会议过早地增加
接收服务超时
端点的绑定。
【解决方案4】:
如果您处于调试模式,则将调试属性设置为
<serviceDebug includeExceptionDetailInFaults="true"/>
默认情况下它设置为 false ..所以当您进行调试时它会抛出该异常。
希望对你有帮助。