WCF 自托管 HTTPS 与自定义 UserNamePasswordValidator
WCF self hosted HTTPS with custom UserNamePasswordValidator
我有一个 WCF 服务运行很好。
- 它在 Intranet 网络中使用。
- 这是一个自托管服务
(无 IIS)由一个简单的 Windows 表单程序管理。
- 它被一个人使用
WCF 客户端(WPF C#)。
我现在需要为其增加安全性,在阅读了互联网上的大量帖子后,我感到困惑,因为有很多方法可以做到。
我需要一个自定义的用户名和密码验证器(我将不得不调用另一个网络服务来了解用户是否被授权)。
我还需要客户端和服务器之间的安全通信。
我目前正在使用 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 数据),但您需要在客户端和主机端都实现它,否则它不起作用。
我有一个 WCF 服务运行很好。
- 它在 Intranet 网络中使用。
- 这是一个自托管服务 (无 IIS)由一个简单的 Windows 表单程序管理。
- 它被一个人使用 WCF 客户端(WPF C#)。
我现在需要为其增加安全性,在阅读了互联网上的大量帖子后,我感到困惑,因为有很多方法可以做到。
我需要一个自定义的用户名和密码验证器(我将不得不调用另一个网络服务来了解用户是否被授权)。 我还需要客户端和服务器之间的安全通信。
我目前正在使用 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 数据),但您需要在客户端和主机端都实现它,否则它不起作用。