WCF自托管HTTPS并使用自定义UserNamePasswordValidator

时间:2015-01-27 11:17:37

标签: c# .net wcf wcf-binding wcf-security

我有一个运行良好的WCF服务。

  • 它在Intranet网络中使用。
  • 这是一项自托管服务 (没有IIS)由简单的Windows窗体程序管理。
  • 它被a使用 WCF客户端(WPF C#)。

我现在需要为它添加安全性,在网上阅读了很多帖子后,我感到很困惑,因为有很多方法可以做。

我需要一个自定义用户名和密码验证器(我必须调用另一个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

感谢您的建议

1 个答案:

答案 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头数据中) - 但是您需要在客户端和主机端实现此功能,否则它不起作用。