我正在尝试实现滑动会话到期。我正在使用 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 时设置的,如下面的屏幕截图所示:
不知道为什么会这样。谁能解释我做错了什么。
更新:
这是我注意到的一件有趣的事情。我实现滑动会话的方式是检查令牌的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
在后续请求中检查属性的值,它实际上是在尊重我设置的值,如下所示。并且这个值在请求后得到持久请求,即一旦我重新发出令牌,一切正常。