2008-10-24 85 views
15

我有一个WCF服务已启动并正在运行,并且能够使用basicHttpBinding在服务和.Net 2.0客户端之间进行通信。如何从.Net 2.0调用WCF服务时配置安全性客户端

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

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

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

我一直在寻找网络,感觉就像我在一个疯狂的追逐。

回答

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/并在您的应用程序中尝试。

+0

因此,SSL将确保运输,我明白了。但是,认证呢?我找不到任何人发现它的服务。我可以使用“魔术串”方法,但这并不理想。 – JasonS 2008-10-24 05:13:42

0

您的安全将由ssl覆盖。

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

Here是一个演示配置证书认证的视频。

在所配置的basicHttpBinding的的安全元件如下所示:

< basicHttpBinding的>
    <绑定名称= “basicHttp”>
        <安全模式= “TransportWithMessageCredential” >
            <消息clientCredentialType = “证书”/>
        < /安全>
    < /结合>
</basicHttpBinding的>

也有这个here一个良好的网页。谷歌在clientCredentialType,你应该很快找到自己的正确轨道。

用于设置wse *策略文件后面的客户端证书。

您需要弄清楚您将如何向各个站点提供客户端证书。这取决于项目的安全问题。有各种各样的方式(我没有记得对不起,我上次在大约两年前做过这样的事情),所以细节被遗忘了,但它肯定是可能的,花了几天的实质研究找到一个好方法)。

+0

第二个链接无效......它有脚本错误,不会让我查看整篇文章。 – LamonteCristo 2011-04-08 14:06:27

+0

Chrome和IE虽然没有让我......我通过主页登录,并刷新...没有运气。当我刚刚搜索了带我到这里的介绍性句子时,它终于奏效:http://www.devx.com/codemag/Article/33342/1763感谢我现在的工作。 – LamonteCristo 2011-04-08 14:42:20

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/

希望这有助于

4

行,所以,使用SSL你有运输级别的安全;这很好,可以保护消息免受嗅探和改变。

所以现在你有选择;你需要验证才能保持沉默,或者当你的程序启动时你能提示用户输入用户名/密码吗?如果它必须保持沉默,那么你可以像上面提到的那样使用客户端证书(虽然这很痛苦,但你需要自己生成证书并验证它们,所以你需要考虑运行你自己的证书颁发机构)。或者,您可以在包含客户端ID的消息中嵌入自定义标题,并以kludgey的方式执行此操作。

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

1

这里是我最终做这似乎是在我们的情况最简单的解决方案,这是非常小的规模仅露出少数的网络服务:

  1. 采用SSL安全传输
  2. 客户首先通过调用Web服务上的登录方法登录到Web服务。如果登录成功,则会向客户端返回一个加密的FormsAuthenticationTicket。
  3. 客户端必须随每个Web服务调用提供表单身份验证票证。每种方法都会检查票证是否有效,如果是,它会执行其工作。如果故障单已过期或无效,则客户机必须重新进行认证。

希望帮助别人......