Câu hỏi này liên quan đến một chủ đề khác, bạn có thể đọc here: Forms authentication with SignalR nơi tôi đã thử với sự trợ giúp và kiên nhẫn của người dùng dfowler để hiểu cách thực thi các hình thức ASP .NET Forms Authentication on một Trung tâm SignalR.SignalR: cách thực thi xác thực/chấm dứt kết nối hub phía máy chủ
Mô tả sự cố: Tôi muốn chỉ những người dùng được xác thực mới có thể kết nối Trung tâm SignalR và nhận/gửi tin nhắn.
Kịch bản xâm nhập: kẻ xâm nhập có thể có khả năng chụp/truy cập HTML và Javascripts của trang web truy cập các tệp tạm thời trên máy tính khách. Do đó, kẻ xâm nhập này có thể biết tất cả các chi tiết (các phương thức, tên miền trung tâm, vv) cần thiết để thiết lập/sử dụng kết nối tới Hub. Một giải pháp đề xuất từ dfowler là implementing IConnect:
Bạn sẽ thực hiện IConnected và viết đoạn mã sau vào Connect if (Context.User.Identity.IsAuthenticated!) Ném ngoại lệ mới ("GTFO");
Vì vậy, tôi cố gắng với một cái gì đó như thế này
public System.Threading.Tasks.Task Connect()
{
if (!Context.User.Identity.IsAuthenticated
|| !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2")
))
throw new Exception("User not authorized");
return null;
}
Vấn đề, một lần thử nghiệm, là khi các phương pháp kết nối đang được gọi, kết nối đã được đã được thành lập và đồng bằng ném ngoại lệ sẽ không giúp (nếu tôi nhận được nếu đúng Infact Kết nối nên được sử dụng để gửi tin nhắn cho khách hàng tại kết nối, ném một ngoại lệ sẽ chỉ mang lại trong một thông báo chào mừng không được gửi).
Trong thực tế, từ các thử nghiệm của tôi, khách hàng vẫn có thể đọc tất cả các tin nhắn (và cũng gửi cho họ).
Bây giờ, cách tiếp cận mà đến với tâm trí tôi:
- giải pháp hoàn hảo: từ chối hoặc hủy bỏ kết nối trên phía máy chủ: không có đầu mối làm thế nào để làm điều này trong SignalR (Tôi cố gắng để tìm một phương pháp trong API nhưng không có may mắn)
- kiểm tra nếu người dùng là một phần của một nhóm để tránh nhận/gửi tin nhắn cho anh ta (nhưng điều này vẫn còn dễ bị lũ lụt/tấn công DOS)
- gửi một thông điệp tới khách hàng để ngắt kết nối: rõ ràng không giúp đỡ trong trường hợp tôi đang chiến đấu với kẻ xâm nhập.
Bất kỳ cách tiếp cận nào khác? Bất kỳ cách nào để chấm dứt kết nối trên phía máy chủ hoặc phải được chấp nhận rằng xác thực thực sự duy nhất là một trong những trang web lưu trữ (để mở cửa cho tất cả các cuộc tấn công của khách hàng signalR?)
EDIT
Dưới đây là trình tự của khách hàng - giao tiếp máy chủ khi tôi sử dụng IConnect.Connect
phương pháp ném vô điều kiện một ngoại lệ (trình duyệt IE9):
Dường như foreverFrame không thành công nhưng dự phòng dài hạn đang được thiết lập và hoạt động tốt - điều này sau khi ném lỗi được ghi lại trong Javascript theo khối
if (connection.state === signalR.connectionState.connecting) {
// Connection hasn't been started yet
throw "SignalR: Connection has not been fully initialized.
Use .start().done() or .start().fail() to run logic after
the connection has started.";
}
[yêu cầu tính năng] (https://github.com/SignalR/SignalR/issues/635) được tạo trong trang web của Dự án SignalR GitHub – eddo