如何实现简单的WCF安全性

本文关键字:简单 WCF 安全性 实现 何实现 | 更新日期: 2023-09-27 18:21:13

我们有一个C#客户端应用程序,它通过WCF与我们的C#后端服务通信。我们希望确保对我们的服务进行的每个WCF调用都来自登录到我们客户端的用户,而不是通过某个知道如何调用我们的WCF服务的黑客。

我想有几种方法可以确保这一点。其中之一是让我们的后端Login方法返回某种令牌,然后每个客户端WCF调用都必须将其作为WCF调用的一部分传递。为了获得这样的令牌,调用者必须提供有效的登录凭据。然后,对于每个WCF调用,令牌都将在背面进行验证。如果无法验证令牌,WCF调用将失败。

我想要一个简单直接的方法来做这件事。我们不需要任何超级复杂和安全的东西。有人知道实现这一目标的标准方法吗?我们使用的是.NET 4。我应该补充一点,我对WCF没有太多的经验。

更多信息。我们有两个不同的客户端应用程序调用我们的WCF服务。一个是基于WPF的客户端,另一个是一个基于浏览器的应用程序(ASP.NET)。两者都是互联网范围的应用程序。我们的客户可以在世界任何地方。

如何实现简单的WCF安全性

实现这一点的最简单方法是使用具有以下配置的wsHttpBinding

<bindings>
  <wsHtttpBinding>
    <binding name="securitySession">
      <security mode="Message">
        <message clientCredentialType="UserName" 
                 establishSecurityContext="true"
                 negotiateServiceCredentials="false" />
      </security>
    </binding>
  </wsHttpBinding>
</binding>

此绑定使用安全会话配置状态完整服务。如果您的客户端为服务创建代理,它必须在内部执行的初始安全握手中传递用户名和密码。在握手过程中,WCF创建与安全令牌关联的服务实例。安全令牌被传递回客户端代理,代理将其存储在内部。来自同一代理实例的任何后续调用都包含该令牌,该令牌将对它们进行身份验证并将它们与正确的服务实例配对。

要使此配置在自定义环境中工作,您必须将您的服务配置为使用安全通信的证书(否则任何人都可以拦截通信和钢制用户名、密码或令牌)。您还必须在服务端使用自定义用户名和密码验证器(或ASP.NET成员身份)。

它如何适合您的解决方案

ASP.NET应用程序可以使用启动安全会话的服务使用自定义表单身份验证。在ASP.NET方面,您需要将代理保留在ASP.NET会话中,并且必须正确配置安全会话和ASP.NET会话的超时,以便ASP.NET会话在WCF安全会话之前过期。您将使用cookie为后续客户端调用接收正确的ASP.NET会话。

在WPF应用程序中,您可以使用相同的方法,并在每次运行应用程序时存储代理。您只需要确保代理不会超时,或者处理超时并再次登录用户。客户端计算机还必须信任您的服务使用的证书。

在WPF的情况下,您还可以避免安全会话,并使用establishSecurityContext="false"公开服务上的第二个端点。在这种情况下,用户名和密码将包含在WPF应用程序的每个调用中,您将不必与使用状态完整服务的长寿命代理相关的许多问题作斗争。如果没有安全上下文服务,您的WPF应用程序将是无状态的。您不想将其与ASP.NET一起使用的原因是,您必须在会话中存储用户名和密码。

此解决方案的缺点是什么

这是一个很重的解决方案。安全上下文提供了您正在寻找的功能,而无需任何编码,但它有自己的成本。您将不得不在ASP.NET应用程序中使用会话来维护WCF代理,您将拥有状态完全服务,这是您通常应该避免的事情,并且如果您希望应用程序中负载过重,则必须进行大量性能和内存调整。您必须控制会话是否正确释放,以及所有WCF代理是否正确关闭和释放,以便服务实例也被释放。您必须在WCF中使用节流功能,以支持足够多的并发运行的服务实例。

4年前,我成功地在重负载的面向互联网的web应用程序中使用了类似的方法,但我们花了一些时间来发现所有问题,正确配置所有超时,并正确处理所有对象的释放。

作为替代方案,您可以寻找一些联合场景,其中您将有一个额外的服务来处理身份验证并提供安全令牌,该令牌将用于对ASP.NET应用程序和WCF服务进行身份验证。我认为OAuth也应该处理这种情况。

我建议您使用具有基于证书的消息安全性的wsHttpBinding。请查看此处的演练:http://www.codeproject.com/Articles/28248/Securing-WCF-Services-with-Certificates(它适用于Windows Server 2003,但在较新的服务器上的过程没有太大区别)