配置“ RequireHttpsAttribute”过滤器以解决X-Forwarded-Proto

时间:2019-02-26 12:11:29

标签: c# .net asp.net-mvc http-headers load-balancing

我正在AWS Elastic bean上托管ASP.NET Framework应用程序,并且正在使用负载平衡器。

使用我当前的配置需要https会导致无限循环,因为负载均衡器使用http与服务器进行通信。为了具有我的过滤器功能,我需要考虑X-Forwarded-Proto标头,据我所知,它包含原始请求协议。 我确实了解出了什么问题,但是我不了解如何使用此属性来确保安全的连接。

这是我当前的配置:

public class RequireHttpsAttribute : AuthorizationFilterAttribute {

    public int Port { get; set; }

    public RequireHttpsAttribute()
    {
        Port = 443;
    }

        public override void OnAuthorization(HttpActionContext actionContext)
        {
            var request = actionContext.Request;

            if (request.RequestUri.Scheme != Uri.UriSchemeHttps)
            {
                var response = new HttpResponseMessage();

                if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Head)
                {
                    var uri = new UriBuilder(request.RequestUri);
                    uri.Scheme = Uri.UriSchemeHttps;
                    uri.Port = this.Port;

                    response.StatusCode = HttpStatusCode.Found;
                    response.Headers.Location = uri.Uri;
                }
                else
                {
                    response.StatusCode = HttpStatusCode.Forbidden;
                }

                actionContext.Response = response;
            }
            else
            {
                base.OnAuthorization(actionContext);
            }
        }
}

此过滤器配置已添加到我的WebApiConfig。

我的问题是: 如何在此过滤器中检查X-Forwarded-Proto?

1 个答案:

答案 0 :(得分:0)

如果您的负载均衡器正在为您处理SSL,则您会取消对其的限制(仅SSL)-如您所知,您的应用将始终检测到http:80(不是https:443)。

  

请勿在接收敏感消息的Web API上使用RequireHttpsAttribute   信息。 RequireHttpsAttribute使用HTTP状态代码重定向   浏览器从HTTP到HTTPS。 API客户端可能不理解或服从   从HTTP重定向到HTTPS。这样的客户端可能会通过   HTTP。 Web API应该:

     
      
  • 不监听HTTP。
  •   
  • 关闭状态码为400(错误>请求)的连接,但不处理请求。
  •   

文档中的注释说明 API 客户端可能/可能不会遵循您的重定向响应,因此建议您以一些错误(也不是根本不响应)进行响应-这是应该在的地方检查http标头。对于您而言,您无法执行第一个操作,因为您的应用将始终获得HTTP:80(因此仅需http标头检查/过滤器。)

在MVC站点中,您可以进行路由重定向(URL重写等),但是该方法有效,因为客户端是浏览器(并且知道如何处理redirect)。但是,API客户端可以是任何(不仅仅是浏览器)。


更新/说明:

当然很重要,因此您应该仍要过滤负载均衡器转发的http header,以指示源请求是否通过https并按照文档中的建议进行操作-给出适当的http错误代码(注释中提示400 Bad Request)。

您不能做的是检查原始请求的实际方案/协议,因为您的负载均衡器会始终转发 http:80到您的应用。

TLDR:您根据负载均衡器转发的http标头信息进行限制。