我正在使用具有特殊角色“必须更改密码”的ASP.NET角色。如果用户未将密码更改超过90天,则会自动将其添加到此角色。这在用户登录过程中发生。授权规则然后拒绝该角色访问除“更改密码”页面之外的所有应用程序。
通常这很好用,但是当使用角色缓存cookie来缓存角色时会出现问题。在登录过程中会发生什么,检查密码最后更改日期,如果> 90天后,用户被添加到“必须更改密码”角色。在同一页面请求中,我随后调用Roles.IsUserInRole(“必须更改密码”)来决定是否将用户重定向到“更改密码”页面。这就是它失败的地方 - 似乎在启用角色缓存cookie的情况下,Roles.IsUserInRole(“必须更改密码”)没有意识到我已经更改了此用户的角色映射,并返回false。但是,在下一页请求中,Roles.IsUserInRole(“必须更改密码”)返回true。
通过设置cacheRolesInCookie =“false”来解决此问题,但这似乎是一个很高的代价。有没有其他方法可以解决这个问题?
答案 0 :(得分:1)
另一个,恕我直言更优雅,解决方案是在向用户添加新角色(read more on RolePrincipal.SetDirty)之后将HttpContext.User
投射到RolePrincipal
并调用SetDirty
方法。
下一次调用IsInRole或GetRolesForUser方法应该会触发对默认RoleProvider的请求。
答案 1 :(得分:0)
由于您说同一个请求中存在问题,如何在HttpContext.Current.Items集合中设置一个项目以指示用户必须更改其密码,并同时检查cookie和HttpContext.Current。稍后在代码中收集项目?
答案 2 :(得分:0)
实际上,我发现了这个问题 - 在cookie中缓存角色不是问题,而是Roles.IsUserInRole()的问题。如果我使用重载Roles.IsUserInRole(用户名,角色),那么它可以正常工作,有或没有角色缓存在cookie中。