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

现在,为了实现滑动会话到期,我将在我的SessionAuthenticationModule_SessionSecurityTokenReceived文件中处理Global.asax事件,如下所示:
void SessionAuthenticationModule_SessionSecurityTokenReceived(object sender, SessionSecurityTokenReceivedEventArgs e)
{
var sessionToken = e.SessionToken;
}但是,当我检查令牌的ValidFrom和ValidTo属性时,当我将令牌作为cookie编写时并不是这样设置的,如下面的屏幕快照所示:

不知道为什么会发生这种事。有人能解释一下我做错了什么吗。
更新:
我注意到了一件有趣的事。实现滑动会话的方法是检查token的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属性的值,它实际上就是实现了我正在设置的值,如下所示。这个值会在请求之后得到持久请求,也就是说,一旦我重新发出令牌,一切都会正常工作。

发布于 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/
https://stackoverflow.com/questions/17905700
复制相似问题