我使用ARR没有https
卸载我们的非本地托管环境。这意味着命中ARR的请求是https
,但发送到后端服务器的请求只是http
。HTTPS要求使用ARR
如果我在openiddict禁用https
要求再配置返回http
网址。如果我启用它,那么请求将被拒绝,后端服务器会以http
的身份接收它们。有没有办法解决?
我使用ARR没有https
卸载我们的非本地托管环境。这意味着命中ARR的请求是https
,但发送到后端服务器的请求只是http
。HTTPS要求使用ARR
如果我在openiddict禁用https
要求再配置返回http
网址。如果我启用它,那么请求将被拒绝,后端服务器会以http
的身份接收它们。有没有办法解决?
你描述的其实是一个很常见的问题是影响任何ASP.NET的核心应用,做 - 或不 - 用OpenIddict和反向代理级别执行TLS终止时出现:在这种情况下,ASP.NET核心确实没有办法知道实际的方案是什么,所以它假定HttpRequest.Scheme
是http
,而不是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();
});
确保您的注册它在任何其他中间件之前。
因为'ForwardedHeaderOptions.RequireSymmetry'默认为true,所以默认选项不会在ARR后面工作,因为'X-Forwarded-For'有2个入口但'X-Forwarded-Proto'有1个。所以设置'选项。 ForwardedHeaders = ForwardedHeaders.XForwardedProto'工作。谢谢。我用 app.UseForwardedHeaders(新ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedProto, }); – pholly