避免为每个网络呼叫设置客户端凭据

问题描述

| 我现在正在使用安全性,必须在进行网络呼叫之前设置ClientCredentials。 这是重复性的事情,因为我有许多Web调用总是传递相同的确切信息。 有什么好的模式可以避免执行此类操作?     

解决方法

WCF实现WS-SecureConversation。这允许客户端仅传递一次凭据,随后的呼叫将自动使用客户端与服务之间的安全会话握手生成的安全令牌。在WCF中,这称为安全上下文或安全会话,通常默认情况下在“ 0”中处于打开状态。使用安全上下文时,必须遵循基本规则: 您的服务已按会话实例化,因此它是长期存在的服务实例,因此您必须处理与会话过期等有关的所有不利条件和问题。 安全会话是在单个客户端代理实例和服务实例之间创建的,因此只有在使用同一代理时,它才起作用。如果创建新代理,则必须再次发送凭据以启动安全对话。 由于建立了安全上下文,因此首次调用该服务的速度较慢。 如果您不遵循这种方法,则可以例如实现自定义SOAP标头和消息插入器,它们将在客户端包含标头,并在服务器端检查标头。该解决方案完全在WCF安全管道之外,不能与WCF中的通用用户名和密码结合使用。您还必须分别发送用户名和密码。 如果要在WCF管道中包括自定义解决方案,那么您会期望完成非常复杂的任务,因为将此类解决方案集成到WCF安全管道中需要自定义授权策略,cutom令牌,令牌管理器,令牌身份验证器,令牌解析器和客户端凭据。 但是据我所知,您不喜欢在每次通话前设置凭据-这意味着您正在为每次通话使用新的代理。因此,您将编写大量代码,这实际上将导致您无需为后续调用设置用户名和密码,但必须设置将在服务上验证的自定义令牌。您还必须在服务上管理这些令牌。 创建一些用于调用Web服务的包装程序来设置用户名和密码可能应该更容易。     ,好的模式是在授权后将会话令牌从服务发送到客户端,然后在每次调用时都将其发送,而不是使用凭据。