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