2009-09-24 44 views
56

W mojej strony asp.net używam uwierzytelniania formularzy asp.net z następującej konfiguracjiForms Authentication Timeout vs Session Timeout

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Common/Login.aspx" 
      defaultUrl="~/Pages/index.aspx" 
      protection="All" 
      timeout="30" 
      name="MyAuthCookie" 
      path="/" 
      requireSSL="false" 
      cookieless="UseDeviceProfile" 
      enableCrossAppRedirects="false" > 
    </forms> 
</authentication> 

Mam następujące pytania

  1. Jaki powinien być wartość limitu czasu sesja, ponieważ używam wygaśnięcia po wygaśnięciu w formularzu uwierzytelniania, ponieważ sesja wygaśnie przed uwierzytelnianiem formularza. Jak mogę to chronić?

  2. Po wylogowaniu się z formularza chciałbym przekierować stronę pod logout.aspx, ale automatycznie przekierowuję mnie na loginpage.aspx. Jak to jest możliwe?

Odpowiedz

47
  1. Aby być na bezpiecznej stronie: Timeout (Session) < = Timeout (FormsAuthentication) * 2
  2. Jeśli chcesz wyświetlić stronę inną niż określona w atrybucie loginUrl po limitu czasu uwierzytelniania trzeba obsłużyć to ręcznie, jak ASP.NET nie zapewnia sposobu na to.

Aby uzyskać # 2, możesz ręcznie sprawdzić plik cookie i jego Dziennik uwierzytelniania w celu wygaśnięcia i przekierowania do niestandardowej strony, jeśli wygasły.
Możesz zrobić to w jednym z wydarzeń: AcquireRequestState, AuthenticateRequest.

Przykładowy kod w przypadku może wyglądać następująco:

// Retrieve AuthenticationCookie 
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
if (cookie == null) return; 
FormsAuthenticationTicket ticket = null; 
try { 
    ticket = FormsAuthentication.Decrypt(cookie.Value); 
} catch (Exception decryptError) { 
    // Handle properly 
} 
if (ticket == null) return; // Not authorised 
if (ticket.Expiration > DateTime.Now) { 
    Response.Redirect("SessionExpiredPage.aspx"); // Or do other stuff here 
} 
+2

Dzięki Dmitriy, Moje drugie pytanie: Jak napisano powyżej w

, że domyślną stroną jest "index.aspx", a login to "login.aspx". Po zalogowaniu na mojej stronie deski rozdzielczej, gdy pozostanę idealny przez 30 minut (timeout), a następnie klikam na dowolny link, automatycznie przekieruję do strony logowania pod następującym adresem URL: http: // localhost: /virtualdir/Pages/Login.aspx? ReturnUrl =% 2fvirtualdir% 2fPages% 2fDashBoard.aspx Ale tutaj chciałbym przekierować stronę na stronie wylogowania, gdzie mogę powiedzieć niektóre informacje wylogowania –

+0

Powtórzono odpowiedź. –

+0

Czy możesz pokazać mi przykład, ponieważ w moim przypadku mam scenariusz, w którym ustawiam timeout form authentication = 2 minuty, podczas gdy limit czasu sesji = 6 minut i po 3 minutach, gdy klikam na link Nie debuguje nigdzie, nawet nie w "AcquireRequestState" Proszę pomóż? –

24

W przypadku witryn, które mają zależność sesji, można po prostu wylogować się z nieświeży uwierzytelniania z przypadku rozpoczęcia sesji w global.asax:

void Session_Start(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.IsAuthenticated) 
    { 

    //old authentication, kill it 
    FormsAuthentication.SignOut(); 
    //or use Response.Redirect to go to a different page 
    FormsAuthentication.RedirectToLoginPage("Session=Expired"); 
    HttpContext.Current.Response.End(); 
    } 

} 

Powoduje to, że nowa sesja = nowe uwierzytelnienie, kropka.

+1

Wydaje się być silny, ale była dla nas dobrą opcją, gdy posiadanie sesji w tej chwili jest niezbędne. –

+3

Nie jestem pewien, czy nazwałbym to siłą. Po prostu łączy stan uwierzytelnienia sesji ze sobą. Oczywiście, bardziej niezawodną opcją byłoby przywrócenie sesji z użyciem tokena uwierzytelniania. Ale jeśli przywrócenie sesji było następstwem (czyli rozprzestrzenieniem się w całym miejscu), najprostszym rozwiązaniem jest przywrócenie użytkownika do znanej ścieżki (logowanie). –

+0

To prawda, że ​​jest to droga, którą obraliśmy, dopóki nie będziemy mogli stworzyć sesji w locie. –