2011-08-24 14 views
5

Mamy wymóg, w którym chcielibyśmy przekierować użytkownika na stronę logowania po wygaśnięciu sesji ASP.NET, a użytkownik pracuje w dodatku Silverlight.Limity sesji Silverlight, RIA i ASP.Net

Scenariusz jest taki, że mamy starszą aplikację, która uruchamia ASP.Net, wszystkie nasze nowe moduły są w Silverlight, a starsza aplikacja ładuje aplikację Silverlight. To wszystko działa :-) Następnie użytkownik odchodzi od swojego biurka i wraca po upływie czasu sesji ASP.Net, ale potem próbuje dalej coś robić w aplikacji Silverlight, która korzysta z usługi RIA Domain Service. Ponieważ sesja ma limit czasu, usługa domenowa RIA ulegnie awarii, ale nie kończy się niepowodzeniem z wyjątkiem SessionExpired, ani z nieprawidłowym użytkownikiem/hasłem, po prostu zawiedzie z wyjątkiem domeny, który jest podobny do "prawdziwych" wyjątków zgłaszanych w domenie model, więc nie mamy możliwości zidentyfikowania, że ​​tym razem było tak, ponieważ sesja wygasła.

Istnieje wiele odpowiedzi na to, jak utrzymać sesję ASP.Net przy życiu, nie chcemy tego robić, chcemy, aby sesja wygasła, ale chcemy być w stanie obsłużyć ją z wdziękiem w Silverlight i skierować użytkownika do strona logowania.

Mamy to działa, ale problem występuje zawsze, gdy wyjątek jest zgłaszany w aplikacji Silverlight, przekierowuje cię to na stronę logowania, która nie jest zamierzonym zachowaniem. Chcemy przekierować tylko wtedy, gdy wygasa sesja.

Wszelkie pomysły?

Odpowiedz

2

Po prostu miałem ten sam problem. I dodaje następujący kod do Application_UnhandledException:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
{ 
    // redirect to login on exceptions when user is not logged in 
    var domainException = e.ExceptionObject as DomainOperationException; 
    if (domainException != null && !WebContext.Current.User.IsAuthenticated) 
    { // probably a server-side timeout has occurred. 
     e.Handled = true; 
     HtmlPage.Document.Submit(); // redirect to login page 
    } 
} 

gdy istnieje wyjątek domeny, a użytkownik nie jest zalogowany (zakładam, że użytkownik musi być zalogowany, aby zobaczyć dowolną stronę), przekierować do strona wywołująca, która powoduje przekierowanie ASP.NET do strony logowania.

EDYCJA: To rozwiązanie jest przydatne, gdy używasz formularza logowania .aspx (który zwykle używam, aby uniemożliwić nieuwierzytelnionemu użytkownikowi pobranie kodu Silverlight). Jeśli korzystasz z formularza rejestracji Silverlight, znajdziesz tutaj odpowiedź: https://stackoverflow.com/a/8083744/178620.

+0

Powinieneś zgłosić się do RegistrationWindow, zamiast próbować ponownie załadować stronę HtmlPage. To jest o wiele lepsza odpowiedź: http://stackoverflow.com/a/8083744/178620 –

+0

Wielkie dzięki za wskazówkę. Masz rację, jeśli korzystasz z okna logowania/rejestracji Silverlight. Wolę używać uwierzytelniania formularzy asp.net i formularza internetowego HTML do logowania, ponieważ złośliwy użytkownik nie może pobrać aplikacji Silverlight bez logowania. W tych okolicznościach moja odpowiedź jest nadal poprawna i wolę ją od twojego rozwiązania. – slfan

+0

Widzę, skąd przychodzisz - pytanie określa RIA i większość ludzi po prostu skorzysta z RegistrationWindow. Jeśli nie masz nic przeciwko aktualizacji odpowiedzi z twojej perspektywy, będę mógł odrzucić głosowanie w dół. –

Powiązane problemy