2017-03-02 348 views
1

我使用ARR没有https卸载我们的非本地托管环境。这意味着命中ARR的请求是https,但发送到后端服务器的请求只是httpHTTPS要求使用ARR

如果我在openiddict禁用https要求再配置返回http网址。如果我启用它,那么请求将被拒绝,后端服务器会以http的身份接收它们。有没有办法解决?

回答

1

你描述的其实是一个很常见的问题是影响任何ASP.NET的核心应用,做 - 或不 - 用OpenIddict和反向代理级别执行TLS终止时出现:在这种情况下,ASP.NET核心确实没有办法知道实际的方案是什么,所以它假定HttpRequest.Schemehttp,而不是https

为了解决这个问题,你必须还原真实的方案,使所有依赖于它的中间件 - 按照预期工作 - 包括OpenIddict。

这可以使用"forwarded headers" middleware通过参考Microsoft.AspNetCore.HttpOverrides包并调用app.UseForwardedHeaders()来完成。

根据你的代理,你可能需要调整设置以匹配其使用的标头。

注意:使用IIS集成包时,会自动注册此中间件。您可以使用此语法修改默认选项:

services.Configure<ForwardedHeadersOptions>(options => 
{ 
    options.ForwardedHeaders = ForwardedHeaders.XForwardedProto; 
}); 

如果这个方法行不通,你仍然可以使用内联中间件覆盖方案:

app.Use((context, next) => 
{ 
    context.Request.Scheme = "https"; 

    return next(); 
}); 

确保您的注册它在任何其他中间件之前。

+2

因为'ForwardedHeaderOptions.RequireSymmetry'默认为true,所以默认选项不会在ARR后面工作,因为'X-Forwarded-For'有2个入口但'X-Forwarded-Proto'有1个。所以设置'选项。 ForwardedHeaders = ForwardedHeaders.XForwardedProto'工作。谢谢。我用 app.UseForwardedHeaders(新ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedProto, }); – pholly