ASP.NET MVC动作过滤器重定向循环

时间:2010-05-26 08:52:21

标签: asp.net-mvc

当我们在控制器类上启用以下属性时,我看到来自生产服务器的重定向循环:

public class TestRedirectHttpsAttribute : RedirectHttpsAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (Convert.ToBoolean(ConfigurationManager.AppSettings["TestSecureEnabled"] ?? bool.FalseString))
        {
            base.OnAuthorization(filterContext);
        }
    }
}


public class RedirectHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
    public virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            UriBuilder uriBuilder = new UriBuilder(filterContext.HttpContext.Request.Url);
            uriBuilder.Scheme = "https";
            uriBuilder.Port = -1; // Don't inject port
            filterContext.Result = new RedirectResult(uriBuilder.ToString());
        }
    }
}

我知道这与问题类似 - Redirect loop with SSL action filter in ASP.NET MVC但是在二月被问到,我希望有人可能有更好的解决方案。链接中问题的解决方案是从控制器中的操作重定向,但如果我们要将所有操作重定向到HTTPS,我们必须确保在每个操作中都调用它,而不是将自定义FilterAttribute应用于控制器。

注意:此代码适用于使用虚拟SSL证书的开发环境。

我可能有错误的结局,应该完全做其他事情,如果是这样,请接受我的道歉。

1 个答案:

答案 0 :(得分:1)

对于任何可能遇到同样问题的人。这是我们的负载均衡器处理SSL请求并使用端口80切换到我们的Web服务器的结果;这导致无法确定安全请求确实是安全的。