如何通过会话保护WCF服务?

时间:2011-04-24 11:32:24

标签: wcf web-services security authentication

我的忏悔:我是WCF的新手,我已经读过一些关于它的事情,但我已经掌握了不到一周的时间。

我希望通过会话保护我的WCF,这与网页相同,首先客户端需要标识自己,但是当它经过身份验证时,WCF服务会信任它直到会话超时。

由于该服务对时间至关重要,因此安全机制应尽可能小。

如上所述,我没有使用WCF的经验,所以我不知道我的想法是否可以完成,以及哪些机制在WCF中广泛使用。

非常感谢。

1 个答案:

答案 0 :(得分:2)

最佳做法是使用无会话服务,因为会话导致其他复杂性。

在您的情况下,可以使用由WS-SecureConversation,WS-Trust等提供的安全会话(安全上下文)来保护SOAP服务。在使用任何类型的WCF会话时,您必须重用相同的服务代理实例。会话存在于特定代理和服务实例之间。一旦这些死亡或连接出现任何错误,会话就会消失,您必须打开一个新的代理。

使用安全对话时,您需要将所需的凭据填入服务代理并运行您的通信。代理将这些凭证发送到服务,服务将创建一个安全令牌,用于后续通信。这个初始握手有一些额外的费用。以下通信由令牌保护。 WCF将此与消息级加密和签名结合使用,这会产生另外的额外成本。您可以关闭某些消息部分的加密和签名,但至少必须加密与身份验证相关的信息。

此类服务的基本配置如下:

<bindings>
  <wsHttpBinding>
    <binding name="secured">
      <security mode="Message">
        <message clientCredentialType="UserName" estabilishSecurityContext="true"
                 negotiateServiceCredentials="false" />
      </security>
    </binding>      
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="securedService">
      ...
      <serviceCredentials>
        <!-- Allows configuring how user name and password will be validated -->
        <userNameAuthentication ... />
        <!-- Message security with user name and password credentials requires service certificate -->
        <serviceCertificate ... />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service name="..." behaviorConfiguration="securedService">
    <endpoint address="" contract="..." binding="wsHttpBinding" 
              bindingConfiguration="secured" />
  </service>
</services>

这是在WCF中执行此操作的标准方法,其中安全性已集成到WCF安全管道。任何其他方法主要是绕过WCF安全管道或修改安全管道 - 这两种方法都需要大量的自定义开发。