WCF 自托管 HTTPS 与自定义 UserNamePasswordValidator

WCF self hosted HTTPS with custom UserNamePasswordValidator

我有一个 WCF 服务运行很好。

我现在需要为其增加安全性,在阅读了互联网上的大量帖子后,我感到困惑,因为有很多方法可以做到。

我需要一个自定义的用户名和密码验证器(我将不得不调用另一个网络服务来了解用户是否被授权)。 我还需要客户端和服务器之间的安全通信。

我目前正在使用 basicHttpBinding。 MS 建议在我的案例中使用 NetTcpBinding (https://msdn.microsoft.com/en-us/library/ff648863.aspx#TransportSecurityWCF),但我不确定这是否安全?

我想我最好使用 WsHttpBinding 来获得 SSL:您认为这个 link 是否为我的案例提供了适当的解决方案? https://msdn.microsoft.com/en-us/library/ms733775.aspx ?

感谢您的建议

您可以使用 BasicHTTPBinding 进行 SSL/Transport 加密。这不需要改变;您只需要为主机端设置 "Transport" 安全性,添加一些代码和证书,您应该能够继续进行而无需更改太多代码。我可以在下面包含一个小代码示例,因为我通过 self-hosted 服务做了与您尝试做的相同的事情。

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;
}

authentication/authorization 也可以完成,而无需更改您当前拥有的内容。你真的有两个选择:

一个是您创建一个登录函数,该函数在客户端首次访问主机时被调用。然后,您将一些令牌值发送回客户端以进行所有后续通信。

另一种方法涉及创建自定义身份验证检查,使用 Dispatcher.IDispatchMessageInspector 中的消息检查器功能和名为 AfterReceiveRequest 的 public 函数。在该函数中,您可以检查从客户端发送的 UserID 和 Pwd(来自 HTTP header 数据),但您需要在客户端和主机端都实现它,否则它不起作用。