我有一个托管在 Windows Azure 中的 .NET 4.5 声明感知应用程序。有一个托管 MVC 站点的 Web 角色和一个在后台运行作业的辅助角色。用户可以选择保持永久登录状态。
这是我的 ClaimsAuthenticationManager 中的代码:
public ClaimsPrincipal LogIn(string username, bool rememberMe = false)
{
ClaimsPrincipal principal = Authenticate(null, principalFactory.CreateFormsPrincipal(username));
SetSessionCookie(principal, rememberMe ? TimeSpan.MaxValue : TimeSpan.FromDays(1));
return principal;
}
public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal)
{
if (!incomingPrincipal.Identity.IsAuthenticated)
{
return base.Authenticate(resourceName, incomingPrincipal);
}
return principalFactory.Create(incomingPrincipal.Identity.Name, incomingPrincipal.Identity.AuthenticationType);
}
private static void SetSessionCookie(ClaimsPrincipal principal, TimeSpan lifetime)
{
var sessionSecurityToken = new SessionSecurityToken(principal, lifetime)
{
IsReferenceMode = true
};
FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken);
}
在用户在网站上执行操作(例如,购买/取消订阅)的简单刷新案例中,可以通过以下方式完成:
- 发行新令牌并重写 cookie 或
- 注销用户(删除 cookie)并让他们重新进行身份验证
我需要一些指导的是,当用户的声明由于非用户发起的事件而发生变化时,如何/何时刷新用户声明。
想象以下场景:
用户指定“记住我”并成功登录。他现在有一个永不过期的cookie。然后,他通过该网站购买订阅。他的主张通过上面的选项 #1 进行了更新。一个月后,他的订阅失效了,因为他选择不续订。但是他的 cookie 仍然有效,并且与之相关的声明表明他的订阅仍然有效。
一个新用户创建一个帐户并成功登录并指定“记住我”。他现在拥有一个永不过期的 cookie,其中包括一项要求对某些特殊功能进行为期一周的免费试用的声明。一周后,一项后台作业(通过 worker 角色执行)删除了底层数据存储中的免费试用记录。但是,用户的 cookie 仍然有免费试用的要求。
在这两种情况下,如果用户自己注销并重新登录,问题就会自行解决。但是,如果用户没有采取特定操作退出,他的 cookie 包含无效声明。
您如何处理此类案件?
当我一直在撰写这个问题时,我想到最合乎逻辑的做法是将 cookie 的到期日期设置为声明集合中生命周期最短的声明的预期生命周期。
有更好或不同的策略吗?
任何指导将不胜感激。
谢谢。
作为参考,我已阅读以下有关相关主题的帖子: