我在Amazon的弹性负载均衡器后面运行了一个ASP.NET MVC 4应用程序。当我在负载均衡器和 Web服务器上安装SSL证书并在Web服务器层终止SSL时,一切正常。
但是,当我尝试在负载均衡器层终止,将内部流量从负载均衡器转发到端口80上未加密的Web服务器时,RequireHttps属性会导致重定向循环。这似乎是有意义的,因为它正在请求加密通道,并且不知道它正在获得一个(在浏览器和负载平衡器之间)。有没有人遇到同样的问题?任何建议将不胜感激!
编辑:解决方案
以下链接可能对遇到此问题的任何其他人有用:
答案 0 :(得分:7)
似乎要在AWS上使用此功能,您需要查看“X-Forwarded-Proto”HTTP标头项。如果初始请求是HTTPS,则负载均衡器会注入标头,并显示“https”。如果是HTTP,则说“http”。
答案 1 :(得分: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);
}
}
答案 2 :(得分:1)
我在以下链接中为此提供了解决方案: https://stackoverflow.com/questions/37954796/requirehttpsattribute-with-netcore-rc2-causes-http302-redirect-loop-on-azure#=
其中说:
您可以通过在Startup.cs中向ConfigureServices添加以下行来解决此问题(并添加"使用Microsoft.AspNetCore.HttpOverrides;")
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
});