我们正在开发一个OWIN MVC5项目。我们使用自己的IUserStore<T>
实现来集成用户管理,这是我们公司框架的一部分。到目前为止这个工作正常。
我们希望通过声明提供角色成员资格和其他安全配置。我已经看到(并快速测试)实现IUserClaimStore<T>
或将ClaimsIdentityFactory
附加到UserManager的方法。
在这两种情况下,我都会看到声明存储在用户的cookie中以及当角色或其他声明在Web应用程序后面发生变化时(通过另一个直接访问用户管理存储的应用程序),用户cookie包含旧的声明,用户拥有的权限太多或太少都不如她应该拥有的那样。
我想到的一种可能性是,检查每个请求或某个时间间隔内的请求,是否更改了用户声明的后端配置,如果是,则刷新用户cookie。
这是正确的方法还是MVC5 / Owin更加优雅/有效地遵守这一要求。如果这是正确的方法,哪里是检查和更新cookie信息的最有效的地方?
答案 0 :(得分:7)
我们将此功能添加到2.0,这里是如何配置CookieMiddleware每30分钟获取新的声明(regenerateIdentity应调用您用于在用户登录时为其生成ClaimsIdentity的代码,以及validateInterval控制reinrateIdentity的调用频率,但仅限于旧cookie仍然有效的情况)
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider {
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
答案 1 :(得分:2)
不,如果您要求cookie始终100%更新,那么这实际上就是您必须要做的事情。
Katana cookie中间件选项类在每次呈现cookie时都有一个OnValidateIdentity回调 - 您可以在那里签到然后重新发布cookie。如果自发布cookie以来用户的密码已更改,ASP.NET Identity 2.0位将如何使cookie过期。
答案 2 :(得分:0)
另一个选择可能是在设计中使用SignalR,其中登录的用户浏览器被指示通过Ajax调用重新获取cookie。