0

我正在使用具有特殊角色“必须更改密码”的 ASP.NET 角色。如果用户超过 90 天没有更改密码,他们将自动添加到此角色。这发生在用户登录过程中。然后,授权规则拒绝该角色访问除“更改密码”页面之外的所有应用程序。

通常这很好用,但是在使用角色缓存 cookie 缓存角色时会出现问题。在登录过程中会检查密码上次更改日期,如果 > 90 天,则将用户添加到“必须更改密码”角色。在同一个页面请求中,我随后调用 Roles.IsUserInRole("Must Change Password") 来决定是否将用户重定向到更改密码页面。这就是它失败的地方 - 似乎启用角色缓存 cookie 后,Roles.IsUserInRole("Must Change Password") 没有意识到我已经更改了该用户的角色映射,并返回 false。但是,在下一页请求中,Roles.IsUserInRole("Must Change Password") 返回 true。

这种行为是通过设置 cacheRolesInCookie="false" 来解决的,但这似乎是一个高昂的代价。有没有其他方法可以解决这个问题?

4

3 回答 3

1

另一个,恕我直言,更优雅的解决方案是在向用户添加新角色后强制HttpContext.User转换RolePrincipal和调用方法(阅读更多关于 RolePrincipal.SetDirty)。SetDirty

IsInRole 或 GetRolesForUser 方法的下一次调用应触发对您的默认 RoleProvider 的请求。

于 2010-11-22T13:23:41.160 回答
0

既然您说问题存在于同一个请求中,那么如何在 HttpContext.Current.Items 集合中也设置一个项目以指示用户必须更改其密码,然后检查 cookie 和 HttpContext.Current.Items 集合在代码中?

于 2009-07-14T21:55:00.113 回答
0

实际上,我发现了问题——这不是在 cookie 中缓存角色的问题,而是 Roles.IsUserInRole() 的问题。如果我使用重载 Roles.IsUserInRole(username, role) 那么它工作正常,有或没有缓存在 cookie 中的角色。

于 2009-07-14T21:56:28.800 回答