2014-10-10 18 views
5

Tôi muốn tạo một ứng dụng SignalR đơn giản. Sử dụng http mọi thứ hoạt động tốt, nhưng khi tôi cố gắng sử dụng https và chứng chỉ thì ứng dụng không hoạt động.SignalR with Certificates

Hiện tại, điều duy nhất tôi muốn làm là lấy Chứng chỉ của Máy khách trong máy chủ.

server (Authentication Handler):

public class ClientCertificateAuthenticationHandler : AuthenticationHandler<ClientCertificateAuthenticationOptions> 
{ 
    protected override Task<AuthenticationTicket> AuthenticateCoreAsync() 
    { 
     var cert = Context.Get<X509Certificate>("ssl.ClientCertificate"); 

     if (cert == null) 
     { 
      return Task.FromResult<AuthenticationTicket>(null); 
     } 

     try 
     { 
      Options.Validator.Validate(cert); 
     } 
     catch 
     { 
      return Task.FromResult<AuthenticationTicket>(null); 
     } 
     return null; 
    } 
} 

Khách hàng (Hub)

var connection = new HubConnection("https://localhost:8080/"); 
connection.AddClientCertificate(X509Certificate.CreateFromCertFile("c1.cer")); 
IHubProxy myHub = connection.CreateHubProxy("MyHub"); 
connection.Start().Wait(); 

Việc làm này, trong máy chủ khi tôi làm var cert = Context.Get<X509Certificate>("ssl.ClientCertificate"); tôi nhận được null.

Vì vậy, những gì tôi đang làm sai?

Trả lời

4

Bạn cũng phải yêu cầu IIS sử dụng chứng chỉ ứng dụng khách. Trong web.config làm:

<location path="signalr"> 
    <system.webServer> 
     <security> 
     <access sslFlags="SslNegotiateCert" /> 
     </security> 
    </system.webServer> 
</location> 

mã làm việc của tôi

var cert = ServiceCallHelper.GetClientCertificate(); 
var url = new Uri(Settings.CoreUrl); 
var str = String.Format("https://{0}/cert_signalr", url.Host); 
var hub = new HubConnection(str, false); 
hub.AddClientCertificate(cert); 

object cert = null; 
if (!hub.Context.Request.Environment.TryGetValue("ssl.ClientCertificate", out cert) || 
    !(cert is X509Certificate2)) 
{ 
    s_logger.WarnFormat("Hub {0} called without certificate or cookie", hub.Context.Request.ToString()); 
    throw new Exception("not authenticated"); 
} 
+0

Cảm ơn bạn đã trả lời. Tôi đặt các cấu hình trong App.config của tôi, nhưng kết quả là như nhau. –

+1

i đã sửa mục nhập ssl => SslNegotiateCert – pm100

+0

Tôi đã thử điều đó. Nhưng vẫn không hoạt động. Có thể là một cái gì đó trong phần còn lại của mã, nhưng tôi không thể tìm ra những gì. –