我想要一个示例或说明当客户端不在域中时如何将客户端连接到 wcf 服务。
我想有一种方法可以使用客户端指定域凭据,并且 wcf 服务可以与权限 (dc) 对话以查看客户端是否安全。
我按照 msdn 上的示例进行操作,可以连接以查看元数据(可用的方法),但是在使用 wshttpbinding 时,我得到“从另一方收到不安全或不正确安全的故障”。
提前致谢!
我想要一个示例或说明当客户端不在域中时如何将客户端连接到 wcf 服务。
我想有一种方法可以使用客户端指定域凭据,并且 wcf 服务可以与权限 (dc) 对话以查看客户端是否安全。
我按照 msdn 上的示例进行操作,可以连接以查看元数据(可用的方法),但是在使用 wshttpbinding 时,我得到“从另一方收到不安全或不正确安全的故障”。
提前致谢!
默认情况下,wsHttpBinding
将使用 Windows 凭据 - 这仅适用于您的服务和调用客户端都是同一域的成员(或具有相互信任关系的域的成员)。
如果您想使用用户名/密码进行身份验证,您需要做很多事情:
该服务需要一个证书来向调用者验证自己,并为交换用户名/密码和消息提供加密机制。因此,您需要创建一个安全证书并将其安装在服务器机器上,并对其进行配置:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Internet">
<serviceCredentials
findValue="MyServiceCertificate"
storeLocation="LocalMachine"
storeName="My"
X509FindType="FindBySubjectName" />
</behavior>
<serviceBehaviors>
<behaviors>
<services>
<service name="MyService" behaviorConfiguration="Internet">
......
</service>
</services>
</system.serviceModel>
客户端需要设置一个定义wsHttpBinding
消息安全性和用户名/密码客户端凭据的配置
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="UserNameWS">
<security mode="Message">
<message clientCredentialType="UserName" />
</security>
</binding>
<wsHttpBinding>
<bindings>
<client>
<endpoint name="Default"
address="........."
binding="wsHttpBinding" bindingConfiguration="UserNameWS"
contract="........." />
</client>
</system.serviceModel>
在服务器端,您需要设置一种机制来验证这些用户名/密码 - 通常,最简单的方法是使用 ASP.NET 会员系统
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Internet">
<userNameAuthentication
userNamePasswordValidationMode="MembershipProvider" />
<serviceCredentials
.....
</system.serviceModel>
在客户端每次调用之前,您需要在客户端代理上设置用户名/密码(这是您在配置中不能做的少数事情之一 - 仅在代码中有效)。
proxy.ClientCredentials.UserName.UserName = "YourUserName";
proxy.ClientCredentials.UserName.Password = "Top$Secret";
在 Codeplex 上的WCF 安全指南站点上阅读有关 WCF 安全的所有信息。
您可以访问元数据而无法调用服务的原因是您使用 WsHttpBinding 可能是默认配置。它使用消息安全性,仅涉及服务使用 - 而不是服务元数据。它使用 Windows 凭据和 Windows 安全性来加密和签署消息。由于 Windows 安全性,它仅在客户端和服务器位于同一域中时才有效。
您的客户端不是域的一部分 - 您可以使用消息安全或传输安全发送 Windows 凭据。在消息安全的情况下,您必须使用clientCredentialType="UserName"
默认密码验证器,并且您必须在服务行为中配置 X509 证书以支持加密和签名。在传输安全性的情况下,将使用 HTTPS(在 http.sys/IIS 中配置的 X509 证书)或TransportCredentialOnly
将 Windows 用户名和密码作为纯文本通过 HTTP 发送的模式(这是不好的解决方案)。在运输安全设置的情况下clientCredentialType="Basic"
。
错误消息“从另一方收到不安全或不正确安全的故障”是一个相当具有误导性的消息。一个常见的原因是客户端和服务器之间的绑定配置不同。检查服务端 web.config 的 system.serviceModel 部分,并修改您的客户端设置以匹配。