2010-12-20 27 views
1

前回の質問と回答で、認証タイムアウト検出メカニズムを実装しました。here。 AuthenticateRequestイベントを使用して認証期間が終了したかどうかをキャプチャするコードを実行するHTTPモジュールを実装しました。これを実行するためのコードは以下の通りです:ASP.NET:認証タイムアウト後にFormsAuthenticationTicketがnullになるのはなぜですか?

public class AuthenticationModule : IHttpModule 
{ 
    #region IHttpModule Members 
    void IHttpModule.Dispose() { } 
    void IHttpModule.Init(HttpApplication application) 
    { 
     application.AuthenticateRequest += new EventHandler(this.context_AuthenticateRequest); 
    } 
    #endregion 


    /// <summary> 
    /// Inspect the auth request... 
    /// </summary> 
    /// <remarks>See "How To Implement IPrincipal" in MSDN</remarks> 
    private void context_AuthenticateRequest(object sender, EventArgs e) 
    { 
     HttpApplication a = (HttpApplication)sender; 
     HttpContext context = a.Context; 

     // Extract the forms authentication cookie 
     string cookieName = FormsAuthentication.FormsCookieName; 
     HttpCookie authCookie = context.Request.Cookies[cookieName]; // no longer a forms cookie in this array once timeout has expired 

     if (authCookie != null) 
     { 
      FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      DateTime expirationTime = authTicket.Expiration; 
      // check if previously authenticated session is now dead 
      if (authTicket != null && authTicket.Expired) 
      { 
       // send them a Response indicating that they've expired. 
      } 
     } 
    } 
} 

問題は(コード内のコメントを参照)認証期間は、(私がテストに1分に設定します)有効期限が切れた後は、フォームのクッキーがなくなった、ということではありません。これは、認証クッキーがnullになることを意味し、私は自分のコードでヌルチェックを通過しません。しかし、FormsAuthenticationTicketに便利な "Expired"プロパティがあります。このプロパティは、期間が切れているかどうかを確認する必要があると感じます。しかし、クッキーがなくなったら、どうすればそれを得ることができますか?フォームクッキーがなくなっても認証期間が終了したと仮定するのは合理的ですか?

これについてのご支援をいただければ幸いです。

答えて

0

あなたはこのような何かをしようとする場合があります:

if (User != null) 
     { 
      FormsIdentity id = (FormsIdentity)User.Identity; 
      FormsAuthenticationTicket ticket = id.Ticket; 
      if (ticket.Expired) 
      { 
       //do something 
      } 
     } 

More info

編集:

1:私は、ユーザーがnullになります参照してください。したがって、User.Identityを使用することは問題になりません。

2:元の質問にあるコードを、AuthenticateRequestではなくBeginRequestイベントで試してみましょう。

+0

投稿する前に実際に試しましたが、認証期間が過ぎるとUser *はnullになります。だからもう一度..私はチケットの期限切れのプロパティをチェックすることができません。 –

+0

私は、悪い動きを参照してください。私は私の答えを編集しました。 – gbs

0

FormsAuthenticationTicketでisPersistentがfalseに設定されている場合、永続Cookieは設定されません。チケットが期限切れになると、リクエストとともにクッキーが送信されないので、アクセスできません。

0

この動作は、System.Web.Security.FormsAuthenticationModuleによって制御されます。このモジュールは、チケットが期限切れになっているかどうかをチェックし、この場合はクッキーを削除します。

このモジュールはslidingExpirationオプションをチェックし、必要に応じてチケットを更新することにも注意してください。

それはもはやフォームクッキーがあるかどう認証期間が満了していないと仮定することは合理的である:だから戻ってあなたの質問に

私はそう思います。

関連する問題