カスタム 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)
{
}
}
}