在我们的项目中,所有 WCF 服务都由 wsHttpBinding (TransportWithMessageCredential, UserName) 选项保护。
它工作得很好,但现在我们需要使用另外一个参数(ClientId)来实现安全性。
当 WCF 服务接到呼叫时,它不知道呼叫的数据库是什么(在哪里检查用户名和密码),所以首先它应该去我们公司的“主”数据库(所有客户端都存储在其中) 并通过 ClientId 获取连接字符串。
我们如何实现这一点?
在我们的项目中,所有 WCF 服务都由 wsHttpBinding (TransportWithMessageCredential, UserName) 选项保护。
它工作得很好,但现在我们需要使用另外一个参数(ClientId)来实现安全性。
当 WCF 服务接到呼叫时,它不知道呼叫的数据库是什么(在哪里检查用户名和密码),所以首先它应该去我们公司的“主”数据库(所有客户端都存储在其中) 并通过 ClientId 获取连接字符串。
我们如何实现这一点?
我用MessageInspectors解决了类似的问题。基本上,您创建一个IClientMessageInspector
将客户端 ID 添加到消息标头中,并IDispatchMessageInspector
从该标头中读取客户端 ID,并将其存储在适当的位置(如IPrincipal
set as 的自定义实现Thread.CurrentPrincipal
)。
我过去通过使用特殊格式的用户名字符串来实现这一点,以允许发送额外的信息。关于如何通过这些字符串字段中的用户名和密码进行发送没有任何规则,因此内容实际上可以是序列化对象、压缩字符串或您认为必要的任何内容。
我找不到任何其他方式来优雅地发送信息。
只需在您的 AuthorizationPolicy 实现中解析该信息即可。