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.
Как я могу исправить эту ошибку?
Ответы
Ответ 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 исправляет эту проблему, вы не будете использовать наилучший транспорт, пока не измените свой код.
Ответ 2
Ошибка кажется живой, но похоже, что они работают над этим. Вы можете решить эту проблему, используя https
/wss
.
Прочтите ответ codeMonkey в SignalR, не работающем с интегрированной в Windows аутентификацией.
Ответ 3
Мне удалось решить эту проблему, переключившись на Dev Channel Chrome: скачать отсюда. После установки мне нужно было включить флаг dev в chrome://flags/. Найдите параметр Включить повторное использование подключения WebSocket для аутентификации и включите эту функцию. Вы должны быть на версии 69 или выше
Ответ 4
Вот как я это решил, и для меня это не имело ничего общего с Chrome. Я использую Chrome, и он работает с данными в реальном времени. Моя ошибка была spring безопасности
.antMatchers("/ws/myapp", "/http/myaap", "/topic/**", "/app/**" ).permitAll()
WebSocket Handshake - неожиданный код ответа 200 - AngularJs и Spring Boot