通过AWS API Gateway的 ASP.NET Core 8.0 Razor Pages在登录的POST请求时返回400,同时重定向行为不正确

前端开发 2026-07-09

我有一个ASP.NET Core 8 Razor Pages应用,在Docker容器中运行,位于AWS API Gateway之后。

该应用通过EC2访问时工作正常,但通过API Gateway访问时,我遇到了一些与身份验证和重定向相关的问题。

我怀疑问题与转发头、Cookie、防伪令牌,或者API Gateway代理的行为有关。

当前转发头配置:

builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders =
        ForwardedHeaders.XForwardedFor |
        ForwardedHeaders.XForwardedProto |
        ForwardedHeaders.XForwardedHost;

    options.KnownNetworks.Clear();
    options.KnownProxies.Clear();
});

app.UseForwardedHeaders();

Cookie/会话配置:

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = SameSiteMode.Lax;
    options.HttpOnly = HttpOnlyPolicy.Always;
    options.Secure = CookieSecurePolicy.SameAsRequest;
});

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(24);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
});

有几条日志可能有助于理解行为不一致的原因。

[WRN] Failed to determine the https port for redirect. 
[INF] AuthenticationScheme: Cookies was challenged.
[INF] [DEBUG] Scheme: http, URL: http:some-aws-url:8085/authentication/login2026-05-08

请注意,当转储HttpContext请求的Scheme和 URL时,我得到 httphttp://some-aws-url:8085,其中包含某个AWS URL(很可能是API Gateway的 URL)以及一个端口。

现在情况变得真的很怪,因为该端口实际上不是我的容器实际运行所使用的端口,URL也不是用于访问应用的公开DNS;应用接收到的请求协议(scheme)也显示为http,而实际上应用应在https上运行。

因此,诸如从 /index 自动重定向到 /authentication/login 这样的重定向都不起作用。(我仍然可以访问 /authentication/login,但需要手动输入URL。)

POST请求从未到达Razor Page的处理程序,浏览器在进入控制器/页面处理程序之前就收到HTTP 400。

对这种行为的原因有什么想法吗?我已经花了两天时间,仍然找不到有用的信息。

另外,导致问题的AWS不是我们自有的,因此在进行任何测试之前很难做出修改。

解决方案

我们的客户端在CloudFront上使用了一个特定的Origin请求策略,但该策略并没有将Cookie或头信息转发给应用程序。因此应用程序产生了损坏的重定向。身份验证,以及防伪令牌处理也受到该配置错误的影响。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章