微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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站点.在会话中放置与安全相关的信息永远不安全.安全很难.

原文地址:https://www.jb51.cc/csharp/92563.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐