2013-04-08 38 views
10

Tôi đang sử dụng SignalR 1 với ứng dụng web MVC4 C# có xác thực biểu mẫu. Tôi có một mã trong trang bố trí của tôi trong JavaScript:ngắt kết nối ứng dụng khách khỏi tín hiệu phía máy chủ

$(documnet).ready(function(){ 
     connect to hub code ... 
}) 

Tôi muốn ngắt kết nối người dùng tạo ra các trung tâm và bắt đầu kết nối lại sau khi anh ấy làm một tên đăng nhập và xác nhận ok. tôi muốn làm điều đó từ phía máy chủ bên trong điều khiển tài khoản của tôi và phương pháp:

public ActionResult LogOn(LoginModel model, string returnUrl) 
{ 
    if (ModelState.IsValid) 
    { 
     if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) 
     { 
      FormsAuthentication.SetAuthCookie(model.UserName, false); 
      ....here , disconnect from hub 
      ....to make the user reconnect  
} 

Lý do tôi muốn làm điều đó là bởi vì SignalR ném một lỗi nếu người dùng thay đổi để chứng thực sau khi đăng nhập và kết nối vẫn còn. Lỗi này là:

Id kết nối có định dạng không chính xác.

Trả lời

20

Bạn không thể dừng và khởi động kết nối SignalR từ máy chủ. Bạn cần phải gọi

$.connection.hub.stop(); //on the client before the user attempts to log on and then call 
$.connection.hub.start(); //after the log on attempt has completed. 
+0

tôi gọi là "$ .connectino.hub. khởi đầu();" trên mọi trạng thái sẵn sàng của tài liệu .. là OK để gọi "$ .connection.hub.stop();" trước ? –

+0

Bạn sẽ phải lấy nó từ máy khách khi người dùng kết nối với hub và lưu trữ nó để có thể so sánh nó với bất kỳ kết nối mới nào, điều này cũng sẽ ngăn chặn các cuộc tấn công mạo danh. –

12

Một cách bạn có thể làm những gì bạn yêu cầu là viết sự kiện ngắt kết nối trên máy khách mà máy chủ có thể gọi qua SignalR. Có lẽ một cái gì đó hơi như thế này:

myHub.client.serverOrderedDisconnect = function (value) { 
    $.connection.hub.stop(); 
}; 

Sau đó, trên máy chủ, một cái gì đó như thế này:

Clients.Client(Context.ConnectionId).serverOrderedDisconnect(); 
+0

nhưng làm thế nào tôi có thể nhận được Context.ConnectionId từ mã phía máy chủ bên trong hành động "Đăng nhập"? –

1

Hãy thử điều này:

public ActionResult LogOn(LoginModel model, string returnUrl) { 
    if (ModelState.IsValid) { 
     if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) { 
      FormsAuthentication.SetAuthCookie(model.UserName, false); 
      connection.Stop(); 
     } 
} 

Giả xử lý kết nối của bạn connection. Thử thách đang truy cập một điều khiển đối tượng connection của bạn trong Phương thức hành động của bạn.

+0

nhưng làm thế nào tôi có thể nhận được đối tượng "kết nối" từ mã phía máy chủ bên trong hành động "Đăng nhập"? –

+1

câu hỏi hay. đã không nghĩ rằng điều này cũng tốt. Nó có thể sẽ không sẵn sàng trừ khi bạn thêm nó vào phiên làm việc, điều này có vẻ sai ... –

4

Thử kiểm soát mọi thứ từ javascript. Sau đây là một ví dụ đăng xuất, đăng nhập sẽ tương tự.

Từ http://www.asp.net/signalr/overview/security/introduction-to-security:

Nếu thay đổi trạng thái xác thực của người dùng trong khi một kết nối hoạt động tồn tại, người dùng sẽ nhận được một lỗi mà nói, "Các danh tính người dùng không thể thay đổi trong một kết nối SignalR hoạt động." Trong trường hợp đó, ứng dụng của bạn nên kết nối lại với máy chủ để đảm bảo rằng id kết nối và tên người dùng được điều phối. Ví dụ: nếu ứng dụng của bạn cho phép người dùng đăng xuất trong khi kết nối đang hoạt động tồn tại, tên người dùng cho kết nối sẽ không còn khớp với tên được chuyển cho yêu cầu tiếp theo. Bạn sẽ muốn dừng kết nối trước khi người dùng đăng xuất rồi khởi động lại.

Tuy nhiên, điều quan trọng cần lưu ý là hầu hết các ứng dụng sẽ không cần để dừng và bắt đầu kết nối theo cách thủ công. Nếu ứng dụng của bạn chuyển hướng người dùng đến trang riêng sau khi đăng xuất, chẳng hạn như hành vi mặc định trong ứng dụng Biểu mẫu web hoặc ứng dụng MVC hoặc làm mới trang hiện tại sau khi đăng xuất, kết nối hoạt động là tự động ngắt kết nối và không yêu cầu bất kỳ hành động bổ sung nào.

Ví dụ sau cho biết cách dừng và bắt đầu kết nối khi trạng thái người dùng đã thay đổi.

<script type="text/javascript"> 
$(function() { 
    var chat = $.connection.sampleHub; 
    $.connection.hub.start().done(function() { 
     $('#logoutbutton').click(function() { 
      chat.connection.stop(); 
      $.ajax({ 
       url: "Services/SampleWebService.svc/LogOut", 
       type: "POST" 
      }).done(function() { 
       chat.connection.start(); 
      }); 
     }); 
    }); 
}); 

-3

Sao chép và dán chức năng sau đây vào Hub của bạn

Use HttpContext.Current.Response.End(); 

để buộc các khách hàng để ngắt kết nối trong trung tâm của bạn

+0

Vấn đề ngữ pháp và thuyết trình sang một bên, có bất kỳ vấn đề kỹ thuật nào với giải pháp này có thể gây ra sự sụt giảm không? –

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