我在 .NET Core 网站中遇到与 cookie 相关的问题。特别是在使用 Stripe 支付网关时,会出现此问题。这是场景:
我的网站由两个项目组成:客户端项目和API项目。 这些项目部署在不同的服务器上:
客户端网址:https://maindomain.com/
API URL:https://backendapis.maindomain.com/api/
当客户尝试使用 Stripe 进行付款时,就会出现此问题。无论支付成功还是取消,客户端都会退出。
经过调查,我注意到 cookie 在此操作后行为异常。具体来说,我收到错误消息:“此 cookie 被阻止,因为请求 URL 的域与 cookie 的域不完全匹配,请求 URL 的域也不是 cookie 域属性值的子域。”
这是从 stripe 重定向后 cookie 发生的情况
以下是我为客户端配置 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"
///////////////////////////// and this is the pipline :
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 配置。但是,我假设它默认允许来自所有来源的请求,因为我可以直接从浏览器调用一些没有身份验证的 API。
app.UseHttpStatusCodeExceptionMiddleware();
app.UseHttpsRedirection();
app.UseRouting();
app.UseStaticFiles();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
对于 cookie 为何会出现这种行为,尤其是在 Stripe 支付的情况下,您有什么见解吗?我的配置中是否缺少某些内容?
我找到了,问题出在我们在stripe中配置的返回URL
成功的返回URL为https://maindomain.com/Payment/Success和
取消的返回URL是https://maindomain.com/Payment/Cancel
因此,当用户使用域 https://www.maindomain.com/ 登录时,他们将被注销,因为带有“www”的域与没有“www”的域不同,正如您所看到的返回URL 不是“www”版本。