我正在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?
答案 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标头信息进行限制。