使用 ARR 的 Openiddict 中的 HTTPS 要求
Https requirement in Openiddict using ARR
我在非本地托管环境中使用没有 https
卸载的 ARR。这意味着命中 ARR 的请求是 https
,但发送到后端服务器的请求只是 http
。
如果我在 openiddict 中禁用 https
要求,然后配置 returns http
url。如果我启用它,那么请求将被拒绝,因为后端服务器将它们接收为 http
。有什么解决办法吗?
您所描述的实际上是一个非常普遍的问题,它会影响任何 ASP.NET 使用或不使用 OpenIddict 的核心应用程序,并在反向代理级别执行 TLS 终止时出现:在这种情况下,ASP.NET Core 确实没有办法知道实际的方案是什么,所以它假设 HttpRequest.Scheme
是 http
,而不是 https
.
要解决这个问题,您必须恢复真实的方案,以便依赖它的所有中间件 - 包括 OpenIddict - 按预期工作。
这可以通过引用 Microsoft.AspNetCore.HttpOverrides
包并调用 app.UseForwardedHeaders()
.
使用 "forwarded headers" middleware 来完成
根据您的代理,您可能需要调整设置以匹配它使用的 headers。
注意:使用IIS集成包时会自动注册该中间件。您可以使用以下语法修改默认选项:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
});
如果此方法不起作用,您仍然可以使用内联中间件覆盖方案:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
确保在注册任何其他中间件之前注册它。
我在非本地托管环境中使用没有 https
卸载的 ARR。这意味着命中 ARR 的请求是 https
,但发送到后端服务器的请求只是 http
。
如果我在 openiddict 中禁用 https
要求,然后配置 returns http
url。如果我启用它,那么请求将被拒绝,因为后端服务器将它们接收为 http
。有什么解决办法吗?
您所描述的实际上是一个非常普遍的问题,它会影响任何 ASP.NET 使用或不使用 OpenIddict 的核心应用程序,并在反向代理级别执行 TLS 终止时出现:在这种情况下,ASP.NET Core 确实没有办法知道实际的方案是什么,所以它假设 HttpRequest.Scheme
是 http
,而不是 https
.
要解决这个问题,您必须恢复真实的方案,以便依赖它的所有中间件 - 包括 OpenIddict - 按预期工作。
这可以通过引用 Microsoft.AspNetCore.HttpOverrides
包并调用 app.UseForwardedHeaders()
.
根据您的代理,您可能需要调整设置以匹配它使用的 headers。
注意:使用IIS集成包时会自动注册该中间件。您可以使用以下语法修改默认选项:
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
});
如果此方法不起作用,您仍然可以使用内联中间件覆盖方案:
app.Use((context, next) =>
{
context.Request.Scheme = "https";
return next();
});
确保在注册任何其他中间件之前注册它。