1

我想要一个示例或说明当客户端不在域中时如何将客户端连接到 wcf 服务。

我想有一种方法可以使用客户端指定域凭据,并且 wcf 服务可以与权限 (dc) 对话以查看客户端是否安全。

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

提前致谢!

4

3 回答 3

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 安全指南站点上阅读有关 WCF 安全的所有信息。

于 2011-03-04T16:43:57.870 回答
0

您可以访问元数据而无法调用服务的原因是您使用 WsHttpBinding 可能是默认配置。它使用消息安全性,仅涉及服务使用 - 而不是服务元数据。它使用 Windows 凭据和 Windows 安全性来加密和签署消息。由于 Windows 安全性,它仅在客户端和服务器位于同一域中时才有效。

您的客户端不是域的一部分 - 您可以使用消息安全或传输安全发送 Windows 凭据。在消息安全的情况下,您必须使用clientCredentialType="UserName"默认密码验证器,并且您必须在服务行为中配置 X509 证书以支持加密和签名。在传输安全性的情况下,将使用 HTTPS(在 http.sys/IIS 中配置的 X509 证书)或TransportCredentialOnly将 Windows 用户名和密码作为纯文本通过 HTTP 发送的模式(这是不好的解决方案)。在运输安全设置的情况下clientCredentialType="Basic"

于 2011-03-04T16:45:13.657 回答
0

错误消息“从另一方收到不安全或不正确安全的故障”是一个相当具有误导性的消息。一个常见的原因是客户端和服务器之间的绑定配置不同。检查服务端 web.config 的 system.serviceModel 部分,并修改您的客户端设置以匹配。

于 2011-03-04T16:37:38.237 回答