web-dev-qa-db-fra.com

SignalR MVC 5 Websocket sans informations d'identification valides

j'essaie d'utiliser SignalR dans l'application MVC. Cela fonctionne bien mais j'obtiens l'erreur suivante dans la console Chrome

 WebSocket connection to 'ws://localhost:18245/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=bNDGLnbSQThqY%2FSjo1bt
8%2FL45Xs22BDs2VcY8O7HIkJdDaUJ4ftIc54av%2BELjr27ekHUiTYWgFMfG6o7RaZwhf
fpXavzWQ1jvkaxGm5rI%2BWtK7j0g1eQC2aOYP366WmRQLXCiYJfsm4EbwX6T8n2Aw
%3D%3D&connectionData=%5B%7B%22name%22%3A%22importerhub%
22%7D%5D&tid=9' failed: HTTP Authentication failed; no valid credentials available 

Le plus drôle, c'est que la méthode jquery que j'appelle depuis le contrôleur via le hub fonctionne très bien.

jQuery:

 $(function () {
            // Initialize the connection to the server
            var importerHub = $.connection.importerHub;

            // Preparing a client side function
            // called sendMessage that will be called from the server side
            importerHub.client.sendMessage = function (message) {
                showOrUpdateSuccessMessage(message);
            };
            $.connection.hub.start();
        });

Manette:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<ImporterHub>();
            hubContext.Clients.All.sendMessage("All operations complete");

J'utilise .Net v4.5.1, SignalR v2.1.2.0 et IIS 8.5 avec authentification Windows.

Comment puis-je corriger cette erreur?

30
Konobi

Il semble que vous rencontriez un problème Chrome. Le problème est que Chrome ne gère pas correctement l'authentification Windows pour les WebSockets).

Vous trouverez ci-dessous le problème initial soumis il y a quelques années, signalant que Chrome ne prenait en charge aucune forme d'authentification HTTP:

https://code.google.com/p/chromium/issues/detail?id=123862

Ce problème a été résolu pour l'authentification de base et Digest, mais pas pour l'authentification Windows (NTLM/Negotiate). Un problème a été créé il y a moins d'un mois pour suivre la progression de la prise en charge de Chrome pour l'authentification Windows avec WebSockets:

https://code.google.com/p/chromium/issues/detail?id=423609

Apparemment, le problème d'authentification Windows est partiellement résolu dans le canal de développement Chrome, mais uniquement si le client s'est déjà authentifié auprès du serveur avant d'établir un WebSocket.

La raison pour laquelle vous pouvez toujours appeler sendMessage depuis votre Controller est que SignalR revient automatiquement à utiliser un transport autre que WebSockets (c'est-à-dire des événements envoyés par le serveur ou une longue interrogation), lorsque la connexion WebSocket échoue. Chrome gérera correctement l'authentification Windows avec les autres transports de SignalR.

Je suggère de ne rien changer. Il ressemble à Chrome finira par prendre en charge l'authentification Windows pour WebSockets.

Le seul vrai problème, à part l'erreur dans votre console chrome, est qu'il peut prendre un peu plus de temps pour établir une connexion SignalR dans Chrome. Si c'est un gros problème, vous pouvez toujours spécifiez les transports que le client doit essayer d'utiliser . Donc, sur Chrome, vous ne pouvez essayer que serverSentEvents et longPolling, mais quand Chrome résout le problème , vous n'utiliserez pas le meilleur moyen de transport possible jusqu'à ce que vous changiez votre code.

43
halter73

Le bug semble être vivant, mais il semble qu'ils y travaillent. Vous pouvez résoudre le problème en utilisant https/wss.

Lire codeMonkey s réponse à SignalR ne fonctionne pas avec l'authentification intégrée à Windows .

0
Flo

Voici comment je l'ai résolu et pour moi, cela n'avait rien à voir avec Chrome. J'utilise chrome et cela fonctionne avec des données en temps réel. Mon erreur était la sécurité du printemps

.antMatchers("/ws/myapp", "/http/myaap", "/topic/**", "/app/**" ).permitAll()

WebSocket Handshake - Code de réponse inattendu 200 - AngularJs et Spring Boot

0
DiaMaBo

J'ai réussi à résoudre ce problème en passant au canal de développement de Chrome: Télécharger depuis ici . Une fois installé, je devais activer un indicateur de développement dans chrome: // flags /. Recherchez Activer la réutilisation de la connexion WebSocket pour l'authentification et activez la fonction. Vous devez être sur la version 69 ou supérieure

0
R2D2