Подтвердить что ты не робот

SignalR MVC 5 Websocket нет действительных учетных данных

Я пытаюсь использовать SignalR в приложении MVC. Он работает хорошо, но я получаю следующую ошибку на консоли 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 

Самое забавное, что метод jquery, который я вызываю из Controller over the Hub, отлично работает.

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();
        });

Контроллер:

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

Я использую .Net v4.5.1, SignalR v2.1.2.0 и IIS 8.5 с проверкой подлинности Windows.

Как я могу исправить эту ошибку?

4b9b3361

Ответ 1

Похоже, вы столкнулись с проблемой Chrome. Проблема заключается в том, что Chrome неправильно обрабатывает проверку подлинности Windows для WebSockets.

Ниже приведена первая проблема, представленная пару лет назад о том, что Chrome не поддерживает любую форму HTTP-аутентификации:

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

Эта проблема была решена для проверки подлинности Basic и Digest, но не для проверки подлинности Windows (NTLM/Negotiate). Проблема была создана менее месяца назад для отслеживания прогресса в поддержке Chrome для проверки подлинности Windows с помощью WebSockets:

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

По-видимому, проблема с аутентификацией Windows частично исправлена ​​в канале Chrome dev, но только если клиент уже прошел аутентификацию с сервером до установки WebSocket.

Причина, по которой вы все еще можете вызвать sendMessage из вашего Контроллера, заключается в том, что SignalR автоматически возвращается к использованию транспорта, отличного от WebSockets (например, отправленные сервером события или длительный опрос) при сбое соединения WebSocket. Chrome будет корректно обрабатывать проверку подлинности Windows с помощью других транспондеров SignalR.

Я предлагаю ничего не менять. Похоже, что Chrome в конечном итоге поддерживает проверку подлинности Windows для WebSockets.

Единственная реальная проблема, кроме ошибки в вашей хром-консоли, заключается в том, что для установки соединения SignalR в Chrome может потребоваться несколько больше времени. Если это большая проблема, вы всегда можете указать, какие транспорты клиент должен попытаться использовать. Поэтому в Chrome вы можете попробовать только serverSentEvents и longPolling, но тогда, когда Chrome исправляет эту проблему, вы не будете использовать наилучший транспорт, пока не измените свой код.

Ответ 3

Мне удалось решить эту проблему, переключившись на Dev Channel Chrome: скачать отсюда. После установки мне нужно было включить флаг dev в chrome://flags/. Найдите параметр Включить повторное использование подключения WebSocket для аутентификации и включите эту функцию. Вы должны быть на версии 69 или выше