You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core网站Stripe支付后Cookie拦截致登出问题求助

.NET Core网站Stripe支付后Cookie异常导致用户登出问题

问题场景

  • 网站分为客户端(https://maindomain.com/)和API(https://backendapis.maindomain.com/api/),部署在不同服务器
  • 用户通过Stripe完成支付(无论成功或取消)后,客户端自动出现用户登出情况
  • 从Stripe重定向回客户端后,浏览器抛出Cookie拦截错误:

This cookie was blocked because neither did the request URL’s domain exactly match the cookie’s domain, nor was the request URL’s domain a subdomain of the cookie’s Domain attribute value.

客户端Cookie配置

services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = SameSiteMode.Lax;
    options.Secure = CookieSecurePolicy.Always;
});

#region "Session init"
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
    options.Cookie.Name = ".AspNetCore.Session.khaled.Client";
    options.IdleTimeout = TimeSpan.FromDays(150);
    options.Cookie.IsEssential = true;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
#endregion "Session init"

// 中间件管道配置
app.UseAuthentication();
app.UseSession();

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

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

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

API配置(未显式配置CORS,默认允许所有源请求)

app.UseHttpStatusCodeExceptionMiddleware();
app.UseHttpsRedirection();
app.UseRouting();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

核心问题询问

该Cookie异常行为的原因是什么,尤其是在Stripe支付场景下?当前配置是否存在遗漏?


问题原因分析

  1. Cookie Domain属性缺失:当前Session Cookie未指定Domain属性,浏览器默认将其绑定到完整请求域名(maindomain.com)。Stripe重定向回客户端后,若后续涉及子域名API请求(backendapis.maindomain.com),浏览器会判定Cookie域名与请求域名不匹配,直接拦截Cookie,导致Session失效、用户登出。
  2. 中间件顺序错误:客户端管道中UseSession在UseCookiePolicy之前执行,导致Cookie策略无法正确应用到Session Cookie上,放大了域名不匹配的问题。
  3. 跨域重定向的Cookie校验逻辑:Stripe属于第三方域名重定向,即使设置了SameSiteMode.Lax,若无明确的父域名配置,浏览器会认为重定向后的请求与Cookie所属域名无关联,阻止Cookie正常发送。

修复方案

1. 明确配置Session Cookie的Domain属性

修改客户端Session配置,添加父域名设置,让Cookie可在主域名及所有子域名下共享:

services.AddSession(options =>
{
    options.Cookie.Name = ".AspNetCore.Session.khaled.Client";
    options.IdleTimeout = TimeSpan.FromDays(150);
    options.Cookie.IsEssential = true;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    // 配置父域名,允许子域名共享Cookie
    options.Cookie.Domain = ".maindomain.com";
});

2. 调整中间件顺序

将UseCookiePolicy移到UseSession之前,确保Cookie策略先于Session生效:

app.UseAuthentication();
app.UseCookiePolicy(); // 移至UseSession之前
app.UseSession();

// 其余中间件保持不变
if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();

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

3. 完善API的CORS配置(可选但推荐)

显式配置CORS并允许携带Cookie,避免跨域请求时的Cookie异常:

// 在ConfigureServices中添加CORS配置
services.AddCors(options =>
{
    options.AddPolicy("AllowMainDomain",
        builder =>
        {
            builder.WithOrigins("https://maindomain.com")
                   .AllowAnyHeader()
                   .AllowAnyMethod()
                   .AllowCredentials(); // 允许跨域请求携带Cookie
        });
});

// 在Configure中启用CORS,放在UseRouting之后、UseAuthentication之前
app.UseRouting();
app.UseCors("AllowMainDomain");
app.UseAuthentication();
app.UseAuthorization();

内容的提问来源于stack exchange,提问作者Khaled Helwane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:27:34