2013-02-27 1 views
0

Je travaille sur une application permettant d'effectuer une synchronisation de contexte entre plusieurs applications hébergées sur le web en utilisant SignalR. L'ordinateur client instancie un hôte à l'aide de l'hôte SignalR Owin et les applications s'y connectent avec une version sans proxy du client JS. Le problème que j'ai est que les applications "Client" sont hébergées dans des environnements SSL que l'hôte SignalR n'est pas (comme il est contraint à la machine locale). Si j'essaie de me connecter au Hub à partir d'un site Web standard non-SSL hébergeant le client javascript, tout fonctionne. Dès que je charge le client sur un site SSL, je reçois un "SignalR: Erreur lors de la demande de négociation: non défini" lorsque j'essaie de démarrer la connexion. Quelqu'un sait-il comment contourner cela?SignalR: Connexion du client JS sur la page SSL à SelfHost n'utilisant pas SSL

Hôte:

public class SignalRHost : IDisposable 
{ 
    private IDisposable _webApp; 

    public SignalRHost(string url = "http://localhost:9000/") 
    { 
     _webApp = WebApplication.Start<Startup>(url); 
    } 

    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      bool enableErrorDetail = false; 
#if DEBUG 
      enableErrorDetail = true; 
#endif 
      app.MapHubs(new HubConfiguration { EnableCrossDomain = true, EnableDetailedErrors = enableErrorDetail }); 
     } 

    } 


    public void Dispose() 
    { 
     _webApp.Dispose(); 
    } 
} 

JS Client:

(function (ns_HubClient) { 
    ns_HubClient.connection; 
    ns_HubClient.proxy; 

    ns_HubClient.initialize = function() { 
     ns_HubClient.connection = $.hubConnection("http://localhost:9000"); 
     ns_HubClient.proxy = ns_HubClient.connection.createHubProxy("fluencyHub"); 

     ns_HubClient.proxy.on('addMessage', function (data) { ns_HubClient.processMessage(data); }); 


     ns_HubClient.connection.start() 
      .done(function() { 
       alert("connection complete"); 
      }) 
      .fail(function (data) { 
       alert("connection start failed: " + data); 
      }); 
    }; 

    ns_HubClient.login = function (sUserName, sPassword, sDomain) { 
     var fluencyMessage = { 
      MessageId: "", 
      CallType: "Asynchronous", 
      Method: "Login", 
      Status: "", 
      Response: {}, 
      Request: { 
       sUserName: sUserName, 
       sPassword: sPassword, 
       sDomain: sDomain 
      } 
     }; 

     ns_HubClient.sendMessage(fluencyMessage); 
    }; 

    ns_HubClient.writeLog = function (message, errorLevel) { 
     var logMessage = { 
      ErrorLevel: errorLevel, 
      Message: message 
     }; 
     ns_HubClient.proxy.invoke("logMessage", logMessage); 
    }; 

    ns_HubClient.processMessage = function (message) { 

    }; 

    ns_HubClient.sendMessage = function (data) { 
     ns_HubClient.proxy.invoke("addMessage", data); 
    }; 

} (window.ns_HubClient = window.ns_HubClient || {})); 

Répondre

2

Le client SignalR JS fait un XHR à "négocier" qui transporte (par exemple WebSockets) devraient être utilisés pour établir une communication bidirectionnelle avec le SignalR serveur entre autres choses.

fournisseurs de navigateur peuvent choisir de ne pas laisser les requêtes XHR à effectuer sur HTTPS pages aux ressources HTTP: http://www.w3.org/TR/access-control/#user-agent-security

Notez le quatrième point: « les agents utilisateurs sont autorisés à mettre fin à l'algorithme et ne pas faire une demande Cela pourrait être fait parce que: .... https à http n'est pas autorisé. "

Un fournisseur de navigateur peut choisir de le faire, car les XHR non sécurisés peuvent rendre des applications Web autrement sécurisées vulnérables aux attaques de type man-in-the-middle. Je voudrais utiliser les outils F12 de votre navigateur ou utiliser un proxy HTTP comme fidler pour vérifier que le navigateur est en train de faire une demande de «négociation». Si c'est le cas, vous pouvez consulter la réponse pour vous aider à comprendre ce qui se passe.