2008-09-26 16 views
12

私は現在、ASP.NET 2.0フレームワークを使用するWebアプリケーションを開発中です。ユーザーセッションが終了すると、特定のページ、たとえばSessionExpired.aspxにリダイレクトする必要があります。プロジェクトには多くのページがあるので、サイトのすべてのページにコードを追加するのは良い解決策ではありません。私はマスターページを持っていますが、私はそれが助けになると思います。ユーザーセッションの有効期限が切れたときにページにリダイレクトする方法を教えてください。

ありがとうございます!

答えて

5

Page_Loadメソッドで、このメソッドを呼び出します。リクエストに含まれるセッションCookieを確認できます。セッションクッキーが存在する場合は、セッションの有効期限が切れています:

public void Session_OnStart() 
    { 
     if (HttpContext.Current.Request.Cookies.Contains("ASP.NET_SessionId") != null) 
     { 
      HttpContext.Current.Response.Redirect("SessionTimeout.aspx") 
     } 

    } 

ああ、私はセッションクッキーの名前を見つけるのいずれかのエレガントな方法を発見していません。

+0

期限切れのセッションを識別するキーは、新しいセッションを処理するときにセッションCookieが存在するかどうかを確認するためです。 –

+0

残念ながら、FormsAuthneticationTicketのように "Session.CookieName"を実行することができないため、セッションCookie名を取得する良い方法はありません。私が見つけた最良の勧告は、Session Cookieの名前を保持するappSettingキー/値を持つことだけです。だから誰もやっていないが、それをやるのに最も便利な方法のように思える。ちょうど私の2セント。 – dyslexicanaboko

5

通常、ユーザーが「ログイン」しているときに、マスターページのPage.Header.ControlsコレクションにHtmlMetaコントロールを追加します。適切なタイムアウトの長さでSessionExpired.aspxページに更新するように設定してください。

+0

セッションがあるため、タイムアウト以外の理由で期限切れになった場合はどう?これは可能ですか? –

+0

有効期限はタイムアウトを意味します。セッションをプログラム的に失う可能性があります(Session.Abandon())、またはユーザーがセッションクッキーを改ざんまたは削除した場合でも、その時点でセッションは実際には*失効していません。たぶん私は問題を完全に理解していないでしょう... –

+0

ユーザーが、標準のGET/POSTのものではなくajaxを使用している同じページで多くの時間を費やしたらどうでしょうか?この方法を使用すると、潜在的にはログアウトされる可能性があります。 – coalvilledave

2

もう1つの方法は、特定の時間が経過した後にブラウザに(JavaScript経由で)リダイレクトするよう指示することですが、ユーザーがいつでも無効にすることができます。

0

追加またはこのまたは類似のものが含まれるようにWeb.configファイルを更新します。

<customErrors defaultRedirect="url" mode="RemoteOnly"> 
    <error statusCode="408" redirect="~/SessionExpired.aspx"/> 
</customErrors> 
4

私が正しく理解していれば

、「のSession_End」内部火災とは、それに関連付けられたHTTPコンテキストを持っていません

http://forums.asp.net/t/1271309.aspx

したがって、私はあなたがユーザーをリダイレクトするために使用することはできないと思います。私はそれを試していないが、「global.ascx」に次のコードを置くことのために働くかもしれない

http://forums.asp.net/p/1083259/1606991.aspx

:私は他の人がglobal.ascxファイルの「とSession_OnStart()」イベントを使用することをお勧め見てきましたあなた:

void Session_OnStart() { 
    if (Session.IsNewSession == false) 
    { 
    } 
    else 
    { 
     Server.Transfer("SessionExpired.aspx", False); 
    } 
} 
1

セッションの有効期限が切れたときにリダイレクトするにはブラウザの要求がありませんので、あなたはユーザーをリダイレクトすることはできません。

  • ユーザーがセッションのタイムアウト時間内にあなたのサイトを訪問した場合(デフォルトでは20分)、セッションは終了していないため、リダイレクトする必要はありません。
  • セッションがタイムアウトした後にユーザーがサイトにアクセスした場合、セッションは既に終了しています。これは、それらが新しいセッションのコンテキスト内にあることを意味します.Session_OnEndはすでに古いセッションに対して起動されており、代わりに新しいセッションに対してSession_OnStartを取得します。

代わりに、クライアント側の機能(JavaScriptタイマーなど)以外では、代わりにSession_OnStartでリダイレクトを処理する必要がありますが、これをサイトに新たに訪れる人と区別する必要があります。 1つのオプションは、セッションが開始されたときにセッションクッキーを設定することです(つまり、ブラウザが終了するまで有効になるように、有効期限のないクッキー)。Session_OnStartでそのクッキーを探します。もし存在すれば、セッションではない場合は、新しいユーザーです。

明らかに、Session_OnEndを使用してサーバー側を整理することはできますが、これはクライアントの操作が利用できないことだけです。

1

常にセッションオブジェクトに何かを置いていますか?彼らは、ログイン言い換えれば、あなたはそのような場合には、その後、あなたはそれをチェックするマスターページにあなたの分離コードに何かを追加することができ、

Session("UserID") = 1234 

だから、セッション中にユーザーIDのようなものを置くこともできます値。このような何か:

Dim UserID As Integer = 0 
Integer.TryParse(Session("UserID"), UserID) 

If UserID = 0 Then 
    Response.Redirect("/sessionExpired.aspx") 
End If 
+0

うーん...それはほとんど仕事。しかし、私には1つの問題があります。ユーザーはログインしません。代わりに、Windows認証が使用されます。とにかく、このソリューションをメインページにリダイレクトして使用していますが、最終的な解決策を見つけることができます。 –

3

は、私たちは、フォーム認証を使用して、あなたはSESSION_STARTイベントでのglobal.asaxでこれを扱うことができる

private bool IsValidSession() 
    { 
     bool isValidSession = true; 
     if (Context.Session != null) 
     { 
      if (Session.IsNewSession) 
      { 
       string cookieHeader = Request.Headers["Cookie"]; 
       if ((null != cookieHeader) && (cookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        isValidSession = false; 
        if (User.Identity.IsAuthenticated) 
         FormsAuthentication.SignOut(); 
        FormsAuthentication.RedirectToLoginPage(); 
       } 
      } 
     } 
     return isValidSession; 
    } 
0

ユーザーの介入なしに次のリクエストにリダイレクトする、またはすぐにリダイレクトする予定ですか?ユーザーの介入なしにリダイレクトする場合は、Master PageのClientScript.RegisterStartupScriptを使用してセッションが終了したときにクライアントをリダイレクトするJavaScriptを注入できます。システムを使用して

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    String timeoutPage = "SessionExpired.aspx"; // your page here 
    int timeoutPeriod = Session.Timeout * 60 * 1000; 

    sb.AppendFormat("setTimeout(\"location.href = {0};\",{1});", timeoutPage, timeoutPeriod); 
    Page.ClientScript.RegisterStartupScript(this.GetType(), "timeourRedirect", sb.ToString(), true); 
0

Code from here

namespace PAB.WebControls 

{ 。 using System.ComponentModel; using System.Web; System.Web.Securityを使用している ; using System.Web.UI;

[DefaultProperty("Text"), 

    ToolboxData("<{0}:SessionTimeoutControl runat=server></{0}:SessionTimeoutControl>")] 

public class SessionTimeoutControl : Control 
{ 
    private string _redirectUrl; 

    [Bindable(true), 
     Category("Appearance"), 
     DefaultValue("")] 
    public string RedirectUrl 
    { 
     get { return _redirectUrl; } 

     set { _redirectUrl = value; } 
    } 

    public override bool Visible 
    { 
     get { return false; } 

    } 

    public override bool EnableViewState 
    { 
     get { return false; } 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (HttpContext.Current == null) 

      writer.Write("[ *** SessionTimeout: " + this.ID + " *** ]"); 

     base.Render(writer); 
    } 


    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (this._redirectUrl == null) 

      throw new InvalidOperationException("RedirectUrl Property Not Set."); 

     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Page.Request.Headers["Cookie"]; 

       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        if (Page.Request.IsAuthenticated) 
        { 
         FormsAuthentication.SignOut(); 
        } 

        Page.Response.Redirect(this._redirectUrl); 
       } 
      } 
     } 
    } 
} 

}

関連する問題