WCF:消息检查器中的身份验证/授权是一个好的设计吗?
WCF: Is Authentication / Authorization inside a message inspector a good design?
这个问题不是关于如何做某事的。一切正常。我想知道,是否 "ok" 在 WCF 消息检查器中执行身份验证/授权过程。
目前我正在使用 WPF 客户端和 self-hosted WCF 服务器开发 client/server 应用程序。使用的协议是 Net.Tcp,所有 SOAP 消息都是 AES256 message-encrypted 并签名。此外,所有发送的 SOAP message-headers 始终 message-encrypted 并已签名。
完整的认证过程是这样的:
- 服务器和客户端总是发送证书来相互验证
- 客户端收到它可以连接的所有端点的列表
- 客户端发送 User/Pass 进行身份验证并从 login-service
获取 session-id
- session-id、user-id 和所有与 user-id 关联的 user-rights 存储在单例服务中的 RAM 中,可用 system-wide在服务器应用程序中。
- 在第一次登录后的每个进一步请求中,客户端仅发送 session-id 和自定义 message-header 内的证书,不再发送 user/pass 组合。
情况:
在来自客户端的请求到达任何网络服务操作之前,消息检查器会读取 session-id 和请求的网络服务操作。然后它使用可用的 singleton-service 来确定 session-id 是否仍然有效以及关联的 user-id 是否有权执行此 Web 服务操作。如果不是,则抛出 fault-exception。
问题:
在 WCF 检查器中执行身份验证/授权过程是否有什么问题?
如果它能正常工作就不要破坏它:)但是为了回答你,我提出了一些见解供你考虑:
1- 对于不需要身份验证的服务操作,您必须更改检查器代码以将它们列入白名单。这与开闭原则相矛盾,在开闭原则中,您的 class 必须对扩展开放,对修改关闭。
2- 如果以后您决定修改您的身份验证机制并使用第三方组件,您将不得不彻底修改您的拦截器代码。
我通常使用 WCF 检查器将令牌和其他相关信息传递到我的服务 classes 中,我通常在其中实现横切关注点(验证、身份验证、授权、日志记录和异常处理)。当您将授权引擎注入您的服务时,您可以更轻松地首先在需要时交换该机制,然后在隔离您正在使用的任何身份验证机制的情况下对您的服务方法进行单元测试。
这个问题不是关于如何做某事的。一切正常。我想知道,是否 "ok" 在 WCF 消息检查器中执行身份验证/授权过程。
目前我正在使用 WPF 客户端和 self-hosted WCF 服务器开发 client/server 应用程序。使用的协议是 Net.Tcp,所有 SOAP 消息都是 AES256 message-encrypted 并签名。此外,所有发送的 SOAP message-headers 始终 message-encrypted 并已签名。
完整的认证过程是这样的:
- 服务器和客户端总是发送证书来相互验证
- 客户端收到它可以连接的所有端点的列表
- 客户端发送 User/Pass 进行身份验证并从 login-service 获取 session-id
- session-id、user-id 和所有与 user-id 关联的 user-rights 存储在单例服务中的 RAM 中,可用 system-wide在服务器应用程序中。
- 在第一次登录后的每个进一步请求中,客户端仅发送 session-id 和自定义 message-header 内的证书,不再发送 user/pass 组合。
情况:
在来自客户端的请求到达任何网络服务操作之前,消息检查器会读取 session-id 和请求的网络服务操作。然后它使用可用的 singleton-service 来确定 session-id 是否仍然有效以及关联的 user-id 是否有权执行此 Web 服务操作。如果不是,则抛出 fault-exception。
问题:
在 WCF 检查器中执行身份验证/授权过程是否有什么问题?
如果它能正常工作就不要破坏它:)但是为了回答你,我提出了一些见解供你考虑:
1- 对于不需要身份验证的服务操作,您必须更改检查器代码以将它们列入白名单。这与开闭原则相矛盾,在开闭原则中,您的 class 必须对扩展开放,对修改关闭。
2- 如果以后您决定修改您的身份验证机制并使用第三方组件,您将不得不彻底修改您的拦截器代码。
我通常使用 WCF 检查器将令牌和其他相关信息传递到我的服务 classes 中,我通常在其中实现横切关注点(验证、身份验证、授权、日志记录和异常处理)。当您将授权引擎注入您的服务时,您可以更轻松地首先在需要时交换该机制,然后在隔离您正在使用的任何身份验证机制的情况下对您的服务方法进行单元测试。