C# · 12月 26, 2021

c# – 授权和ASP.NET MVC缓存

我对ASP.NET MVC缓存和授权感到困惑,并且急需一些澄清.

我的自制授权属性继承自AuthorizeAttribute.即使我在控制器操作上设置了[OutputCache]属性,它每次都会运行其重写的AuthorizeCore方法.我明白那一部分.

现在让我心烦意乱:当我实际执行输出缓存并且页面是从缓存提供时,AuthorizeCore每次都会失败.原因是当缓存请求时,AuthorizeCore提供的httpContext.Session为空!?这是一些简化的代码:

protected override bool AuthorizeCore(HttpContextBase httpContext) { return (Session[“userId”] != null)}

因此,如果httpContext.Session为null,则每次都会失败.我需要访问会话,我还能如何检查请求是否被授权?这没有任何意义 – 如果这是它应该如何,那么我永远不能在ASP.NET MVC中使用缓存页面和身份验证.救命?

解决方法 有两个不同的问题:

>身份验证是否适用于MVC中的缓存?
>面向缓存时,会话在身份验证之前是否有效(即使是未经身份验证的用户,他们仍然希望拥有独特的会话)?

答案分别是肯定和否定.身份验证适用于缓存.尝试使用sql或域成员资格提供程序;你会看到的.

但是,缓存可以在身份验证模块之前运行. (对于奖励积分:为什么?)只有在专门挂钩缓存时才会调用身份验证(如AuthorizeAttribute所做的那样).由于会话是特定于用户的,因此无法保证您在AuthorizeCore中有会话.

更多奖励积分:如果您在缓存配置中指定了varyByUser,这会有什么变化?

不幸的是,正确进行身份验证很难,因为做任何类型的安全权都很难. Microsoft尝试使用成员资格提供程序API使这更容易. I strongly recommend using that实现自定义身份验证时.我还建议使用内置提供程序并扩展它们,而不是尽可能重写它们.

另一点:ASP.NET会话提供程序和ASP.NET成员资格提供程序是完全独立的.不同的会员用户可以共享(!)会话,而yes,您可以通过这种方式共享attack站点.在会话中放置与安全相关的信息永远不安全.安全很难.