2009-07-14 66 views
0

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

通常情况下,这种方式效果很好,但角色缓存Cookie用于缓存角色时存在问题。会发生什么情况是在登录过程中,密码上次更改日期被检查,如果> 90天,用户被添加到“必须更改密码”角色。在相同的页面请求中,我随后调用Roles.IsUserInRole(“必须更改密码”)来决定是否将用户重定向到更改密码页面。这是崩溃的地方 - 似乎启用角色缓存cookie后,Roles.IsUserInRole(“必须更改密码”)没有意识到我已更改此用户的角色映射,并返回false。但是,在下一页请求中,Roles.IsUserInRole(“必须更改密码”)返回true。

此行为已通过设置cacheRolesInCookie =“false”得到解决,但似乎付出了很高的代价。有其他解决这个问题的方法吗?

回答

0

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

0

既然你说问题存在于同一个请求中,那么在HttpContext.Current.Items集合中设置一个项目以表明用户必须更改它们的密码,并检查cookie和HttpContext.Current .Items集合稍后在代码中?

1

另一个,IMHO更优雅,解决方法是投HttpContext.UserRolePrincipal和添加新的角色向用户(read more on RolePrincipal.SetDirty)之后调用SetDirty方法。

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