使用 ARR 的 Openiddict 中的 https 要求

pho*_*lly 3 arr openid-connect asp.net-core openiddict

https在非本地托管环境上使用 ARR,无需卸载。这意味着命中 ARR 的请求为 ,https但发送到后端服务器的请求仅为http

如果我禁用httpsopeniddict 中的要求,则配置返回httpurl。如果我启用它,那么请求将被拒绝,因为后端服务器将它们接收为http. 有没有办法解决?

Kév*_*let 8

您所描述的实际上是一个非常常见的问题,它会影响任何使用或不使用 OpenIddict 的 ASP.NET Core 应用程序,并在反向代理级别执行 TLS 终止时出现:在这种情况下,ASP.NET Core 确实没有办法知道实际的方案是什么,所以它假设HttpRequest.Schemehttp,而不是https

要解决这个问题,您必须恢复真实的方案,以便所有依赖它的中间件(包括 OpenIddict)都能按预期工作。

这可以使用“转发标头”中间件通过引用Microsoft.AspNetCore.HttpOverrides包并调用app.UseForwardedHeaders().

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

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

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedProto;
});
Run Code Online (Sandbox Code Playgroud)

如果这种方法不起作用,您仍然可以使用内联中间件覆盖该方案:

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

    return next();
});
Run Code Online (Sandbox Code Playgroud)

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

  • 因为 `ForwardedHeaderOptions.RequireSymmetry` 默认为 true,所以默认选项在 ARR 后不起作用,因为 `X-Forwarded-For` 有 2 个条目,但 `X-Forwarded-Proto` 有 1 个条目。因此设置 `options.ForwardedHeaders = ForwardedHeaders .XForwardedProto` 有效。谢谢。我使用了 app.UseForwardedHeaders(new ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedProto, }); (2认同)