从不在域上的客户端连接到域上托管的wcf服务

时间:2011-03-04 16:28:01

标签: wcf wcfserviceclient

我想要一个示例或解释,当客户端不在域上时,如何将客户端连接到wcf服务。

我想有一种方法可以指定客户端的域凭据,而wcf服务可以与权限(dc)通信,以查看客户端是否安全。

我按照msdn上的示例进行操作,可以连接查看元数据(可用的方法)但是当使用wshttpbinding时,我收到“从另一方收到了一个不安全或错误安全的错误”。

提前致谢!

3 个答案:

答案 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"