授权和ASP.NET MVC缓存
-
10-07-2019 - |
题
我对ASP.NET MVC缓存和授权感到困惑,并且急需一些澄清。
我的自制授权属性继承自AuthorizeAttribute
。即使我在控制器操作上设置了AuthorizeCore
属性,它的重写[OutputCache]
方法也会每次运行。我理解那部分。
现在让我心烦意乱:httpContext.Session
每次失败现在我实际上都在进行输出缓存,并且页面是从缓存中提供的。原因是当缓存请求时,null
提供的<=>是 <=> !?这是一些简化的代码:
protected override bool AuthorizeCore(HttpContextBase httpContext) {
return (Session["userId"] != null)
}
因此,如果<=>是<=>,这显然每次都会失败。我需要访问会话,我还能如何检查请求是否被授权?这没有任何意义 - 如果这是它应该如何,那么我永远不会能够在ASP.NET MVC中使用缓存页面和身份验证。帮助
解决方案
有两个不同的问题:
- 身份验证是否适用于MVC中的缓存?
- 会话在缓存面前进行身份验证之前是否有效(即使是未经身份验证的用户,他们仍然希望有一个独特的会话)? 醇>
答案分别是肯定和否定。身份验证适用于缓存。尝试使用SQL或域成员资格提供程序;你会看到的。
然而,缓存可以在身份验证模块之前运行。 (对于奖励积分:为什么?)只有在专门挂钩缓存时才会调用身份验证(如AuthorizeAttribute所做的那样)。由于会话是特定于用户的,因此没有保证您将在AuthorizeCore中进行会话。
更多奖励积分:如果您在缓存配置中指定了varyByUser,这会有什么变化?
不幸的是,正确执行身份验证很难,因为做任何类型的安全权都很难。 Microsoft尝试使用成员资格提供程序API使这更容易。
不隶属于 StackOverflow