繁体   English   中英

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

[英]connecting to wcf service hosted on domain from a client that is not on the domain

我想要一个示例或说明,当客户端不在域中时如何将客户端连接到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> 
  • 在从客户端进行每次调用之前,您需要在客户端代理上设置用户名/密码(这是您无法在config中执行的少数操作之一-仅在代码中有效)。

     proxy.ClientCredentials.UserName.UserName = "YourUserName"; proxy.ClientCredentials.UserName.Password = "Top$Secret"; 

在Codeplex上的WCF安全指南网站上阅读有关WCF安全的所有信息。

错误消息“收到了来自另一方的不安全的或不正确的安全错误”,这是一个相当容易引起误解的错误消息。 一个常见的原因是客户端和服务器之间的绑定配置不同。 在服务端检查web.config的system.serviceModel部分,然后修改客户端设置以使其匹配。

您可以访问元数据而不能调用服务的原因是您正在使用WsHttpBinding,可能具有默认配置。 它使用仅涉及服务使用的消息安全性,而不涉及服务元数据。 它使用Windows凭据和Windows安全性对消息进行加密和签名。 由于Windows安全性,它仅在客户端和服务器都在同一域中时才起作用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM