セッション ID をそのまま再利用することはできませんが、セッション状態の予測可能な部分の一部を確実に復元できます。フォーム認証を使用している場合は、フォーム認証 Cookie を読み取り、global.asax
session start
セッション オブジェクトを再設定します。
以下を使用して永続的な Cookie を作成することにより、フォーム認証 Cookie の有効期限を手動で制御できます。
FormsAuthentication.SetAuthCookie(userName, true)
または、Cookie を手動で変更して有効期限を微調整することもできます。
Dim authCookie As HttpCookie = FormsAuthentication.GetAuthCookie(userName)
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
Dim newAuthTicket As New FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, expireDate, authTicket.IsPersistent, userData)
authCookie.Value = FormsAuthentication.Encrypt(newAuthTicket)
authCookie.Expires = newAuthTicket.Expiration
HttpContext.Current.Response.Cookies.Set(authCookie)
CookieexpireDate
の有効期限が切れる時期を指定します。
これでglobal.asax
session start
、返されたユーザーがまだ認証されているかどうかを確認できます (以前に設定された永続的な Cookie によって)。
If HttpContext.Current.User.Identity.IsAuthenticated Then
' Here re-populate the predictable part of session state
' Like user profile etc.
End If
Op インサイトの後に追加:
フォーム認証は使用されておらず、目的は以前のセッションを復元できるようにすることです。
このような場合、唯一のオプションは、永続的な Cookieを使用して既存のセッションを永続化し、後で取得できるようにすることです。これを達成するためのいくつかの回避策があります。回避策の 1 つは、このブログ ライターによってここで説明されています。
http://weblogs.asp.net/imranbaloch/archive/2010/06/09/persisting-session-between-different-browser-instances.aspx
ここで起こっていることは、次の 2 つのイベントをインターセプトすることglobal.asax
です。
PostRequestHandlerExecute
: (ASP.NET イベント ハンドラーの実行が終了したときに発生します) このハンドラーでは、新しい Cookie ( tempなど) を作成します。その値には、現在の SessionId の値が割り当てられます。有効期限プロパティをセッション タイムアウトに設定することで、これを永続的な Cookie にします。
PostMapRequestHandler
: (ASP.NET が現在の要求を適切なイベント ハンドラーにマップしたときに発生します) このハンドラーでは、" temp " cookieの存在を確認することで、戻ってきたユーザーを確認します。見つかった場合は、実際のセッション Cookie ( ) を「一時」CookieASP.NET_SessionId
の値で更新します。これにより、以前のセッションを効果的に復元します。
これは単なる回避策であることに注意してください。システムは、新しいセッションを作成するように設計されています。私たちが行っているのは、いくつかのフックを使用して、既存のセッションを永続化して後で取得することでこれを回避することだけです。セキュリティへの影響はすべて有効です。