【问题标题】:Infinite redirect loop in ASP.NET core while enforcing SSL执行 SSL 时 ASP.NET 核心中的无限重定向循环
【发布时间】:2018-01-27 19:19:18
【问题描述】:

我按照here 的步骤在我的 ASP.NET Web API 上强制实施 SSL,但它总是以无限循环结束。我可能做错了什么?环境是在 AWS EC2 虚拟机中运行的 Windows Server 2016。

【问题讨论】:

  • 使用 F12 控制台网络选项卡观察哪些 URL 被重定向到并在此处发布。
  • 反向代理通常会终止 ssl,因此后端应用程序不知道。它们应该在标题中包含原始方案。请参阅 UseForwardedHeaders 来处理这些。见github.com/aspnet/Docs/issues/2384
  • @Tratcher 是的,似乎是这样。无论如何,我决定在客户端重定向以避免其他一些问题。请将此作为答案发布:)

标签: asp.net asp.net-core


【解决方案1】:

在我的情况下,反向代理位于单独的服务器上,因此,我的 asp.net 核心应用程序不接受此代理,因为ForwardedHeadersOptions.KnownProxies 上没有代理并且网络不在ForwardedHeadersOptions.KnownNetworks 上我应用此解决方案并且无限循环消失了:

services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders =
                ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:100.64.0.0"), 106));
        });

你也可以使用options.KnownProxies并添加你的反向代理的IP地址,在我的例子中我没有添加,因为反向代理是动态的。

注意::ffff:需要放这个前缀,这是IPv4MappedToIPv6地址更多信息https://github.com/aspnet/Docs/issues/2384#issuecomment-387875157

谢谢

【讨论】:

  • 你在哪里找到IP地址部分,即:::ffff:100.64.0.0?我正在使用 AWS 进行托管,但不确定在哪里可以找到此网络部分?
  • 您好,这是网络的 CIDR,如果您想授予子网中任何计算机的访问权限,您需要添加子网的 IPV4 CIDR,您无法在 VPC 服务下找到。
【解决方案2】:

反向代理通常会终止 ssl,因此后端应用程序不知道。它们应该在标题中包含原始方案。使用UseForwardedHeaders 处理这些。看看 GitHub 上的this issue

【讨论】:

【解决方案3】:

在将 .NET Core 应用程序与负载均衡器/反向代理后面的 Saml2 Idp 集成时,我遇到了同样的重定向问题。 (https => http)

对我来说,将请求的 Scheme 设置为 https(或者在我的示例中,使用提供的代理的 proto 标头)起到了作用

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.All
});

app.Use((context, next) =>
{
    if (context.Request.Headers.TryGetValue("X-Forwarded-Proto", out StringValues proto))
    {
        context.Request.Scheme = proto;
    }

    return next();
});

【讨论】:

  • 这是正确的答案,当您拥有app.UseHttpsRedirection(); 并且应用程序位于反向代理后面时,您需要覆盖context.Request.Scheme,这似乎是app.UseForwardedHeaders 的错误,以使重定向发生不要忘记将环境变量 ASPNETCORE_HTTPS_PORT 设置为您的 https 端口,在我的情况下是默认的 443
  • 我们已经见过几次了,它一直是 UseForwardedHeaders 的错误配置,而不是错误。不要盲目应用X-Forwarded-Proto,很危险。
【解决方案4】:

我遇到了 VictorV's solution 解决的相同问题。但是,我无法控制运行应用程序的网络。我稍微修改了他的答案,以(我相信)允许来自任何网络的请求。

services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders =
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("::ffff:0.0.0.0"), 0));
    });

虽然我确信这不太安全,但鉴于我无法控制网络,我真的看不到替代方案。

【讨论】:

    【解决方案5】:

    在您的 Statup.cs 文件中删除此行:

    app.UseHttpsRedirection();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2021-04-15
      • 2021-10-05
      • 2019-02-17
      • 2014-03-18
      相关资源
      最近更新 更多