amazon-web-services - .net Core - 带有 AWS 负载均衡器和 Elastic Beanstalk 的 HTTPS 不起作用

标签 amazon-web-services https asp.net-core .net-core amazon-elastic-beanstalk

我有一个在本地环境中正确运行 HTTPS 的网站。当我将它上传到 AWS 时,它只是超时或永远重定向。
我在 AWS 中的设置是一个 Elastic Beanstalk 应用程序,一个运行 MS SQL 的 RDS 数据库,我添加了一个负载均衡器来转发 HTTPS 请求,并且我有一个正确分配给负载均衡器的 SSL 证书。据我所知,我的应用程序正在运行,事实上, Entity Framework 启动并在我的 RDS 实例中正确构建了我的数据库。我只是无法通过互联网访问该网站。
我试过以不同的方式设置监听器。如果我这样设置它们,它只会永远重定向:
Redirect Forever
如果我这样设置它们,它就会超时:
enter image description here
我有 default HTTP/HTTPS port forwarding code in my Startup.cs :

public void ConfigureServices(IServiceCollection services)
{
    // Sets all calls to require HTTPS: https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });
    ...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // Force all HTTP requests to redirect to HTTPS: https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
    var options = new RewriteOptions().AddRedirectToHttps();
    app.UseRewriter(options);

    ...

    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor |
                            ForwardedHeaders.XForwardedProto
    });
    ...
}
我已经花了几天的时间,但我无法让它发挥作用。我试过删除我所有的 HTTPS 代码,但没有用。我尝试过来自博客的代码解决方案,例如 thisthis这也不起作用。从我读过的内容来看,负载均衡器最终会处理 HTTPS 请求,然后将 HTTP 请求转发到我的应用程序。但我不知道如何正确处理,仍然强制执行 HTTPS,并将 HTTP 重定向到 HTTPS。
这似乎是一种无需我进行大量设置即可开箱即用的东西。如果不是,我认为现在很多其他人都会遇到这个问题,并且互联网上会有关于它的信息。我错过了一些小东西吗?因为我对此完全不知所措。
如果你能回答这个问题,你就是我的新英雄。

最佳答案

所以我终于解决了这个问题。首先,必须将负载均衡器设置为将 HTTPS 443 转发到 HTTP 80,如下所示:
enter image description here

然后,我在问题中概述的所有代码都需要删除(或不在 AWS 环境中运行)。我忘记删除 services.Configure<MvcOptions>(options){}最初的代码行,我相信这是导致错误的原因。

然后我关注了 this blog处理 X-Forwarded-Proto header 。我将所有代码放在一个扩展文件中:

public static class RedirectToProxiedHttpsExtensions
{
    public static RewriteOptions AddRedirectToProxiedHttps(this RewriteOptions options)
    {
        options.Rules.Add(new RedirectToProxiedHttpsRule());
        return options;
    }
}

public class RedirectToProxiedHttpsRule : IRule
{
    public virtual void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        // #1) Did this request start off as HTTP?
        string reqProtocol;
        if (request.Headers.ContainsKey("X-Forwarded-Proto"))
        {
            reqProtocol = request.Headers["X-Forwarded-Proto"][0];
        }
        else
        {
            reqProtocol = (request.IsHttps ? "https" : "http");
        }


        // #2) If so, redirect to HTTPS equivalent
        if (reqProtocol != "https")
        {
            var newUrl = new StringBuilder()
                .Append("https://").Append(request.Host)
                .Append(request.PathBase).Append(request.Path)
                .Append(request.QueryString);

            context.HttpContext.Response.Redirect(newUrl.ToString(), true);
        }
    }
}

最后,我在 Startup.cs 中调用这段代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...
    var options = new RewriteOptions()
        .AddRedirectToProxiedHttps()
        .AddRedirect("(.*)/$", "$1");  // remove trailing slash
    app.UseRewriter(options);
    ... 
}

毕竟它终于奏效了!

关于amazon-web-services - .net Core - 带有 AWS 负载均衡器和 Elastic Beanstalk 的 HTTPS 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701670/

相关文章:

postgresql - RDS 上的 PostgreSQL 顺序扫描速度慢?

r - 在 R 中运行 httr 库和相互身份验证时 SSL 握手失败

javascript - 使用 https 下载文件的 Grunt 任务

c# - .NET 最小 API : how to map all route and all verb in the same handler?

Angular 4 抛出错误 EventSource 的响应有一个 MIME 类型 ("text/html")在迁移到 .NetCore 2.0 后不是 "text/event-stream"

mysql - 如何使用 IP 直接从本地主机连接嵌套虚拟机?

amazon-web-services - 如何在 AWS 上管理多个客户端?

amazon-web-services - 以 SQS 队列为目标的 CloudWatch 事件无法正常工作

https - 将 YUI3 与 HTTPS 一起使用的 "right"方式是什么?

c# - 如何禁用特定 ASP.NET Core 5.0 Web API 操作的自动模型绑定(bind)?