2012-08-28 18 views
10

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:

  1. 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)
  2. 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)
  3. 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):

client-server communication when Connect throws exception

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."; 
     } 
+0

[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

Trả lời

5

Chúng tôi gặp sự cố khi chúng tôi cần cho phép chặn kết nối hoàn toàn. Ngay bây giờ bạn sẽ phải bảo vệ từng phương pháp. Nó không phải là sạch nhất nhưng đối với 1.0 alpha1 chúng tôi sẽ có một số cơ chế để làm điều này.

Một vấn đề nữa là nó là kết nối tương tự cho tất cả các hub nên bạn không thể từ chối kết nối cho một hub cụ thể.

EDIT

Trên thực tế nếu bạn ném nó ngắt kết nối như xa như thử nghiệm của tôi đi. Bạn đang thấy hành vi gì?

+0

Đã hiểu bây giờ - rõ ràng mọi thứ phức tạp hơn suy nghĩ đầu tiên, như thường lệ. Tuy nhiên đây là một vấn đề lớn vì nó làm cho SignalR không phù hợp cho các ứng dụng doanh nghiệp và mở ra một mối đe dọa lớn về an ninh - xin ưu tiên ... Về tự động kết nối lại, tôi đã thêm một số chi tiết vào câu hỏi - xin lỗi vì bị đau, dfowler :) – eddo

+0

twopence của tôi - để kết nối Hub, khách hàng phải nhận được ''. Nó sẽ không thể làm cho phía máy chủ này đi qua xác thực ASP.NET? Không chắc chắn nếu cách tiếp cận này có thể được mở rộng đến SignalR.Client, quá ... – eddo

+0

Điều đó không đúng. Đó là một proxy được tạo ra để thuận tiện, không có gì liên quan đến thực tế là bạn có thể kết nối với một hub hay không. Điều duy nhất chúng ta cần thêm (và chúng tôi sẽ) là một cách sạch sẽ để từ chối hoàn toàn các kết nối, dựa trên một số logic do người dùng xác định. Việc xác thực không bao giờ xảy ra bên trong chính SignalR. Nhưng bạn có thể kiểm tra và xác minh trong SignalR. Nếu bạn thực sự cần thiết để có được điều này để làm việc ngày hôm nay, bạn có thể viết một mô-đun ASP.NET và yêu cầu circuited ngắn để signalr hoàn toàn nhưng đó là đau đớn. – davidfowl