スライドセッションの有効期限を実装しようとしています。Windows Azure ACS、.Net 4.5、WIF を使用しています。最初にトークンを受け取ったとき、次のコードに示すように、デフォルトの有効期限を 2 時間に設定し、そのトークンを Cookie に書き込みます。
internal void SetSession(ClaimsPrincipal principal)
{
var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120));
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
Thread.CurrentPrincipal = principal;
}
この時点で、変数のValidFrom
およびValidTo
プロパティを確認するとsessionToken
、次のスクリーンショットに示すように適切な値が得られます。
スライドセッションの有効期限を実装するために、以下に示すようSessionAuthenticationModule_SessionSecurityTokenReceived
にファイルでイベントを処理しています:Global.asax
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
}
ただし、トークンのValidFrom
およびValidTo
プロパティを確認すると、以下のスクリーンショットに示すように、トークンを Cookie として書き込んでいたときに設定したものではありません。
なぜこれが起こっているのか分かりません。誰が私が間違っているのか説明してください。
アップデート:
ここで、私が気づいた興味深いことが 1 つあります。スライディング セッションを実装した方法は、トークンのValidTo
プロパティを確認し、それを現在の日付/時刻 (UTC) と比較することです。差が 5 分未満の場合は、ValidTo
次のコードに示すように、時間を 2 時間増やして Cookie を再発行します。
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
var currentDateTime = DateTime.UtcNow.Ticks;
var sessionExpirationDateTime = sessionToken.ValidTo.Ticks;
if (sessionExpirationDateTime >= currentDateTime)
{
var renewTokenWindow = 5 * 60 * 1000;//5 minutes
TimeSpan ts = new TimeSpan(sessionExpirationDateTime - currentDateTime);
if (ts.TotalMilliseconds < renewTokenWindow)
{
var newSessionTokenExpiry = sessionToken.ValidTo.AddMinutes(120);
//Renew token
SessionAuthenticationModule sam = sender as SessionAuthenticationModule;
var newSessionToken = sam.CreateSessionSecurityToken(sessionToken.ClaimsPrincipal, sessionToken.Context, sessionToken.ValidFrom, newSessionTokenExpiry, sessionToken.IsPersistent);
e.SessionToken = newSessionToken;
e.ReissueCookie = true;
}
}
}
その後、後続のリクエストでプロパティの値を確認すると、ValidTo
実際には以下に示すように設定している値が尊重されます。そして、この値はリクエストごとに永続化されます。つまり、トークンを再発行すると、すべてがうまく機能します。