1

我正在使用自定义角色提供程序,它过度简化使用 .net 4 MVC 项目上的 EF 从数据库中获取人员对象,并根据一些规则(和其他查询)分配用户角色。

数据会定期更改,尽管更改是通过系统中其他地方的代码而不是角色提供者进行的模式更改。角色提供者是一种方式,它只是获取用户所在的角色。

当我更改数据库值时,角色管理器不会接受角色的更改,直到我重新编译(例如通过在 web 配置中添加空格),或者应用程序重新启动。

我通过设置确保角色不会缓存在 cookie 中cacheRolesInCookie=false,这似乎是大多数帮助所指向的,并且假设角色管理器中内置了会话缓存。

我已经修改了返回 person 对象的 EF 查询,将时间戳作为查询的一部分。我可以通过探查器看到实际上正在调用查询,并且时间戳每次都会更改,但是我的调试会话显示“人员”项的先前状态的陈旧数据。站点的其他部分显示来自 Person 表的数据,这些数据显示最新状态。

我真的不明白调试器应该如何处理缓存的数据。如果是缓存问题,我不明白为什么 EF 查询会触发,但人员数据肯定会显示第一次运行的状态,而不是表行的当前状态。

我觉得我错过了一些明显的东西。角色管理器是否缓存会话中的数据?

4

2 回答 2

4

答案实际上取决于您的应用程序的体系结构。我最近遇到了这个问题,并且也归咎于角色管理器缓存。原来这完全是我的数据访问层中实体上下文的管理。我正在管理我的实体上下文并按照通常推荐的方式存储每个请求的上下文。然而问题在于,由于不相关的缺陷,上下文被设置了两次,因此角色提供者的上下文总是与应用程序的其余部分不同,并且只设置了一次(因为角色提供者是在应用程序启动时实例化的,而不是每个请求)。

我建议您查看您如何存储数据上下文并进行跟踪,以查看与您的角色管理器与应用程序其余部分相关的存储方式。确保您确实每个请求只使用一个上下文

于 2012-08-02T14:01:56.643 回答
1

我对“我可以清除此缓存吗?”有一个答案。

是的,您可以清除角色管理器缓存。

(注意:此方法与删除角色缓存 cookie 不同,它允许您在请求期间清除缓存)。

在第一次调用角色提供者以获取角色后,角色管理器将在 HttpContext.Current.User 中缓存当前用户的角色。

该缓存将用于整个请求的后续角色检查,并且不会调用您的自定义角色提供程序。

但是,您可以强制角色管理器再次调用您的角色提供者(并有效地从数据源重新获取角色),方法是将当前用户强制转换为 RolePrincipal 然后调用 SetDirty()

例如:

RolePrincipal currentUser = HttpContext.Current.User as RolePrincipal;
currentUser.SetDirty();

请参阅有关 RolePrincipal.SetDirty 方法的 MS 文档

于 2017-10-10T22:25:19.250 回答