2011-01-27 23 views
1

FormAuthentication Ticketが有効期限切れであるかどうかを確認したい各ページで、ユーザーがサインインするときにFormAuthentication Ticketを使用しているasp.netアプリケーションがあります。FormAuthenticationチケットの有効期限チェック

実際に私は2つのシナリオ

  1. 私は、ユーザーが認証されているかどうかを確認したいかで署名せずに直接ページにアクセスしようとしている(この場合、私は「のDefault.aspx」にリダイレクトしたい

  2. を持っています
  3. ユーザーが既に署名されて認証されていてもタイムアウトが発生した場合(この場合は、「sexpired.aspx」ページにリダイレクトして「セッションが期限切れになった」という通知を受け取ります) Default.aspx "を返し、リターンURLに戻りますので、それに応じてアドバイスしてください。

    現在、ここでオーケー

    を私はすべてのページでこれをやっていると私はクッキーの有効期限が切れたとき、それは、ユーザがそれが戻っ「Default.aspxの」へのリダイレクトページをロードしようとするとUser.Identity.IsAuthenticated = falseもタイムアウトに起こす可能だと思う

後ろのログインフォームのコードで私の更新質問さ:

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

ここでは、私はformauthenticationチケットに

if (!HttpContext.Current.User.Identity.IsAuthenticated || !HttpContext.Current.User.IsInRole("Maker")) 
    Response.Redirect("~/Default.aspx"); 
をチェックしていますどこの背後に私のコードです

答えて

0

ログイン/認証コードがないと、設定方法を決定するのが難しいです。

あなたはおそらく、セッションをするセッション/クッキーのタイムアウトを設定されて最初にすべきことは、あなたがタイムアウトをチェックし、

をリダイレクトする HttpModuleを書くことができますいずれかの時間+ 1分(例えば21分)すると

を期限切れ

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 
    } 
} 

または(使用している場合)は、共有ベースページで同じことを行う

セッションタイムアウトを21分にすることにより、あなたはすべての標準認証コード

を使用することができます3210
+0

を、私は私の質問を編集し、上formauthenticationのための完全なコードを貼り付けていますログインボタン。私は本当に感謝してくれる人plzが応答します。 – user239684

+0

コードの2番目のセクション(HttpContext.Current.User.Identity.IsAuthenticated)、ここでticektをチェックします。どこですか? – djeeg

+0

ユーザーがcurrent.user.Identityを認証したら、チケットを確認しません。IsAuthenticatedはセッションの更新された値を取得しますか?またはチケットを明示的にチェックする必要がありますか? – user239684

0

ユーザーが承認されていないときに開く既定のページを設定するには、loginUrlと設定します。

また、slidingExpirationfalseに設定されていないことを忘れないようにしてください。

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

MSDN


確認するには、タイムアウトが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"); 
    }  
}