RequireHttps导致Amazon Elastic Load Balancer上的重定向循环

JP.*_*JP. 7 asp.net-mvc ssl load-balancing amazon-web-services

我有一个运行在Amazon弹性负载均衡器后面的ASP.NET MVC 4应用程序.当我在负载均衡器 Web服务器上安装SSL证书并在Web服务器层终止SSL时,一切正常.

但是,当我尝试在负载均衡器层终止,将内部流量从负载均衡器转发到端口80上未加密的Web服务器时,RequireHttps属性会导致重定向循环.这似乎是有意义的,因为它正在请求加密通道,并且不知道它正在获得一个(在浏览器和负载平衡器之间).有没有人遇到同样的问题?任何建议,将不胜感激!

编辑:解决方案

以下链接可能对遇到此问题的任何其他人有用:

MVC3,RequireHttps和自定义处理程序导致http 310

https://gist.github.com/915869

Tom*_*gda 7

似乎要在AWS上使用此功能,您需要查看"X-Forwarded-Proto"HTTP标头项.如果初始请求是HTTPS,则负载均衡器会注入标头,并显示"https".如果是HTTP,则说"http".

答案在这里找到:http://aws.typepad.com/aws/2010/10/keeping-customers-happy-another-new-elastic-load-balancer-feature.html


小智 6

我遇到了同样的问题,我发现以下RequireHttpsAttribute过滤器对我有效.

public class SSLFilter : RequireHttpsAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (filterContext.HttpContext.Request.IsLocal ||
            (filterContext.RequestContext.HttpContext.Request.Headers.AllKeys.Contains("X-Forwarded-Proto") &&
            filterContext.RequestContext.HttpContext.Request.Headers.Get("X-Forwarded-Proto").ToLower().Equals("https")))
        {
            return;
        }

        base.OnAuthorization(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)