如何将管理员的更改传播到用户的声明

Jer*_*ook 6 authorization claims-based-identity owin asp.net-mvc-5 asp.net-identity

情况

假设某个站点的管理员从Admin角色中删除了一个用户,并将她添加到Contributor角色.根据该网站的数据库,该用户已被降级,并且不再能够访问仅限管理员的功能.现在,用户在更改后的某个时间回到了站点,但是在更改之前的某个时间登录并且仍然登录.只要该用户没有注销,她将继续声称她在管理员角色.如果她退出或退出,她将失去声称她属于Admin角色,并且当她重新登录时收到属于Contributor角色的新声明.

欲望

我想要发生的事情,也许是在管理员进行更改后用户下次从网站请求页面时,该用户会透明地丢失管理员角色声明并获得贡献者角色声明,而无需他们退出或执行什么特别的.事实上,我希望他们不知道这个变化,除了她的菜单已经改变了一点,因为她不再能够执行仅限管理员的活动.

您将如何以受影响用户看不到的方式处理这种情况?

我的想法

我正在使用ASP.NET MVC 5和ASP.NET Identity,但似乎可以很容易地将其解决为使用cookie的其他基于声明的框架.我相信ASP.NET Identity默认在MVC 5应用程序中存储用户cookie中的声明.

我已经在SO上阅读了以下帖子和其他许多内容,它最接近回答这个问题,但它只涉及用户更新自己的情况,而不是像其他人喜欢管理员对她的帐户进行更改的情况:MVC 5当前声明自动化和更新索赔

Hao*_*ung 3

Identity 2.0 中有一个功能可以解决这个问题,基本上您将能够执行类似的操作,在 cookie 层添加验证,这将拒绝凭据已更改的用户,因此他们被迫重新登录/获取新的 cookie。删除角色应该触发此验证(请注意,它仅在验证间隔过后才进行此验证检查,因此 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))
    }
});
Run Code Online (Sandbox Code Playgroud)