1

カスタム RequireHttps アクション フィルターがあります。ログインし、自分のサイトは https ですが、ログイン中に http ページを入力すると、アクション フィルターがヒットしません。私はログオンしていて、もうログに記録されていないので、これを知っています。私がそれを取得したい理由は、ユーザーが認証されているかどうかをテストし、SSL で同じページに 301 リダイレクトを行うためですが、ヒットすることはありません。

Global.asax

 kernel.BindFilter<UseHttpsFilter>(FilterScope.Action, 0)
                          .WhenActionMethodHas<UseHttpsAttribute>()
                          .WithConstructorArgumentFromActionAttribute<UseHttpsAttribute>("requireSecure", q => q.RequireSecure);

                    kernel.BindFilter<UseHttpsFilter>(FilterScope.Controller, 0)
                          .WhenActionMethodHas<UseHttpsAttribute>()
                          .WithConstructorArgumentFromControllerAttribute<UseHttpsAttribute>("requireSecure", q => q.RequireSecure);

UseHttpsAttribute.cs

namespace Site.Web.Attributes
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
    public class UseHttpsAttribute : FilterAttribute
    {
        public bool RequireSecure { get; set; }

        public UseHttpsAttribute(bool requireSecure)
        {
            RequireSecure = requireSecure;
        }
    }

    public class UseHttpsFilter : ActionFilterAttribute
    {
        protected static readonly NLogLogger Logger = new NLogLogger();

        public bool RequireSecure = false;

        public UseHttpsFilter(bool requireSecure)
        {
            Logger.Debug("Use Https Constructor: " + requireSecure);
            RequireSecure = requireSecure;
        }

        protected virtual void HandleNonHttpRequest(ActionExecutingContext filterContext)
        {
            if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                string url = "http://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
                filterContext.Result = new RedirectResult(url, true);
            }
        }

        protected void HandleNonHttpsRequest(ActionExecutingContext filterContext)
        {
            if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
                filterContext.Result = new RedirectResult(url, true);
            }
        }


        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Logger.Debug("Use Https Authenticated: " + filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated);

            if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated || HttpContext.Current.Session[Config.ViewData.MemberSession] != null)
            {
                RequireSecure = true;
            }

            Logger.Debug("Use Https Local: " + filterContext.RequestContext.HttpContext.Request.IsLocal);

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

            if (RequireSecure)
            {
                Logger.Debug("Use Https Secure Connection: " + filterContext.HttpContext.Request.IsSecureConnection);

                if (!filterContext.HttpContext.Request.IsSecureConnection)
                {
                    HandleNonHttpsRequest(filterContext);
                }
            }
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {

        }
    }
}
4

1 に答える 1

0

最初のバインディング用にこれを持っていたからだとわかりました

.WhenActionMethodHas<UseHttpsAttribute>()

代わりに

.WhenControllerHas<UseHttpsAttribute>()
于 2012-12-17T15:44:03.920 に答える