我有一个运行良好的WCF服务。
我现在需要为它添加安全性,在网上阅读了很多帖子后,我感到很困惑,因为有很多方法可以做。
我需要一个自定义用户名和密码验证器(我必须调用另一个Web服务才能知道用户是否获得授权)。 我还需要客户端和服务器之间的安全通信。
我目前正在使用basicHttpBinding。 MS建议在我的情况下使用NetTcpBinding(https://msdn.microsoft.com/en-us/library/ff648863.aspx#TransportSecurityWCF),但我不确定这是否可以保护?
我认为我最好使用WsHttpBinding来获取SSL:您认为此链接是否为我的案例提供了正确的解决方案? https://msdn.microsoft.com/en-us/library/ms733775.aspx?
感谢您的建议
答案 0 :(得分:1)
您可以使用BasicHTTPBinding进行SSL /传输加密。这不需要改变;您只需要设置具有“传输”安全性的主机端,添加一些代码和证书,您应该能够在不更改太多代码的情况下继续操作。我可以在下面添加一个小代码示例,因为我通过自托管服务尝试做同样的事情。
BasicHttpBinding b = default(BasicHttpBinding);
if (bUseSSL) {
//check for ssl msg credential bypass
if (bSSLMsgCredentialBypass) {
b = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);
} else {
b = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
}
b.TransferMode = TransferMode.Buffered;
b.MaxReceivedMessageSize = int.MaxValue;
b.MessageEncoding = WSMessageEncoding.Text;
b.TextEncoding = System.Text.Encoding.UTF8;
b.BypassProxyOnLocal = false;
//b.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
}
也可以完成身份验证/授权,而无需更改您当前拥有的内容。你真的有两个选择:
一个是您创建一个Login客户端首次访问主机时调用的函数。然后,您将一些令牌值发送回客户端以进行所有后续通信。
另一种方法是使用Dispatcher.IDispatchMessageInspector中的消息检查器功能和名为AfterReceiveRequest的公共函数创建自定义身份验证检查。在该函数中,您可以检查从客户端发送的UserID和Pwd(来自HTTP头数据中) - 但是您需要在客户端和主机端实现此功能,否则它不起作用。