我在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。然后他通过网站购买订阅。他的主张通过上面的选项#1刷新。一个月后,他的订阅失效,因为他选择不续约。但他的cookie仍然有效,与之相关的声明称他的订阅仍然有效。
新用户创建帐户并登录成功指定“记住我”。他现在有一个永不过期的cookie,其中包括一项声明,授予一些特殊功能的免费试用一周。一周后,后台作业(通过worker角色执行)删除了底层数据存储中的免费试用记录。但是,用户的cookie仍然有免费试用声明。
在这两种情况下,如果用户注销并自行返回,问题就会自行解决。但是,如果用户没有采取任何特定操作来注销,则他的cookie包含无效声明。
你如何处理这类案件?
由于我一直在撰写这个问题,我想到最合乎逻辑的做法是将cookie的到期日期设置为索赔集合中最短期索赔的预期生命周期。
是否有更好或不同的策略?
非常感谢任何指导。
感谢。
作为参考,我已阅读以下相关主题的帖子:
答案 0 :(得分:1)
我知道这有点旧,但我相信对这两个问题的简短回答就是在Cookie中包含自定义声明和会话令牌。此自定义声明值将是订阅ID 。
根据任何敏感请求,将根据有效订阅列表检查订阅ID。
换句话说,而不是
最合乎逻辑的做法是将Cookie的到期日期设置为声明集合中最短期索赔的预期生命周期
它应该不仅仅依赖于来自cookie的会话令牌,而是根据需要经常验证权限,可能还有一些额外的声明可以使这种验证更便宜"。