我想要一个示例或解释,当客户端不在域上时,如何将客户端连接到wcf服务。
我想有一种方法可以指定客户端的域凭据,而wcf服务可以与权限(dc)通信,以查看客户端是否安全。
我按照msdn上的示例进行操作,可以连接查看元数据(可用的方法)但是当使用wshttpbinding时,我收到“从另一方收到了一个不安全或错误安全的错误”。
提前致谢!
答案 0 :(得分:1)
默认情况下,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 Security Guidance站点上阅读有关WCF安全性的所有信息。
答案 1 :(得分:0)
错误消息“从另一方收到无担保或错误安全的故障”是一个相当误导的错误消息。常见原因是客户端和服务器之间的绑定配置不同。检查服务端web.config的system.serviceModel部分,并修改您的客户端设置以匹配。
答案 2 :(得分:0)
您可以访问元数据而无法调用服务的原因是您使用的WsHttpBinding可能具有默认配置。它使用仅用于服务使用的消息安全性 - 而不是服务元数据。它使用Windows凭据和Windows安全性来加密和签名消息。由于Windows安全性,它仅在客户端和服务器位于同一域时才起作用。
您的客户端不属于域 - 您可以使用邮件安全性或传输安全性发送Windows凭据。如果是邮件安全性,则必须使用clientCredentialType="UserName"
,默认密码验证程序,并且必须在服务行为中配置X509证书以支持加密和签名。在传输安全的情况下,安全性将使用HTTPS(在http.sys / IIS中配置的X509证书)或TransportCredentialOnly
模式,它将通过HTTP发送Windows用户名和密码作为纯文本(这是不好的解决方案)。如果传输安全设置为clientCredentialType="Basic"
。