避免为每个Web调用设置客户端凭据

时间:2011-04-14 18:04:37

标签: .net wcf web-services

我现在正在使用安全性,我必须在网络电话之前设置ClientCredentials。

这是一个重复的事情,因为我有很多网络电话总是传递相同的东西。

避免不得不做这种事情的好模式是什么?

2 个答案:

答案 0 :(得分:2)

WCF实现WS-SecureConversation。这允许客户端仅传递一次凭据,后续调用自动使用客户端和服务之间的安全对话握手生成的安全令牌。在WCF中,这称为安全上下文或安全会话,默认情况下它通常在wsHttpBinding中打开。使用安全上下文时,您必须遵循基本规则:

  • 您的服务因为每个会话实例化,因此它是长生活服务实例,您必须处理与会话到期等相关的所有缺点和问题。
  • 在单个客户端代理实例和服务实例之间创建安全会话,因此仅当您使用相同的代理时它才有效。如果您创建新代理,则必须再次发送凭据以启动安全对话。
  • 由于建立安全上下文,第一次调用服务的速度较慢。

如果不遵循这种方法,您可以实现自定义SOAP标头和消息检查器,它将在客户端包含标头并检查服务器端的标头。此解决方案完全在WCF安全管道之外,不能与WCF中的常用用户名和密码组合。您还必须单独发送用户名和密码。

如果要在WCF管道中包含自定义解决方案,您可以期待非常复杂的任务,因为将此类解决方案集成到WCF安全管道需要自定义授权策略,cutom令牌,令牌管理器,令牌验证器,令牌解析器和客户端凭据。

但据我了解您的问题,您不喜欢在每次通话前设置凭据 - 这意味着您正在为每次通话使用新代理。因此,您将编写大量代码,这将导致您不需要为后续调用设置用户名和密码,但您必须设置将在服务上验证的自定义令牌。您还必须在服务上管理这些令牌。

创建一些用于调用Web服务的包装器可能更容易,它将设置用户名和密码。

答案 1 :(得分:1)

良好的模式是在授权后将会话令牌从服务发送到客户端,然后在每次调用而不是凭据时发送它。