假设某个站点的管理员从Admin角色中删除了一个用户,并将她添加到Contributor角色。根据该网站的数据库,该用户已被降级,并且不再能够访问仅限管理员的功能。现在,用户在更改后的某个时间回到了站点,但是在更改之前的某个时间登录并且仍然登录。只要该用户没有注销,她将继续声称她在管理员角色。如果她退出或退出,她将失去声称她属于Admin角色,并且当她重新登录时收到属于Contributor角色的新声明。
我希望发生这种情况,也许下次用户在管理员进行更改后从网站请求页面时,该用户会透明地丢失管理员角色声明并获得贡献者角色声明而无需签名出去或做任何特别的事。事实上,我希望他们不知道这一变化,只是因为她不能再执行仅限管理员的活动,她的菜单有所改变。
您将如何以受影响用户看不到的方式处理这种情况?
我使用的是ASP.NET MVC 5和ASP.NET Identity,但似乎可以很容易地将解决方案推广到其他使用cookie的基于声明的框架。我相信ASP.NET Identity默认在MVC 5应用程序中存储用户cookie中的声明。
我已经在SO上阅读了以下帖子和其他许多内容,它最接近回答这个问题,但它只针对用户更新自己的情况,而不是像其他人喜欢管理员对她的帐户进行更改时所做的那样:{ {3}}
答案 0 :(得分:3)
Identity 2.0中有一个功能可以解决这个问题,基本上你可以做类似这样的事情,它会在cookie层添加验证,这会拒绝凭据已经更改的用户,因此他们被迫重新登录/获取新的cookie 。删除角色应该触发此验证(请注意,它仅在validationInterval通过后执行此验证检查,因此cookie在较小的时间范围内仍然有效。
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
// Enables the application to validate the security stamp when the user logs in.
// This is a security feature which is used when you change a password or add an external login to your account.
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});