WIF SessionSecurityToken到期

时间:2013-07-28 06:43:02

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

我正在尝试实现滑动会话到期。我正在使用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变量的ValidTosessionToken属性,我会得到正确的值,如下面的屏幕截图所示:

enter image description here

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

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

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

enter image description here

不确定为什么会这样。任何人都可以解释一下我做错了什么。

更新

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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