3

ユーザーがブラウザを閉じてから再度開いた後、ブラウザ セッションを保持する方法はありますか。

asp.Net のデフォルトの動作は、ブラウザーを閉じると期限切れになるブラウザー Cookie に Asp.Net SessionId を保持することです。ブラウザーを再度開くと、asp.net は新しい SessionId を生成し、サーバー側で古いセッションが期限切れになっていない場合でも、それを保持することはできません。

Asp.Netでセッション Cookie有効期限の動作を制御できますか?

4

2 に答える 2

4

セッション 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です。

  1. PostRequestHandlerExecute: (ASP.NET イベント ハンドラーの実行が終了したときに発生します) このハンドラーでは、新しい Cookie ( tempなど) を作成します。その値には、現在の SessionId の値が割り当てられます。有効期限プロパティをセッション タイムアウトに設定することで、これを永続的な Cookie にします。

  2. PostMapRequestHandler: (ASP.NET が現在の要求を適切なイベント ハンドラーにマップしたときに発生します) このハンドラーでは、" temp " cookieの存在を確認することで、戻ってきたユーザーを確認します。見つかった場合は、実際のセッション Cookie ( ) を「一時」CookieASP.NET_SessionIdの値で更新します。これにより、以前のセッションを効果的に復元します。

これは単なる回避策であることに注意してください。システムは、新しいセッションを作成するように設計されています。私たちが行っているのは、いくつかのフックを使用して、既存のセッションを永続化して後で取得することでこれを回避することだけです。セキュリティへの影響はすべて有効です。

于 2013-07-23T11:40:52.897 に答える
2

少なくとも、セッション情報を取得できます。これは、「モード」を「SqlServer」に設定すると簡単に実行できます。

データベース(ASPState)と、したがってセッションを保存しているテーブル(ASPStateTempSessions)を照会できます。[私は永続ストレージを使用しました: -sstype p ]

SELECT TOP 5 [SessionId]
      ,[Created]
      ,[Expires]
      ,[LockDate]
      ,[LockDateLocal]
      ,[LockCookie]
      ,[Timeout]
      ,[Locked]
      ,[SessionItemShort]
      ,[SessionItemLong]
      ,[Flags]
  FROM [ASPState].[dbo].[ASPStateTempSessions]

セッション ID がわかっている場合でも、それを使用して以前のセッションを復元できます。新しいリクエストを行うと、Asp.Net は新しい SessionID を生成します。

于 2013-07-23T12:55:11.673 に答える