使用 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.Schemehttp,而不是 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();
});

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