7

スライドセッションの有効期限を実装しようとしています。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実際には以下に示すように設定している値が尊重されます。そして、この値はリクエストごとに永続化されます。つまり、トークンを再発行すると、すべてがうまく機能します。

ここに画像の説明を入力

4

1 に答える 1

1

Thinktecture IdentityModel には実装があるため、NuGet を介してパッケージを参照するか、ソース コードをコピーするだけでかまいません。

http://brockallen.com/2013/02/17/sliding-sessions-in-wif-with-the-session-authentication-module-sam-and-thinktecture-identitymodel/

于 2013-07-28T14:58:23.270 に答える