ネイティブフォーム認証およびセッション機能を使用するASP.NET4.5WebFormsアプリケーションがあります。どちらも20分のタイムアウトがあり、有効期限がスライドします。
次のシナリオを想像してみてください。ユーザーがアプリケーションでしばらく作業した後、他のことを実行し、アプリケーションを20分間アイドル状態のままにします。次に、ユーザーはアプリケーションに戻ってレポートを作成します。ただし、ユーザーが保存しようとすると、ログイン画面が表示され、レポートは失われます。
明らかに、これは望ましくありません。このシナリオの代わりに、認証またはセッションのいずれかが期限切れになった瞬間に、ブラウザーをログインページにリダイレクトする必要があります。これを実現するために、これが当てはまるかどうかを確認するために呼び出すことができるWebApiサービスを構築しました。
public class SessionIsActiveController : ApiController
{
/// <summary>
/// Gets a value defining whether the session that belongs with the current HTTP request is still active or not.
/// </summary>
/// <returns>True if the session, that belongs with the current HTTP request, is still active; false, otherwise./returns>
public bool GetSessionIsActive()
{
CookieHeaderValue cookies = Request.Headers.GetCookies().FirstOrDefault();
if (cookies != null && cookies["authTicket"] != null && !string.IsNullOrEmpty(cookies["authTicket"].Value) && cookies["sessionId"] != null && !string.IsNullOrEmpty(cookies["sessionId"].Value))
{
var authenticationTicket = FormsAuthentication.Decrypt(cookies["authTicket"].Value);
if (authenticationTicket.Expired) return false;
using (var asdc = new ASPStateDataContext()) // LINQ2SQL connection to the database where our session objects are stored
{
var expirationDate = SessionManager.FetchSessionExpirationDate(cookies["sessionId"].Value + ApplicationIdInHex, asdc);
if (expirationDate == null || DateTime.Now.ToUniversalTime() > expirationDate.Value) return false;
}
return true;
}
return false;
}
}
このWebApiサービスは、認証またはセッションのいずれかが期限切れになっていないかどうかを確認するために、クライアントによって10秒ごとに呼び出されます。その場合、スクリプトはブラウザをログインページにリダイレクトします。これは魅力のように機能します。
ただし、このサービスを呼び出すと、認証とセッションの両方の有効期限がスライドしてトリガーされます。したがって、基本的に、終了しない認証とセッションを作成します。サービスの開始時にブレークポイントを設定して、これをトリガーする独自の関数の1つであるかどうかを確認しました。ただし、これは当てはまりません。サービスの実行前に、ASP.NETのどこかで発生しているようです。
- 特定の要求に対してASP.NETの認証とセッションスライドの有効期限のトリガーを無効にする方法はありますか?
- そうでない場合、このようなシナリオに取り組むためのベストプラクティスは何ですか?