我有一个使用SSL保护的ASP.Net MVC网站并使用System.IdentityModel.Services
并正在创建这样的令牌:
SessionSecurityToken token = new SessionSecurityToken(myClaimsPrincipal, TimeSpan.FromDays(1));
SessionAuthenticationModule sam = FederatedAuthentication.SessionAuthenticationModule;
sam.WriteSessionTokenToCookie(token);
当我在浏览器中访问该站点时,Firebug不会按预期显示到期日期。相反,失效日期显示为会话:
有谁可以解释为什么这是好的?我假设ASP.Net在读取cookie时仍然可以在内部看到实际的到期日期?更重要的是,实际设置的cookie到期时间在哪里?
答案 0 :(得分:4)
你在这里混合了两件不同的东西:
令牌过期正在确定令牌有效期。在此之后,即使令牌附加到请求,它也被视为无效,并且不会被尊重。通常,到期时间在令牌本身内加密,这意味着它只由令牌发行者控制。
Cookie Expiration 是由客户端控制的(在这种情况下是您的Web浏览器)。 Cookie过期后,不再附加到请求。但是,如果浏览器决定发送它,它将一直有效,直到Token到期为止。
在您的特定情况下,令牌过期设置为1天,但由于Cookie过期设置为“会话”,这意味着如果您要在某个时间点结束会话(通常通过关闭浏览器窗口)令牌过期后,Cookie将不会被发送,您将被要求再次登录。
在1天后(当令牌过期时),即使您仍处于会话中,您也总是需要再次登录。
更新(根据您的意见):
票证到期和Cookie到期可以单独设置,因为有时票证不一定包含在Cookie中。它可以使用其他方法(QueryString,自定义HTTP标头等)发送到服务器。然而,事实上,自然要做的就是将它们设置为相同的到期时间。
在SessionSecurityToken
中也是如此,如果您将IsPersistent
标记设置为true
,您会发现Cookie过期现在与故障单相同:< / p>
SessionSecurityToken token = new SessionSecurityToken(myClaimsPrincipal, TimeSpan.FromDays(1));
token.IsPersistent = true;