首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WIF SessionSecurityToken呼气

WIF SessionSecurityToken呼气
EN

Stack Overflow用户
提问于 2013-07-28 06:43:02
回答 1查看 2.7K关注 0票数 7

我正在尝试实现滑动会话过期。我使用,.Net 4.5,WIF。当我第一次收到令牌时,我要做的是将其默认过期时间设置为2小时,并将该令牌写入cookie中,如下代码所示:

代码语言:javascript
复制
internal void SetSession(ClaimsPrincipal principal)
{
    var sessionToken = new SessionSecurityToken(principal, TimeSpan.FromMinutes(120));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken);
    Thread.CurrentPrincipal = principal;
}

此时,如果我检查ValidFromValidTo变量的属性,就会得到适当的值,如下面的截图所示:

现在,为了实现滑动会话到期,我将在我的SessionAuthenticationModule_SessionSecurityTokenReceived文件中处理Global.asax事件,如下所示:

代码语言:javascript
复制
    void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
    {
        var sessionToken = e.SessionToken;
    }

但是,当我检查令牌的ValidFromValidTo属性时,当我将令牌作为cookie编写时并不是这样设置的,如下面的屏幕快照所示:

不知道为什么会发生这种事。有人能解释一下我做错了什么吗。

更新:

我注意到了一件有趣的事。实现滑动会话的方法是检查token的ValidTo属性,并将其与当前日期/时间( UTC)进行比较。如果差异小于5分钟,则将ValidTo时间增加2小时,并重新发出cookie,如下代码所示:

代码语言:javascript
复制
    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属性的值,它实际上就是实现了我正在设置的值,如下所示。这个值会在请求之后得到持久请求,也就是说,一旦我重新发出令牌,一切都会正常工作。

EN

回答 1

Stack Overflow用户

发布于 2013-07-28 14:58:23

Thinktecture有一个实现,所以您可以通过NuGet引用包,也可以只复制源代码:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17905700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档