【问题标题】:WIF SessionSecurityToken ExpirationWIF SessionSecurityToken 过期
【发布时间】:2013-07-28 22:58:23
【问题描述】:

我正在尝试实现滑动会话到期。我正在使用 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;
}

此时,如果我检查sessionToken 变量的ValidFromValidTo 属性,我会得到正确的值,如下图所示:

现在要实现滑动会话过期,我正在处理我的Global.asax 文件中的SessionAuthenticationModule_SessionSecurityTokenReceived 事件,如下所示:

    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var sessionToken = e.SessionToken;
    }

但是,当我检查令牌的 ValidFromValidTo 属性时,它不是我在将令牌写入 cookie 时设置的,如下面的屏幕截图所示:

不知道为什么会这样。谁能解释一下我做错了什么。

更新:

这是我注意到的一件有趣的事情。我实现滑动会话的方式是检查令牌的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 属性的值,它实际上是在尊重我设置的值,如下所示。并且这个值在请求后得到持久请求,即一旦我重新发出令牌,一切正常。

【问题讨论】:

    标签: azure .net-4.5 wif claims-based-identity acs


    【解决方案1】:

    Thinktecture IdentityModel 有一个实现,因此您可以通过 NuGet 引用该包,也可以直接复制源代码:

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

    【讨论】:

    • 谢谢布洛克。但是我仍然不明白为什么 ValidTo 值没有设置为我想要的值。是 WIF 的错误还是我做错了什么?
    • 嗨 Brock / Gaurav - 您是否设法弄清楚为什么没有正确设置 ValidTo 值?
    • 对不起......我应该早就更新了答案。本质上,默认令牌到期时间是在 Windows Azure ACS 门户中设置的。无论设置什么值,都是第一次选择。 HTH。
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2014-03-25
    • 2013-10-19
    • 2015-02-20
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多