ASP Net Core 2.2重定向后会话丢失

7

我在Startup.cs中有以下会话配置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });


        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(10);
            options.Cookie.HttpOnly = true;

            // Make the session cookie essential
            options.Cookie.IsEssential = true;
        });
     }

一切正常,会话保持它的Session Id和数据。我把一些预订信息放在那里。然后我重定向用户到支付页面。支付成功后,用户通过POST被重定向回我的网站 PaymentController Success 操作。

显然,来自支付平台的此POST请求不包含会话cookie,因此我只需要在PaymentController Success操作中执行RedirectToAction(“ContinueBooking”,“Payment”)。

重定向到操作后,浏览器发送会话cookie,但是此时会话似乎已经丢失,并分配了一个新的Session Id,所有数据都丢失了。有什么办法可以防止这种情况吗?还是我应该在我的情况下使用数据库来存储重定向之间的数据(我可以通过支付终端绕过一些参数)?


在启动文件的Configure方法中是否存在app.UseSession()? - hassan.ef
1
展示实际的控制器代码。 - Chris Pratt
成功付款后,您的网站需要超过10秒才能回来吗?您已经设置了 options.IdleTimeout = TimeSpan.FromSeconds(10);。尝试将其增加到60秒,看看是否会以相同的方式运行。此外,我猜想您只是在本地机器上进行测试,并没有使用负载均衡器。如果您的应用程序在负载均衡器后面,则需要使用 DataProtection API,以允许应用程序从中央位置读取会话cookie。 - Shahzad Hassan
2
我用这个解决方案解决了这个问题:https://dev59.com/cFUL5IYBdhLWcg3wzqyZ#50425129 - Almeida
1
@CleverAlmeida 谢谢。在我的情况下,我需要同意 Cookie。对于我来说,问题是通过设置 AddSession(x=> x.Cookie.HttpOnly=true; x.Cookie.IsEssentialTrue=true; options.IdleTimeout = Somebigvalue) 来解决的。 - lavrik
显示剩余5条评论
2个回答

3
如果两个应用程序在同一服务器上,则两者将是相同的 cookie,并且第一个 cookie 将被支付应用程序的会话 cookie 覆盖。为了避免这种情况,请自定义 cookie 名称:
``` services.AddSession(opt => { opt.Cookie.Name = "MySessionCookie"; }); ```

谢谢,我解决了授权 cookie 的问题。最终发现,在开发过程中,当在不同的端口之间重定向时,它被覆盖了。 - Chris Cavell
这对我来说是个大问题。我一直在尝试使用Duo实现2FA,但每次Duo将浏览器重定向回我的应用程序端点时,会话都为空,因此我无法验证响应。我尝试了各种合理的配置选项来设置会话cookie,但这是最终产生差异的那个。 - Philip Stratford

1

我有相同的情况,需要重定向到另一个站点(身份网关),并且该站点的帖子返回http post响应标识。

对于我来说,使用.net core 3.1创建具有samesite none的会话cookie,我需要使用options.Cookie.SecurePolicy

如果没有这个,就不会创建cookie。

services
    .Configure<CookiePolicyOptions>(options =>
    {
        // not necessary
        //options.MinimumSameSitePolicy = SameSiteMode.None;
    })
    .AddSession(options =>
    {
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
        options.Cookie.SameSite = SameSiteMode.None;
        options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest; // this is the key
    })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接