2011-04-14 99 views
0

我现在正在使用安全性,并且必须在我的Web呼叫之前设置ClientCredentials。避免为每个Web呼叫设置客户端凭证

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

避免做这种事情的好方法是什么?

回答

2

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

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

如果你不遵循这一方法,您可以例如实现自定义的SOAP头和消息inspetor其中将包括在客户端头和检查服务器端的头。此解决方案完全位于WCF安全管道之外,不能与WCF中的通用用户名和密码组合。您也必须分别发送用户名和密码。

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

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

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

1

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

+0

知道一篇文章,证明这一点? – zachary 2011-04-14 18:35:41

+0

@zachary我们做得非常简单。我们所有的DataContract都来自某个具有该令牌的类。加上添加认证操作,将返回该令牌。 – Andrey 2011-04-14 18:55:47

+0

为了进一步阐明,通常会有一个登录和注销方法,并且登录返回令牌。 – 2011-04-14 20:01:09