我计划使用 SignalR 通知客户。
在生产中,我们被迫使用客户端 x509 证书来使用反向代理对客户端进行身份验证。它还将在连接到我们的 IIS 网络服务器之前终止 SSL。
这行得通吗?
我找不到任何 api 来添加客户端证书或使用 WebRequestHandler。
我不可能是第一个。
/HAXEN
我计划使用 SignalR 通知客户。
在生产中,我们被迫使用客户端 x509 证书来使用反向代理对客户端进行身份验证。它还将在连接到我们的 IIS 网络服务器之前终止 SSL。
这行得通吗?
我找不到任何 api 来添加客户端证书或使用 WebRequestHandler。
我不可能是第一个。
/HAXEN
关于使用基于客户端的证书:SingalR 中没有任何东西允许这样做,我查看了所有来源,显然这是一个疏忽,而且非常烦人。这是我发现的一个黑客:
    public class MyHttpClient: IHttpClient
    {
        DefaultHttpClient _client = new DefaultHttpClient();
        X509Certificate Certificate;
        Action<IRequest> SpiceAction(Action<IRequest> prepareRequest)
        {
            return new Action<IRequest>(req =>
            {
                var fi = typeof(HttpWebRequestWrapper).GetField("_request",
                     BindingFlags.NonPublic | BindingFlags.Instance);
                HttpWebRequest request = (HttpWebRequest) fi.GetValue(req);
                request.ClientCertificates.Add(Certificate);
                prepareRequest(req);
            });
        }
        public Task<IResponse> Get(string url, Action<IRequest> prepareRequest)
        {
            return _client.Get(url, SpiceAction(prepareRequest));
        }
        public Task<IResponse> Post(string url, Action<IRequest> prepareRequest,
            IDictionary<string, string> postData)
        {
            return _client.Post(url, SpiceAction(prepareRequest), postData);
        }
    }
然后代替:
    var conn = new Connection("https://xxxxxxxx");
    conn.Start()
做:
    var conn = new Connection("https://xxxxxxxx");
    conn.Start(new MyHttpClient() { Certificate = xxxxxxx });
我们开始了,1.1 版的 SignalR 客户端证书支持开箱即用。
伟大的!