在非https网站上执行https请求-chrome中的混合内容错误

时间:2018-11-30 13:18:21

标签: google-chrome asp.net-core https load-balancing

这可能是一个奇怪的情况,请随时告诉我是否有更好的一般方法。

所以我有一个带有负载均衡器的应用程序。负载平衡器仅接受HTTP流量。到目前为止一切顺利。

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

这意味着什么:

  • 尽管可以通过Https访问该网站,但是asp.netcore应用程序对此一无所知。

  • 我仅在开发环境中将其指定为HTTPs,因为我的cookie仅在HTTPS中

但这给了我这个问题:

  

混合内容:“ 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?那是一种方法,但是没有必要...

1 个答案:

答案 0 :(得分:1)

反向代理与ASP.NET Core应用程序之间的通信不必通过https加密,但是必须满足两个条件,因此ASP.NET Core应用程序知道原始HTTP请求是否来自https。或http。

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

可以在Configure ASP.NET Core to work with proxy servers and load balancers下阅读文档。

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-ForX-Forwarded-ProtoX-Forwarded-Host不同,则可以使用ForwardedForHeaderNameForwardedProtoHeaderNameForwardedHostHeaderName属性在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应该处理连续的请求