2013-04-08 36 views
10

Używam SignalR 1 z aplikacją internetową MVC4 C# z uwierzytelnianiem formularza. mam kod w moim układ strony w JavaScript:rozłącz klienta od strony serwera po stronie

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

chcę odłączyć tworzą użytkownik piastę i uruchomić ponownie połączyć po robi login i zatwierdź OK. chcę to zrobić od strony serwera wewnątrz mojego kontrolera obrotów i metody:

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  
} 

Powód chcę zrobić to dlatego SignalR zgłasza błąd, jeśli użytkownik zmienił się po zalogowaniu i uwierzytelnione połączenie pozostaje. Błąd:

Identyfikator połączenia ma nieprawidłowy format.

Odpowiedz

20

Nie można zatrzymać i uruchomić połączeń SignalR z serwera. Trzeba będzie zadzwonić

$.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

nazywam „$ .connectino.hub. początek();" na każdym stanie gotowości dokumentu ... można wywołać "$ .connection.hub.stop();" przed ? –

+0

Będziesz musiał pobrać go od klienta, gdy użytkownik połączy się z koncentratorem, i zapisać go, aby móc porównać go z nowymi połączeniami, co również zapobiegnie atakom podszywania się. –

12

Jednym ze sposobów można zrobić co pytasz jest napisanie zdarzenie odłączyć od klienta, że ​​serwer może wywołać poprzez SignalR. Może coś mniej więcej tak:

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

Następnie na serwerze, coś takiego:

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

, ale w jaki sposób mogę uzyskać kod kontekstowy strony po stronie serwera w akcji "LogOn"? –

1

Spróbuj tego:

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(); 
     } 
} 

Zakładając, że połączenie jest connection uchwyt. Wyzwanie polega na uzyskaniu dostępu do obiektu connection w swojej metodzie działania.

+0

, ale jak mogę uzyskać obiekt "połączenie" z kodu po stronie serwera w akcji "LogOn"? –

+1

dobre pytanie. nie myślałem o tym dobrze. Prawdopodobnie nie byłaby łatwo dostępna, gdybyś nie dodała go do sesji, co wydaje się błędne ... –

4

Spróbuj kontrolować wszystko od javascript. Poniżej znajduje się przykład wylogowania, logowanie będzie podobne.

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

przypadku zmiany stanu uwierzytelniania użytkownika podczas istnieje aktywne połączenie , użytkownik otrzyma komunikat o błędzie, który mówi: „Tożsamość użytkownik nie można zmieniać w trakcie aktywnego połączenia SignalR”. W takim przypadku aplikacja powinna ponownie połączyć się z serwerem, aby upewnić się, że identyfikator połączenia i nazwa użytkownika są skoordynowane. Na przykład, jeśli Twoja aplikacja zezwala użytkownikowi na wylogowanie się, gdy istnieje aktywne połączenie , nazwa użytkownika dla połączenia nie będzie już pasować do nazwy , która jest przekazywana dla następnego żądania. Będziesz chciał zatrzymać połączenie , zanim użytkownik się wyloguje, a następnie uruchom go ponownie.

Należy jednak pamiętać, że większość aplikacji nie potrzebuje , aby ręcznie zatrzymać i uruchomić połączenie. Jeśli po wylogowaniu aplikacja użytkownika przekierowuje użytkowników na oddzielną stronę, na przykład domyślne zachowanie w aplikacji Web Forms lub aplikacji MVC, lub odświeża bieżącą stronę po wylogowaniu, aktywne połączenie to automatycznie odłączone i nie wymaga jakiekolwiek dodatkowe działanie.

Poniższy przykład pokazuje, jak zatrzymać i uruchomić połączenie po zmianie stanu użytkownika.

<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

Kopiuj i wklej następującą funkcję do koncentratora

Use HttpContext.Current.Response.End(); 

zmusić klienta do odłączenia w piaście

+0

Pomijając kwestie gramatyczne i prezentacyjne, czy są jakieś problemy techniczne z tym rozwiązaniem, które spowodowałyby spadek zainteresowania? –

Powiązane problemy