ASP.NET MVC:OutputCache属性是否忽略RequireHttps属性?

3

我有一个ASP.NET MVC 3应用程序,其中一个操作同时使用RequireHttpsOutputCache属性:

[RequireHttps]
[OutputCache(Duration = 14400, VaryByCustom = "CurrentUser"]
public ActionResult VersionB()
{
  return View();
}

当我导航到该页面时,如预期一样被重定向到HTTPS。
但是,在初始页面加载后,我仍然可以通过HTTP访问该页面。如果我删除OutputCache属性,则无法通过HTTP访问该页面。
看起来OutputCache忽略了HTTPS,从而允许不安全地访问该页面。是否可能缓存通过HTTPS提供的操作?

1
我遇到了同样的问题,并删除OutputCache属性以解决它。 - sajoshi
1个回答

10

[RequireHttps]属性的实现存在缺陷,没有考虑到缓存。

以下是修复方法:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class MyRequireHttpsAttribute : RequireHttpsAttribute
{
    protected virtual bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Request.IsSecureConnection;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!AuthorizeCore(filterContext.HttpContext))
        {
            this.HandleNonHttpsRequest(filterContext);
        }
        else
        {
            var cache = filterContext.HttpContext.Response.Cache;
            cache.SetProxyMaxAge(new TimeSpan(0L));
            cache.AddValidationCallback(this.CacheValidateHandler, null);
        }
    }

    private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
    {
        validationStatus = this.OnCacheAuthorization(new HttpContextWrapper(context));
    }

    protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
    {
        if (!AuthorizeCore(httpContext))
        {
            return HttpValidationStatus.IgnoreThisRequest;
        }
        return HttpValidationStatus.Valid;
    }
}

然后:

[MyRequireHttps]
[OutputCache(Duration = 14400, VaryByCustom = "CurrentUser"]
public ActionResult VersionB()
{
    return View();
}

即使在MVC 5.2版本中,这个问题仍未得到本地化解决。但是这个修复方法仍然非常有效! - James Reategui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接