首页 > 解决方案 > 在非 https 网站上强制执行 https 请求 - chrome 中的混合内容错误

问题描述

这可能是一个奇怪的案例,如果有更好的方法,请随时告诉我。

所以我有一个带有负载均衡器的应用程序。负载均衡器仅接收 HTTPs 流量。到目前为止,一切都很好。

然后负载均衡器将它作为 HTTP 发送到我的 asp.netcore。

这意味着什么:

但这给了我这个问题:

混合内容:“pagePath”处的页面是通过 HTTPS 加载的,但请求了不安全的清单“path/site.webmanifest”。此请求已被阻止;内容必须通过 HTTPS 提供。

这是我的启动

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseHttpsRedirection();
    }
    else
    {
        app.UseHsts();
    }

    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseAuthentication();

    app.UseExceptionHandler("/error/500");
    app.UseMiddleware<WebRequestLoggerMiddleWare>();
    app.UseMiddleware<UserTimeZoneMiddleWare>();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

还有我的 cookie 政策,还在 statup.cs

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.LoginPath = new PathString("/account/login/");
        options.AccessDeniedPath = new PathString("/account/forbidden/");
        options.SlidingExpiration = true;
        options.ExpireTimeSpan = TimeSpan.FromHours(cookieSettings.CookieExpirationInHours);
        options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
        options.Cookie.HttpOnly = true;

    });

确保通过 HTTPS 请求 webmanifest 的最佳方法是什么?

我是否应该强制整个网站使用 HTTPS 并将来自 LB 的流量路由为 https?这是一种方法,但它不应该是必要的......

标签: google-chromeasp.net-corehttpsload-balancing

解决方案


反向代理和 ASP.NET Core 应用程序之间的流量不必通过 https 加密,但必须满足两个条件,以便 ASP.NET Core 应用程序知道原始 HTTP 请求是通过 https 还是 http 来的。

  1. 您的反向代理必须使用原始主机的原始协议和 IP 发送正确的标头。其默认标头用于X-Forwarded-For远程 IP 和X-Forwarded-Proto协议
  2. 在 IIS 上运行时默认设置转发的标头中间件,并且(根据文档)需要为其他托管方案启用。

可以在配置 ASP.NET Core 以使用代理服务器和负载平衡器下阅读该文档。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.Configure<ForwardedHeadersOptions>(options =>
    {
        options.ForwardedHeaders = 
            ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseForwardedHeaders();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    // In ASP.NET Core 1.x, replace the following line with: app.UseIdentity();
    app.UseAuthentication();
    app.UseMvc();
}

如果您的代理名称标题与X-Forwarded-For,X-Forwarded-Proto和不同X-Forwarded-Host,您可以使用ForwardedForHeaderName,ForwardedProtoHeaderNameForwardedHostHeaderName属性ForwardedHeadersOptions来更改它。

此外,您的Startup课程应如下所示

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    // redirect to Https
    app.UseHttpsRedirection();

根据官方示例并确保用户在第一次访问时被重定向到 http,HSTS应处理连续请求


推荐阅读