2012-12-14 16 views
21

Mam aplikacji ASP.NET MVC4 gdzie jestem wykonawczych SessionTimeout jak:Jak przekierować do strony logowania, gdy czas się stan sesji jest zakończona w ASP.NET MVC

<configuration> 
    <system.web> 
    <sessionState timeout="2"></sessionState> 
    </system.web> 
</configuration> 

I Uwierzytelnianie:

<configuration> 
    <system.web> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/Account/LogOn" timeout="1" /> 
    </authentication> 
    </system.web> 
</configuration> 

Po zakończeniu sesji (2 minuty), muszę przekierować na stronę logowania, ale przekierowanie nie występuje.

Jak zmienić kod, aby przekierować?

+1

Proszę sprawdzić poniższy link. To może ci pomóc. [Strona logowania url] [1] [1]: http://stackoverflow.com/questions/356982/how-to-redirect-to-a-dynamic-login-url- in-asp-net-mvc – RGR

Odpowiedz

28

Jednym ze sposobów jest to, że W przypadku wygaśnięcia sesji, w każdej akcji należy sprawdzić sesję, a jeśli jest ona zerowa, to przekierować na stronę logowania.

Jest to jednak metoda bardzo gorączkowy ponad przyjść to trzeba tworzyć własne ActionFilterAttribute który będzie to zrobić, wystarczy dodać ten atrybut w każdym sposobie działania.

Oto klasa, która zastępuje właściwość ActionFilterAttribute.

public class SessionExpireFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpContext ctx = HttpContext.Current; 

      // check if session is supported 
      CurrentCustomer objCurrentCustomer = new CurrentCustomer(); 
      objCurrentCustomer = ((CurrentCustomer)SessionStore.GetSessionValue(SessionStore.Customer)); 
      if (objCurrentCustomer == null) 
      { 
       // check if a new session id was generated 
       filterContext.Result = new RedirectResult("~/Users/Login"); 
       return; 
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

Następnie w akcji wystarczy dodać ten atrybut tak:

[SessionExpire] 
public ActionResult Index() 
{ 
    return Index(); 
} 

to zrobi pracy.

+0

Zasadniczo potrzebuję utworzyć klasę zdefiniowaną w każdym z kontrolerów i każdej metody działania, którą muszę podać ** ActionFilterAttribute **, a dla metody indeksu muszę podać ** [SessionExpire] ** . Czy to tak – Jonathan

+1

nie musisz tworzyć tej klasy w app_start tylko jeden i dodaj ten atrybut do działania – user1006544

+0

U na stronie global.asax.cs muszę dodać ten kod w funkcji Application_Start() – Jonathan

6

Jest to ogólne rozwiązanie:

Powiedzmy, że masz kontroler o nazwie Administrator, gdzie można umieścić zawartość dla autoryzowanych użytkowników.

Następnie można zastąpić Initialize lub OnAuthorization metod kontrolera Admin i zapisu przekierować się zalogować logikę stronę na limit czasu sesji w tych metod, jak opisano:

protected override void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext) 
    { 
     //lets say you set session value to a positive integer 
     AdminLoginType = Convert.ToInt32(filterContext.HttpContext.Session["AdminLoginType"]); 
     if (AdminLoginType == 0) 
     { 
      filterContext.HttpContext.Response.Redirect("~/login"); 
     } 

     base.OnAuthorization(filterContext); 
    } 
21

odkrywam bardzo prosty sposób przekierować Logowanie Strona Kiedy sesja kończy się w MVC. Przetestowałem już to i działa to bezproblemowo.

Krótko mówiąc, łapię koniec sesji w _Layout 1 minutę wcześniej i dokonuję przekierowania.

Próbuję wyjaśnić wszystko krok po kroku.

Jeśli chcemy końca sesji 30 minut po i przekierować do loginPage zobaczyć ten kroki:

  1. Zmiana config web tak (zestaw 31 minuta):

    <system.web> 
        <sessionState timeout="31"></sessionState> 
    </system.web> 
    
  2. Dodaj ten JavaScript w _Layout (gdy sesja kończy się 1 minutę przed przekierowaniem tego kodu, zlicza czas po ostatniej akcji użytkownika, a nie pierwsza wizyta na stronie)

    <script> 
        //session end 
        var sessionTimeoutWarning = @Session.Timeout- 1; 
    
        var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000; 
        setTimeout('SessionEnd()', sTimeout); 
    
        function SessionEnd() { 
         window.location = "/Account/LogOff"; 
        } 
    </script> 
    
  3. Oto moja LogOff Akcja, która sprawia, że ​​tylko wylogowanie i przekierować LoginIn stronę

    public ActionResult LogOff() 
    { 
        Session["User"] = null; //it's my session variable 
        Session.Clear(); 
        Session.Abandon(); 
        FormsAuthentication.SignOut(); //you write this when you use FormsAuthentication 
        return RedirectToAction("Login", "Account"); 
    } 
    

Mam nadzieję, że jest to bardzo przydatny kod dla ciebie.

+1

dziękuję za dodanie tego, znalazłem to przydatne –

+0

Nie ma za co "hej ty" –

+0

Prawdopodobnie chcesz [zresetować 'setTimeout'] (https: // stackoverflow.com/questions/1472705/resetting-a-settimeout) na każdym wywołaniu AJAX, ponieważ użytkownik może kontynuować interakcję z formularzem i utrzymywać sesję przy życiu na zapleczu – KyleMit

Powiązane problemy