【问题标题】:Roles out of sync with user session角色与用户会话不同步
【发布时间】:2012-02-09 16:37:15
【问题描述】:

如果您的用户数据处于会话状态 (HttpContext) 并且有人在数据库中为他们更改角色,而现在您持有角色列表的会话与D B?您不想每次都点击数据库来检查角色。

这是如何处理的?

【问题讨论】:

  • 我在我身上看到了同样的情况,实际上需要重新登录才能查看新角色...

标签: asp.net .net asp.net-mvc asp.net-mvc-3


【解决方案1】:

使用 SqlCacheDependency 来监视具有角色的表。当表改变时,缓存失效。然后查询缓存中的角色,而不是数据库。

http://msdn.microsoft.com/en-us/library/system.web.caching.sqlcachedependency.aspx

【讨论】:

  • 理论上你可以 - 但我不知道是否有一个缓存依赖提供程序与 memcache 来使基于其他依赖的更改项无效,因此 sql 缓存依赖(假设你在谈论 memcached 而不仅仅是任何'in memory cache' IE 甚至内置了 Http Cache)
【解决方案2】:

假设在同一个应用程序中进行了更改,您可以在静态属性(可能是字典)上设置各种信号量。然后,在开始请求事件中的一个 httpmodule 中,检查属性并根据属性值刷新会话数据。

确保在属性上使用锁/监视器以防止多个线程同时访问它。

【讨论】:

  • 但我不想在每次请求命中时都检查数据库...这会杀死我们的服务器。我可能想每 x 秒或每分钟进行一次轮询?我不确定,所以这就是我要问的。
  • 您不必这样做。正如 Darthg8r 建议的那样,只有在数据实际发生变化时才刷新数据。
【解决方案3】:

对用户会话变量的更改必须由用户发起。我不知道如何做到这一点,以便如果用户当前已登录,并且管理员更改了他们的角色,则更新他们现有的会话(无需用户加载新页面或开始新请求)。对于角色/和身份验证项目,出于安全原因,您可能确实希望在每次加载新页面时执行检查。这样,如果您阻止访问,效果会立即生效,并且在您关闭访问后他们不会保持会话处于活动状态。

对一行数据进行基本选择的小检查不应该杀死您的服务器,除非您收到数十万个对功率不足的服务器/秒的请求

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多