加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:10:15 所属栏目:百科 来源:网络整理
导读:我对ASP.NET MVC缓存和授权感到困惑,并且急需一些澄清. 我的自制授权属性继承自AuthorizeAttribute.即使我在控制器操作上设置了[OutputCache]属性,它每次都会运行其重写的AuthorizeCore方法.我明白那一部分. 现在让我心烦意乱:当我实际执行输出缓存并且页面
我对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站点.在会话中放置与安全相关的信息永远不安全.安全很难.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读