我有一个使用SSL保护的ASP.Net MVC网站,正在使用System.IdentityModel.Services
并正在创建令牌,如下所示:
SessionSecurityToken token = new SessionSecurityToken(myClaimsPrincipal, TimeSpan.FromDays(1));
SessionAuthenticationModule sam = FederatedAuthentication.SessionAuthenticationModule;
sam.WriteSessionTokenToCookie(token);
当我在浏览器中访问网站时,Firebug不会显示预期的到期日期。而是将到期日期显示为Session:
谁能解释为什么这样吗?我假设ASP.Net在读取Cookie时仍可以在内部看到实际的到期日期?更何况,Cookie的有效时间实际设置在哪里?
您在这里混合了两种不同的东西:
令牌有效期一直在确定,直到令牌有效为止。在那之后,即使将令牌附加到请求中,也将其视为无效并且将不被接受。通常,到期时间是在令牌本身内加密的,这意味着它仅由令牌发行者控制。
Cookie过期是由客户端(在这种情况下,您的Web浏览器)控制的。Cookie过期后,将不再附加到该请求。但是,如果浏览器决定发送它,它将一直工作到令牌到期为止。
在您的特定情况下,令牌过期设置为1天,但是由于Cookie过期设置为“会话”,这意味着如果您要在令牌过期之前的某个时间结束会话(通常通过关闭浏览器窗口) ,Cookie将不会发送,您将需要重新登录。
1天后(令牌过期时),即使您仍处于会话中,也始终需要重新登录。
更新(根据您的评论):
可以简单地设置票证到期日和Cookie到期日,因为有时票证不一定包含在Cookie中。可以使用其他方法(QueryString,自定义HTTP标头等)将其发送到服务器。但是,确实自然的事情是将它们都设置为相同的到期时间。
您的情况也是如此SessionSecurityToken
,如果您将其IsPersistent
标志设置为true
,则会注意到Cookie的过期时间现在与票证相同:
SessionSecurityToken token = new SessionSecurityToken(myClaimsPrincipal, TimeSpan.FromDays(1));
token.IsPersistent = true;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句