2011-01-27 4 views
1

J'ai une application asp.net où j'utilise FormAuthentication Ticket lorsque l'utilisateur se connecte .... sur chaque page Je veux vérifier si le ticket FormAuthentication a expiré.FormAuthentication Vérification de l'expiration du ticket

En fait, j'ai deux scénarios

  1. Je veux vérifier si l'utilisateur est authentifié ou tenter d'accéder directement à la page sans se connecter (dans ce cas, je veux rediriger sur « Default.aspx »

  2. Si l'utilisateur est déjà signé et authentifié mais que le délai est expiré (dans ce cas je souhaite rediriger vers la page "sexpired.aspx" où l'utilisateur sera informé "votre session a expiré veuillez vous reconnecter" avec le lien " Default.aspx "et redirigera vers l'url de retour.S'il vous plaît aviser et suggérer des solutions en conséquence

Actuellement, je fais cela sur chaque page et je pense que quand cookie expire il fait User.Identity.IsAuthenticated = false également causer à délai d'attente lorsque l'utilisateur tente de charger la page, il redirige vers « Default.aspx »

D'accord ici ma question est mis à jour avec formulaire de connexion code sous-jacent:

protected void LoginButton_Click(object sender, EventArgs e) 
{ 
    if (AuthenticateUser("SPOINT", txtUsername.Text, txtPassword.Text)) 
    { 
     //Fetch the role 
     Database db = DatabaseFactory.CreateDatabase(); 

     //Create Command object 
     DbCommand cmd = db.GetStoredProcCommand("Users"); 

     db.AddInParameter(cmd, "@userid", System.Data.DbType.String, 20); 
     db.SetParameterValue(cmd, "@userid", txtUsername.Text); 

     db.AddInParameter(cmd, "@fname", System.Data.DbType.String, 80); 
     db.SetParameterValue(cmd, "@fname", null); 

     db.AddInParameter(cmd, "@lname", System.Data.DbType.String, 80); 
     db.SetParameterValue(cmd, "@lname", null); 

     db.AddInParameter(cmd, "@phone", System.Data.DbType.String, 50); 
     db.SetParameterValue(cmd, "@phone", null); 

     db.AddInParameter(cmd, "@mobile", System.Data.DbType.String, 50); 
     db.SetParameterValue(cmd, "@mobile", null); 

     db.AddInParameter(cmd, "@email", System.Data.DbType.String, 100); 
     db.SetParameterValue(cmd, "@email", null); 

     db.AddInParameter(cmd, "@uroleids", System.Data.DbType.String, 50); 
     db.SetParameterValue(cmd, "@uroleids", null); 

     db.AddInParameter(cmd, "@uroles", System.Data.DbType.String, 500); 
     db.SetParameterValue(cmd, "@uroles", null); 

     db.AddInParameter(cmd, "@umenu", System.Data.DbType.Int16); 
     db.SetParameterValue(cmd, "@umenu", null); 

     db.AddInParameter(cmd, "@ustatus", System.Data.DbType.String, 1); 
     db.SetParameterValue(cmd, "@ustatus", null); 

     db.AddInParameter(cmd, "@reqType", System.Data.DbType.String, 1); 
     db.SetParameterValue(cmd, "@reqType", "R"); 

     db.AddOutParameter(cmd, "@retval", DbType.Int16, 2); 

     IDataReader reader = db.ExecuteReader(cmd); 

     System.Collections.ArrayList roleList = new System.Collections.ArrayList(); 
     if (reader.Read()) 
     { 
      roleList.Add(reader[0]); 
      string myRoles = (string)roleList[0]; 
      //Read user name 
      string uname = (string)reader[1]; 
      //Read User menu ID 
      int menuID = Convert.ToInt16(reader[2]); 

      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, txtUsername.Text, DateTime.Now, 
      DateTime.Now.AddMinutes(30), true, myRoles, FormsAuthentication.FormsCookiePath); 

      //Read user full name in session variable which will be shared across the whole application 
      Session["uid"] = txtUsername.Text; 
      Session["ufullname"] = uname; //myname; //uname; 
      Session["branch"] = 1; 

      //For security reasons we may hash the cookies 
      string hashCookies = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashCookies); 

      // add the cookie to user browser 
      Response.Cookies.Add(cookie); 

      //Constructing Menu according to User Role 
      string x = buildmenu(menuID); 

      Globals.menuString = null; 
      Globals.menuString = x; 

      string returnURL = "~/Main.aspx"; 

      //Close reader object to avoid Connection Pooling troubles 
      reader.Close(); 

      if (Request.QueryString["rUrl"] != null) 
       Response.Redirect(Request.QueryString["rUrl"]); 
      else 
       Response.Redirect(returnURL); 
     } 
     else 
     { 
      //Validation Error here... 
      lblError.Text = "Incorrect UserID/Password entered..."; 
      return; 
     } 
    } 
    else 
    { 
     lblError.Text = "Incorrect UserID/Password entered..."; 
     return; 
    } 
} 

Voici mon code derrière lequel je vérifie un billet d'formauthentication

if (!HttpContext.Current.User.Identity.IsAuthenticated || !HttpContext.Current.User.IsInRole("Maker")) 
    Response.Redirect("~/Default.aspx"); 

Répondre

0

Sans votre code de connexion/autorisation, il est difficile de déterminer comment vous avez configuré les choses.

La première chose que vous devriez probablement faire est de définir le délai d'attente la session/cookie être session expirent le temps + 1 minute (par exemple 21 minutes)

Ensuite, vous pouvez soit écrire un HttpModule pour vérifier le délai d'attente et de rediriger

public class ExpireModule : IHttpModule { 

    public virtual void Init(HttpApplication app) { 
     app.PostAuthenticateRequest += new EventHandler(app_PostAuthenticateRequest); 
    } 

    private void app_PostAuthenticateRequest(object sender, EventArgs e) { 
     //check ticket 
     //if old, kill login, redirect to session timeout page 
    } 
} 

Ou faire la même chose dans une page de base commune (si vous en avez un)

en faisant le délai d'expiration de la session 21 minutes, vous pouvez utiliser tout le code standard auth

+0

J'ai modifié ma question et collé le code complet pour formauthentication sur bouton de connexion. Les gars plz répondent que j'apprécierais vraiment. – user239684

+0

la deuxième section de code (HttpContext.Current.User.Identity.IsAuthenticated), où vous vérifiez le ticekt, où est-ce? – djeeg

+0

Je ne vérifie pas le ticket une fois que l'utilisateur a authentifié le current.user.Identity.IsAuthenticated obtient la valeur mise à jour pour la session NO? ou dois-je vérifier le ticket explicitement? – user239684

0

Pour définir la page par défaut à ouvrir lorsque l'utilisateur n'est pas autorisé, définissez loginUrl.

N'oubliez pas non plus de vérifier que slidingExpiration n'est pas configuré sur false!

<forms 
    name=".ASPXFORMSAUTH" 
    loginUrl="Default.aspx" 
    defaultUrl="Default.aspx" 
    slidingExpiration="true" 
    timeout="30" /> 

MSDN


Pour vérifier-t délai d'attente est venu à la fin, utilisez l'événement Global.asax Application_BeginRequest:

public class Global : HttpApplication 
{ 
    protected virtual void Application_BeginRequest(object sender, EventArgs e) 
    { 
     if (!his.User.Identity.IsAuthenticated) 
      this.Response.Redirect("Timeout.aspx"); 
    }  
}