【问题标题】:Authorization and ASP.NET MVC Caching授权和 ASP.NET MVC 缓存
【发布时间】:2009-09-17 23:14:57
【问题描述】:

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

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

现在让我费解了:AuthorizeCore失败 每次我实际执行输出缓存并且页面是从缓存中提供的。原因是当请求被缓存时,AuthorizeCore 提供的httpContext.Sessionnull!?下面是一些简化的代码:

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

所以如果httpContext.Sessionnull,这显然每次都会失败。我需要访问会话,我还能如何检查请求是否被授权?这没有任何意义 - 如果它应该是这样,那么我将 永远 能够在 ASP.NET MVC 中将缓存页面与身份验证一起使用。帮忙?

【问题讨论】:

    标签: c# asp.net-mvc session authorize asp.net-caching


    【解决方案1】:

    有两个独立的问题:

    1. 身份验证是否适用于 MVC 中的缓存?
    2. Session 在身份验证之前是否在缓存面前工作(即使对于未经身份验证的用户,他们仍然希望拥有唯一的会话)?

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

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

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

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

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

    【讨论】:

    • 所以您是说如果我要使用基于常规 asp.net 成员提供程序的自定义成员提供程序,我可以通过缓存检查用户身份验证?为什么这行得通 - 会员提供者在内部也需要会话?
    • 将安全敏感信息放在 Session 中是不安全的,句号。
    • 不,常规会员提供者与 Session 几乎没有任何关系。阅读我回答中的最后两个链接。
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多