2

我对 HTTPS 和 HTTP 有疑问。似乎我的过滤器属性正在被缓存。当我登录时,它应该不会自动向 https 发送任何 http 页面,它确实如此。然后,当我注销时,它会停留在 https 上,这很好,但是如果我尝试手动转到非 http 页面,即使我已登录,它也会再次重定向到 https 页面。RequireSecure 始终为真,因为我的日志信息说明了它是。FilterAttributes 是否被缓存,如果是,我该如何解决?

public class RequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute
    {
        protected static readonly NLogLogger Logger = new NLogLogger();

        public bool Ignore = false;
        public bool RequireSecure = false;

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
            {
                Logger.Info("Require HTTPS User Authenticated");

                RequireSecure = true;
            }

            if (filterContext.RequestContext.HttpContext.Request.IsLocal)
                RequireSecure = false;

            if (RequireSecure)
            {
                Logger.Info("Require HTTPS");

                base.OnAuthorization(filterContext);
            }
        }
    }
}
4

1 回答 1

2

你所经历的是正确的行为。详细信息可以在这里找到:

一个简短的摘录:

...在 ASP.NET MVC 3 中,过滤器被更积极地缓存。因此,任何不正确地存储实例状态的自定义操作过滤器都可能被破坏。

我建议存储对以下重要的数据filter attribute:请求范围

filterContext.HttpContext.Items

并作为会话范围(如您的情况):

filterContext.HttpContext.Session

filterContext.HttpContext.Profile

于 2012-12-01T06:38:52.520 回答