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

Posted

技术标签:

【中文标题】从 .Net 2.0 客户端调用 WCF 服务时如何配置安全性【英文标题】:How to configure security when calling WCF Service from .Net 2.0 Client 【发布时间】:2010-09-18 22:49:18 【问题描述】:

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

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

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

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

我一直在网上搜索,感觉就像是在追逐野鹅。

【问题讨论】:

【参考方案1】:

您可以将 WCF 端点配置为使用 2-way 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/

希望对你有帮助

【讨论】:

【参考方案2】:

好吧,有了 SSL,您就拥有了传输级别的安全性;这很好,可以保护消息不被嗅探和更改。

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

但是,如果您可以提示输入用户名和密码,那么您可以通过这种方式进行身份验证,并使用custom authenticator 或什至使用ASP.NET membership database 很容易地将其插入数据库查找中。

【讨论】:

+1 指出还可以在 WCF 中使用 ASP.NET 成员资格提供程序模型进行自定义身份验证。对于授权,您还可以使用 ASP.NET 角色提供程序。【参考方案3】:

这是我最终做的事情,这似乎是在我们的情况下最简单的解决方案,它的规模非常小,只暴露了少数 Web 服务:

    使用 SSL 保护传输 客户端首先通过调用 Web 服务上的 Login 方法登录到 Web 服务。如果登录成功,它会向客户端返回一个加密的 FormsAuthenticationTicket。 然后,客户端必须为每个 Web 服务调用提供表单身份验证票证。每种方法都会检查票证是否有效,如果有效,它就会工作。如果票证已过期或无效,客户必须重新进行身份验证。

希望对某人有所帮助...

【讨论】:

【参考方案4】:

您的安全将由 ssl 覆盖。

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

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

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

安全>绑定>

here 上也有一个不错的页面。在 clientCredentialType 上谷歌,你应该很快就会发现自己走上了正确的轨道。

要在 wse* 策略文件之后设置客户端证书。

您需要确定如何将客户端证书提供给各个站点。这取决于项目的安全问题。有多种方法(我都不记得对不起,我上次为 wse* 到 wse* 做这个大约是在两年前所以细节忘记了,但肯定有可能,花了几天的时间研究找到一个好的方法)。

【讨论】:

第二个链接无效...它有一个脚本错误,不允许我查看整篇文章。 Chrome 和 IE 并没有让我...我通过主页登录,然后刷新...没有运气。当我刚刚搜索带我来到这里的介绍性句子时,它终于奏效了:devx.com/codemag/Article/33342/1763Thanks am working now。 @makerofthings 多么奇怪——Chrome 和 IE 都可以在我的机器上运行。不过,您的评论应该可以帮助遇到同样问题的其他人。【参考方案5】:

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

【讨论】:

所以,SSL 将保护传输,我明白了。但是,身份验证呢?我无法让任何找到它的人调用该服务。我可以使用“魔术字符串”方法,但这并不理想。

以上是关于从 .Net 2.0 客户端调用 WCF 服务时如何配置安全性的主要内容,如果未能解决你的问题,请参考以下文章

从 .Net 2.0 使用 ClientCredentialType="UserName" 的 WCF 服务

从 .NET 2.0 客户端调用 Web Api 服务

从服务内的 JavaScript HTML 调用 WCF 服务

无法从 C++ 调用 .Net 服务

在 .NET Core 2.0 中使用 WCF 服务

从客户端调用 WCF 服务