【问题标题】:Is it possible to cache authorizations in ASP.NET MVC & Identity 2.0?是否可以在 ASP.NET MVC & Identity 2.0 中缓存授权?
【发布时间】:2016-12-04 08:22:11
【问题描述】:

如果这个问题有点离题,请告诉我。 我将把它带到别处,但我想获得一些关于如何在现有项目中完成某事的想法。

我的 Web 应用程序(使用 ASP.NET MVC 5 和 ASP.NET Identity 2.0)使用自定义角色提供程序执行授权(通过那些花哨的 Authorize 属性)。 每个授权检查(如Authorize(Roles = "Admin"))都需要查询数据库以执行以下操作:

  • Semesters 表中获取当前“学期”(检查当前日期和时间所在的日期范围)
  • Positions 表中获取名为“Admin”的职位
  • 检查Leaders表中是否存在包含当前用户ID、获取的学期ID、获取的职位ID的记录。

如果记录存在,则用户被授权,否则不被授权。 需要明确的是,角色分配与学期相关联,以便将相应的权限限制在学期的持续时间内。 即,一旦学期结束,用户不再拥有他们的权力,但下学期任命的下一个人将立即获得他们的权力。

我的大多数用户都属于在他们访问的绝大多数页面上检查的角色,但不是全部。 每次我需要授权时,都会执行所有这些步骤。

为了清楚起见,这里是数据库的图像:

有没有办法将这些授权缓存(这样我不必不断地查询数据库)一段相当于从第一次执行/缓存到学期结束的时间的时间? 或者只是在任何合理的时间内缓存它们? 理想情况下,如果一个学期或职位因任何原因而更新,授权将以某种方式无效并重新缓存。 最后,自定义 RoleProvider 是解决此问题的可靠方法吗?

【问题讨论】:

    标签: c# asp.net asp.net-mvc caching asp.net-identity-2


    【解决方案1】:

    有没有办法缓存(这样我就不必不断地查询 数据库)这些授权的时间长度相当于 从第一次执行/缓存到检查结束的时间 学期?

    默认情况下,ASP.Net Identity 在用户成功登录后将用户的授权角色存储在 Role Claim 中。这些声明存储在 cookie 中,直到用户注销或关闭浏览器。

    不值得为授权属性实现额外的缓存。

    【讨论】:

    • 值得注意的是,从安全的角度来看,这些详细信息不是以明文形式存储的。它们被加密存储,如 ASP.NET_SessionId=fegias...; .AspNet.ApplicationCookie=QPHpjno5QPgbpt...
    【解决方案2】:

    我会小心缓存授权本身。您希望保持灵活性,如果没有精心设计,您很容易在应用程序中戳出安全漏洞。

    但是,您为获取用于进行授权确定的信息而进行的查询可能会被缓存。为此,我建议使用MemoryCache。简单地说:

    ObjectCache cache = MemoryCache.Default;
    
    ...
    
    var foos = cache.Get("key") as List<Foo>;
    if (foos == null)
    {
        foos = repo.GetFoos();
        cache.Add("key", foos, new CacheItemPolicy
        { 
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(1)
        });
    }
    
    // do something with `foos`
    

    这基本上就是它的工作原理,但是在网络这样的环境中,您需要考虑并发性。我写了一个post on my blog,它提供了一个扩展来让处理这个问题变得更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      相关资源
      最近更新 更多