Azure 回复 url 在 AWS 负载均衡器后面总是不安全

Posted

技术标签:

【中文标题】Azure 回复 url 在 AWS 负载均衡器后面总是不安全【英文标题】:Azure reply url is always unsecure behind AWS LoadBalancer 【发布时间】:2019-01-16 12:19:48 【问题描述】:

我们的 ASP .Net Core (Razor) 应用程序托管在 AWS 中并放置在 LoadBalancer (https) 之后。我知道有一个错误,即 LoadBalancer 的 URL 总是不安全的。重写规则被集成,如下所述:https://***.com/a/46719766/3835956

但是我们使用 Azure 身份验证连接到我们的 Active Directory,并且转发(回复 url)将始终重定向到不安全的 http 地址。好的,url 将被重写为 https,但是在短时间内调用 http 地址并且该过程是不安全的。 我必须将带有 http 和 https 的 url 添加到 Azure 应用程序属性中的回复 url 列表中才能登录。

身份验证是这样配置的:

    public void ConfigureServices(IServiceCollection services)
    
        [...]

        services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));

        services.AddMvc(options =>
        
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        )         
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    
        [...]

        // Fix for AWS LoadBalancer to rewrite url back to https
        // https://***.com/a/46719766/3835956
        var options = new RewriteOptions()
            .AddRedirectToProxiedHttps()
            .AddRedirect("(.*)/$", "$1");  // remove trailing slash
        app.UseRewriter(options);

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseSession();
        app.UseAuthentication();

        app.UseMvc();
         

Azure 应用程序中的回复 url 列表现在是:

是否有将 Azure 指向正确回复 url 的技巧?非常感谢。

更新 1:

appsettings.json 如下所示:


  "AzureAd": 
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "domain.com",
    "TenantId": "abc-123",
    "ClientId": "abc-123",
    "CallbackPath": "/signin-oidc"
  ,
  [...]
  "AllowedHosts": "*"

【问题讨论】:

我猜您的应用正在将 redirect_uri 指定为 HTTP 版本。必须以某种方式让应用意识到它的 URL 实际上是 HTTPS,即使它从负载均衡器接收作为 HTTP 的流量。 请澄清:应用程序生成的url是http吗?还是只是 Proxy 和您的应用程序 http 之间的流量?后一个不是问题,只要X-Forwarded-ProtoX-Forwarded-For(或者是X-Forwarded-Host?)正确重定向到您的应用程序,您的应用程序仍会将连接视为安全的(身份验证和 RequireHttps 属性将否则重定向或失败) 该站点的 url 是 http 并在使用 https 和公司域的负载均衡器后面生成。因此应用程序不知道负载均衡器的正确 url。应用程序和负载均衡器之间的流量应该是 http。 @Tseng 你的意思是交通安全吗?但我必须将 http url 添加到 azure 列表。 介意发布(相关部分)您的 appsettings.json 吗?可能是您在那里将返回 url 设置为 http 吗?您正在此处加载内容.AddAzureAD(options => Configuration.Bind("AzureAd", options));,但我们看不到您在 appsettings.json 部分中的内容。返回 url 通常是硬编码的(配置或在 code9 部分的身份验证中间件 您找到解决方案了吗?我们在这里遇到了同样的问题。 【参考方案1】:

我遇到了和你一样的问题,然后我找到了这个文档: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.1#scenarios-and-use-cases

然后我在方法的顶部添加了以下内容:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

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

// other stuff omitted

它解决了这个问题。重定向 URL 现在是 HTTPS。

【讨论】:

以上是关于Azure 回复 url 在 AWS 负载均衡器后面总是不安全的主要内容,如果未能解决你的问题,请参考以下文章

AWS 负载均衡器返回 403 响应?

AWS Cloudfront + 负载均衡器,url 从主域更改为负载均衡器子域

让 Flask 的 url_for 在 AWS 负载均衡器中使用“https”方案,而不会弄乱 SSLify

AWS负载均衡器监听器添加后消失

AWS 负载均衡器中的持续后端连接错误

Magento 重定向 AWS 负载均衡器