我在非本地托管环境中使用没有https
卸载的ARR。这意味着命中ARR的请求是https
,但发送到后端服务器的请求只是http
。
如果我在openiddict中禁用https
要求,那么配置将返回http
网址。如果我启用它,那么请求被拒绝,后端服务器将其作为http
接收。有没有办法解决?
您所描述的实际上是一个非常常见的问题,影响任何使用OpenIddict的ASP.NET Core应用程序,并且在反向代理级别执行TLS终止时出现:在这种情况下,ASP.NET Core确实没办法要知道实际的方案是什么,所以它假设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();
});
确保在任何其他中间件之前注册它。