2017-06-18 26 views
5

Tôi có ứng dụng ASP.NET MVC 4 (.NET 4.5) và SIgnalR hoạt động tốt với xác thực dựa trên biểu mẫu (được lưu trữ qua IIS/IIS Express)SignalR không hoạt động với xác thực tích hợp Windows

Ngay sau khi tôi thay đổi ứng dụng thành xác thực tích hợp cửa sổ (<authentication mode="Windows"/> trong "web.config") nó ngừng hoạt động.

jquery.signalR-2.2.2.min.js: 9 kết nối WebSocket để ws://localhost:51030/signalr/connect?transport=webSockets&blhablahblah thất bại: Lỗi trong WebSocket handshake: mã phản hồi mong đợi: 403

Sau khi thêm thuộc tính [Authorize] đến trung tâm của tôi, lỗi sẽ thay đổi thành

Kết nối WebSocket với ws://localhost:51030/signalr/connect?transport=webSocketsblahblah không thành công: Xác thực HTTP không thành công; không có chứng chỉ hợp lệ có sẵn

phần khác của ứng dụng đang làm việc tốt, cửa sổ-auth được kích hoạt trên máy chủ và các công trình, vv vv

Làm thế nào để giải quyết này?

Và nếu không thể giải thích được vì lý do nào đó (có thể Chrome không hỗ trợ auth trên kết nối websocket hoặc cái gì khác) - tại sao nó không rơi trở lại giao thức không phải websocket? và làm cách nào để buộc dự phòng?

CẬP NHẬT: Tôi đã tạo một vấn đề github https://github.com/SignalR/SignalR/issues/3953. Vấn đề không phải là tôi không thể kết nối. Vấn đề là tôi không thể xử lý lỗi để quay trở lại phương tiện khác. Không phải .fail() không phải .error() đang được gọi. Try-catch cũng không giúp được gì.

Trả lời

6

... 10 giờ sau đó ...

một phần giải quyết (trả lời câu hỏi của riêng tôi)

Sau khi chơi với nó tôi có thể khẳng định, rằng việc thêm thuộc tính [Authorize] đến trung tâm của tôi (hoặc cách khác, thêm GlobalHost.HubPipeline.RequireAuthentication(); vào "Startup.cs") của bạn thực sự không giúp được gì. Hiện tại, nó rơi trở lại thành phương tiện giao thông thay thế, mặc dù lỗi vẫn được đưa vào bảng điều khiển của trình duyệt.

Bạn cũng có thể chỉ định vận chuyển nó rơi trở lại, bằng cách gọi:

$.connection.hub.start({ transport: ['webSockets', 'longPolling'] }); 

trong trường hợp bạn không thích những ưu tiên mặc định (tôi đoán, "iframe ẩn" là lựa chọn thứ hai mặc định).

Lý do

Lỗi là do Chrome, nó không hỗ trợ NTLM trên các kết nối WebSocket. Vui đủ, IE, MS Edge và Firefox hỗ trợ nó ("Chrome là trình duyệt IE mới" huh).

Có sự cố mở trong trình gỡ lỗi Chromium cho điều này tại đây https://bugs.chromium.org/p/chromium/issues/detail?id=423609 nếu có ai muốn thêm bất kỳ đầu vào nào vào trình tạo Chromium.

Các vấn đề liên quan