繁体   English   中英

是否可以在ASP.NET MVC和Identity 2.0中缓存授权?

[英]Is it possible to cache authorizations in ASP.NET MVC & Identity 2.0?

如果这个问题有点离题,请告诉我。 我将把它带到其他地方,但是我想对如何在现有项目中完成某件事获得一些想法。

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

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

如果有记录,则授权用户,否则,无权。 为了清楚起见,将角色分配与一个学期绑定在一起,以便将相应的特权限制到一个学期。 即,一旦学期结束,用户将不再拥有自己的权力,但是被任命为下一个学期的下一个人将立即获得其权力。

我的大多数用户都属于所访问的大多数页面(而非全部)上检查的角色。 每当我需要授权时,所有这些步骤都会执行。

为了清楚起见,这是数据库的图像: 在此处输入图片说明

是否有一种方法可以缓存(这样我就不必不断查询数据库)这些授权的时间长度等于从第一次执行/缓存检查到本学期结束的时间? 还是只在合理的时间内缓存它们? 理想情况下,如果由于任何原因更新了一个学期或职位,那么授权将以某种方式变得无效并重新缓存。 最后,自定义RoleProvider是实现此目标的可靠方法吗?

是否有一种方法可以缓存(这样我就不必不断查询数据库)这些授权的时间长度等于从第一次执行/缓存检查到本学期结束的时间?

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

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

我会小心缓存授权本身。 您想要保持灵活性,而无需仔细设计,就可以轻松戳破应用程序中的安全漏洞。

但是,为获取用于进行授权确定的信息而进行的查询可能会被缓存。 为此,我建议使用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`

基本上就是这样,但是在像Web这样的环境中,您需要考虑并发性。 在自己的博客上写了一篇帖子,其中提供了扩展功能,使处理起来更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM