Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services .net Core-HTTPS与AWS负载平衡器和弹性Beanstalk不';行不通_Amazon Web Services_Https_Asp.net Core_.net Core_Amazon Elastic Beanstalk - Fatal编程技术网

Amazon web services .net Core-HTTPS与AWS负载平衡器和弹性Beanstalk不';行不通

Amazon web services .net Core-HTTPS与AWS负载平衡器和弹性Beanstalk不';行不通,amazon-web-services,https,asp.net-core,.net-core,amazon-elastic-beanstalk,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实例中正确地构建了我的数据库。我就是不能通过互联网访问这个网站 我试着用不同的方式来设置听众。如果我这样设置,它

我有一个在本地环境中正确运行HTTPS的网站。当我上传到AWS时,它只是超时或永远重定向

我在AWS中的设置是一个Elastic Beanstalk应用程序,一个运行MS SQL的RDS数据库,我添加了一个负载平衡器来转发HTTPS请求,并且我有一个正确分配给负载平衡器的SSL证书。从我所能知道的一切来看,我的应用程序正在运行,事实上,Entity Framework启动并在我的RDS实例中正确地构建了我的数据库。我就是不能通过互联网访问这个网站

我试着用不同的方式来设置听众。如果我这样设置,它将永远重定向:

如果我这样设置,它就会超时:

我有:

public void配置服务(IServiceCollection服务)
{
//将所有调用设置为需要HTTPS:https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
配置(选项=>
{
options.Filters.Add(新的requireHttpAttribute());
});
...
}
公共void配置(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂)
{
//强制所有HTTP请求重定向到HTTPS:https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl
var options=new RewriteOptions().AddRedirectToHttps();
app.UseRewriter(选项);
...
app.UseForwardedHeaders(新ForwardedHeaders选项
{
ForwardedHeaders=ForwardedHeaders.XForwardedFor|
ForwardedHeaders.XForwardedProto
});
...
}
我已经花了好几天的时间在这上面了,我无法让它工作。我试着把我所有的HTTPS代码都去掉了,但是没有用。我曾尝试过像和这样的博客的代码解决方案,但这也不起作用。据我所知,负载平衡器最终处理HTTPS请求,然后将HTTP请求转发到我的应用程序。但我不知道如何正确处理,仍然强制使用HTTPS,并将HTTP重定向到HTTPS

这看起来像是一个开箱即用的东西,没有我的一大堆设置。如果不是这样的话,我想现在很多其他人都会遇到这个问题,互联网上也会有关于这个问题的信息。我是不是错过了一些小东西?因为我对此一无所知

如果你能回答这个问题,你将成为我的新英雄。

根据我的说法,你必须分析
X-Forwarded-Proto
头,只有当它是
http
(而不是
https
)时,才使用重定向进行响应


当前
Microsoft.AspNetCore.Rewrite
包重定向到httpsrule
。您需要实现自己的
IRule

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

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

然后,我接着处理X-Forwarded-Proto报头。我将所有代码放在一个扩展文件中:

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);
    ... 
}
毕竟它终于成功了

app.UseForwardedHeaders()似乎与AWS负载平衡器存在问题,除非首先清除已知网络和代理

别忘了先安装Microsoft.AspNetCore.httpriverses NuGet软件包,否则它将以静默方式失败

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        ...
        app.UseForwardedHeaders(GetForwardedHeadersOptions());
        ...
    }

    private static ForwardedHeadersOptions GetForwardedHeadersOptions()
    {
        ForwardedHeadersOptions forwardedHeadersOptions = new ForwardedHeadersOptions()
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        };

        forwardedHeadersOptions.KnownNetworks.Clear();
        forwardedHeadersOptions.KnownProxies.Clear();

        return forwardedHeadersOptions;
    }

您需要接受XForwardedProto

在Startup.cs中:

public void配置服务(IServiceCollection服务)
{
...
配置(选项=>
{
options.ForwardedHeaders=ForwardedHeaders.XForwardedProto;
});
...  
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
...
app.UseForwardedHeaders();
...
}

我也面临同样的问题。我最终通过更改web.config文件解决了这个问题

下面是我的确切代码。我跟着。如果URL重写模块未安装,则必须在实例上安装此模块,否则只有此web.config文件更改有效

<?xml version="1.0" encoding="UTF-8"?>
<configuration>    
  <system.webServer>        
    <rewrite>            
      <rules>                
        <rule name="HTTPS rewrite behind AWS ELB rule" enabled="true" stopProcessing="true">
          <match url="^(.*)$" ignoreCase="false" />
          <conditions>
            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />                    
          </conditions>                    
          <action type="Redirect" url="https://{SERVER_NAME}{URL}" redirectType="Found" />                
        </rule>            
      </rules>        
    </rewrite>    
  </system.webServer>
</configuration>


如果loadbalancer面向internet,您能否确认?您可以在description选项卡yes中看到这个细节,负载平衡器是“面向互联网的”。因此我尝试分析下面的X-Forwarded-Proto头作为指导。我仍然无法让它工作。通过以下博客示例,我更加努力地让它工作。谢谢你的投入和帮助。我试过了,但没有解决问题。不过,我的解决方案确实解决了这个问题。我使用的是旧版本的Microsoft.AspNetCore.HttpOverrides(1.1.2),这可能是一个问题吗?是的,对于大多数中间件,这可以处理来自X-Forwarded-For标头的正确协议,但显然不适用于重写。AddRedirectToHttps我最终不得不自己使用您的解决方案:),但如果X-Forwarded-Proto标头丢失,我必须将其稍微更改为不重定向http:。这样,我的负载平衡器运行状况检查就不会被重定向到https.ArcadeRenegade。您能分享一下您为运行状况检查所做的工作吗?谢谢。我终于成功了。我已经将HealthCheck页面从默认/修改为一个html文件(即HealthCheck.html)。但另一个问题是,如果使用Azure身份验证,则所有请求都将通过http发送并重写。我必须在azure中的应用程序列表中添加一个带有http的回复url。知道吗?不,对不起,我不熟悉Azure的基础设施。祝你好运
<?xml version="1.0" encoding="UTF-8"?>
<configuration>    
  <system.webServer>        
    <rewrite>            
      <rules>                
        <rule name="HTTPS rewrite behind AWS ELB rule" enabled="true" stopProcessing="true">
          <match url="^(.*)$" ignoreCase="false" />
          <conditions>
            <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />                    
          </conditions>                    
          <action type="Redirect" url="https://{SERVER_NAME}{URL}" redirectType="Found" />                
        </rule>            
      </rules>        
    </rewrite>    
  </system.webServer>
</configuration>