ASP.NET MVC中的角色缓存策略

8
我们有一个ASP.NET MVC应用程序,为此我们开发了自己的自定义RoleProvider类。如果没有缓存,它将在每个请求中访问数据存储 - 这很糟糕。我们找到的唯一缓存选项是(在web.config中)通过存储在客户机上的cookie。我的两个问题是:
  1. 即使启用了加密,这是否安全?
  2. cookie信息是否会随着每个Web请求传输 - 因此可能比每次访问数据存储库更慢?
有人有其他选择吗?我知道将此信息缓存到会话中也是不好的。
3个回答

6
如果您已经开发了自己的自定义RoleProvider类,您可以使用ASP.NET缓存自行进行数据缓存。这比使用Session作为缓存更加灵活,因为它甚至可以在未启用会话状态的页面上工作。
我不同意Wyatt Barnett的评论:
“The downside for using the Session... the fact that Session storage is very violate and not particularly reliable”
对于缓存(无论是Session、ASP.NET Cache还是其他什么),易失性是可以接受的——您只需要在需要时重新填充它即可。
回答您的问题:
1. 它的安全性取决于用于加密cookie的加密方式。如果您依赖FormsAuthentication,则其安全性不应低于Forms Authentication票证。 2. 每个请求都将传输cookie。因此,如果用户可以拥有大量角色,则存在潜在的性能问题,并且可能会超出浏览器支持的最大cookie大小。

2

虽然每次请求查询数据库的效率低下是事实,但要记住,在现代数据库中,对于正确索引的表进行SELECT操作的性能非常快。因此,我建议您首先进行一些测量,确保这种情况实际上会对性能产生负面影响,而不是理论上会在以后影响性能。

使用Session的缺点并不是开销(很小),而是Session存储非常易失并且不太可靠。例如,您可能会轻易地失去session,但仍然拥有已登录的用户。

即便如此,在这里找到一个折中方案是使用HttpContext.Items集合缓存每个请求的用户角色。这将限制每个请求仅进行一次SELECT操作,这可能是相当有效的(与上述测量进行比较),同时避免其他存储问题——例如一个臃肿、不安全的cookie或某些易失的基于Session的解决方案。


2
每次请求时,浏览器都会将cookie信息发送到您的Web服务器,这就是cookie的工作原理,但只要cookie的大小合理,它对性能影响不大。如果使用表单身份验证,建议像这篇博客文章所述,将角色存储在表单身份验证cookie中。在这种情况下,您只需向已存在的cookie添加数据即可。但需要注意,您可以在该cookie中存储的数据量有上限,如此处所述。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接