如何从.Net 2.0客户端调用WCF服务时配置安全性

时间:2008-10-24 04:48:06

标签: wcf security .net-2.0

我启动并运行了WCF服务,并且能够使用basicHttpBinding在服务和.Net 2.0客户端之间进行通信。

我现在需要锁定WCF服务,以便只能由经过身份验证的客户端调用。

我可以控制将要调用我的服务的客户端。客户端是一个产品的一部分,将安装在野外和“打电话回家”推送和拉取数据。客户端应用程序是为.Net 2.0框架编写的,目前无法升级到3.0或3.5。我无法将Windows用户帐户添加到客户端计算机。

我有什么选择来保护WCF服务并能够从我的.Net 2.0客户端进行身份验证?此外,数据需要通过https传递。

我一直在网上搜索,感觉我正在疯狂追逐。

5 个答案:

答案 0 :(得分:10)

您可以将WCF端点配置为使用双向SSL身份验证。这意味着您可以要求客户出示X.509证书,以便在向服务提出请求时确认其身份。

在服务器端,您可以使用WCF中的一个内置验证方案,或者提供您自己的验证逻辑来​​检查X.509证书。
如果您在IIS中托管服务,则将SSL配置为需要传输级别的客户端证书将是微不足道的。但是,您可以在此处找到有关如何在自托管WCF服务中实现此行为的良好指南:

http://leastprivilege.com/2007/08/25/certificate-based-authentication-and-wcf-message-security/

我自己没有尝试过,但由于这会在消息级中创建安全性要求,我认为您必须使用 wsHttpBinding 来强制执行此操作您的WSDL合同,因为强制要求访问Web服务是WS- *标准的一部分。

如果您必须使用 basicHttpBinding ,您可以尝试使用此解决方案,以便在传输级别上移动:

http://leastprivilege.com/2007/08/26/certificate-based-authentication-and-wcf-mode-independent/

希望这有帮助

答案 1 :(得分:4)

好的,使用SSL,您可以获得传输级安全性;这很好,可以保护信息免受嗅探和改变。

所以现在你有选择;你需要验证是否保持沉默,或者你可以在程序启动时提示用户输入用户名/密码?如果它必须是静默的,那么你可以按照提到的那样获得客户端证书(尽管这很痛苦,你需要自己生成证书并验证它们,因此你需要看看运行自己的证书颁发机构)。或者,您可以在包含客户端ID的邮件中嵌入自定义标头,并以kludgey方式执行此操作。

但是,如果您可以提示输入用户名和密码,那么您可以使用custom authenticator或甚至使用ASP.NET membership database轻松地对该方式进行身份验证并将其插入数据库查找。

答案 2 :(得分:1)

以下是我最终做的事情,这似乎是我们情况下最简单的解决方案,这个规模非常小,只有少数几个Web服务暴露出来:

  1. 使用SSL保护传输
  2. 客户端首先通过调用Web服务上的Login方法登录Web服务。如果登录成功,则会将加密的FormsAuthenticationTicket返回给客户端。
  3. 然后,客户端必须为每个Web服务调用提供表单身份验证票证。每种方法都会检查故障单是否有效,如果是,则检查其是否有效。如果故障单已过期或无效,则客户端必须重新进行身份验证。
  4. 希望有人帮助......

答案 3 :(得分:0)

使用SSL证书是.NET 2.0客户端访问WCF服务的唯一选项,因为basicHttpBinding不提供安全性。通过使用SSL,您可以保护整个传输渠道。

检查链接http://www.codeplex.com/WCFSecurityGuide/Release/ProjectReleases.aspx?ReleaseId=15892。它涵盖了涵盖所有场景的WCF安全性。

要获得免费的SSL证书,请访问http://www.comodo.com/http://www.instantssl.com/并在您的申请中试用。

答案 4 :(得分:0)

您的安全性将由ssl覆盖。

对于身份验证,您有两个选项 - 基本(用户名和密码)或证书。

Here是一个演示配置证书身份验证的视频。

您正在配置basicHttpBinding的安全元素,如下所示:

< basicHttpBinding的>
     < binding name =“basicHttp”>
       < security mode =“TransportWithMessageCredential”>
         < message clientCredentialType =“Certificate”/>
       < /安全>
     < /结合>
   < / basicHttpBinding的>

here上还有一个很好的页面。谷歌在clientCredentialType上你很快就会发现自己走在正确的轨道上。

要设置客户端证书,请使用wse * policy文件。

您需要弄清楚如何向各个站点提供客户端证书.-这取决于项目的安全性问题。有各种各样的方式(我没有记住对不起,我最后做了这个,因为wse *大约两年前因为细节被遗忘了,但这肯定是可能的,花了几天时间进行了扎实的研究才找到一个好的方法)。