深入学习ing

.net core cookie授权给非服务器域名的网站时可能无法正常删除的解决办法

  背景介绍:.net core框架,API服务器域名是a.com, 服务器需要通过cookie授权给网站b.com域名并设置了授权域名为a.com。 当你想退出时,在网站b.com使用js清理了本域名下的所有cookie后,刷新浏览器cookie列表也确实看到本域名下没有cookie了。 这时再使用另一个账号登录后会发现还是原用户的登录信息。

   

      原因分析:上面已经提到了,授权API服务器设置了授权cookie的域名为a.com,如果网站b.com仅清理本域名下的cookie自然无法删除a.com的授权cookie(浏览器不允许跨域操作或访问cookie)。

 

      解决方案:  1.  调用跟授权cookie域名同源的API服务器的退出接口。   如调用: a.com/logout。  通过同源域名下的服务器来删除授权cookie,问题正常解决。

                          2. 设置每次调用登录接口时,不判断用户是否已授权,直接返回新的授权cookie。    通过强制覆盖客户端授权Cookie处理,问题正常解决。

 

 这里把cookie跨域授权的核心示例展示一下,供参考:

services.AddAuthentication().AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
    options.LoginPath = "/admin/login"; //未登录重定向路径
    options.LogoutPath = "/login/logout";  //未授权时重定向路径
    options.ExpireTimeSpan = TimeSpan.FromDays(1);  //授权有效期
    options.Cookie.Domain = CONST.DEFAULT_DOMAIN;   //Cookie存储域名
    options.Cookie.Name = "AdminUserToken";      //Cookie名称
    options.Cookie.Path = "/";
    options.Cookie.IsEssential = true; //是否强制存储cookie,即使用户不同意使用cookie,也可以强制存储.
    options.Cookie.HttpOnly = true;    //设置是否允许客户端JS可访问授权cookie:  true=不允许
    options.Cookie.SameSite = SameSiteMode.None;    //设置跨域时设置为:None
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; ////设置跨域时设置为:CookieSecurePolicy.Always:确保Cookie通过 HTTPS 发送
    options.Events = new CookieAuthenticationEvents
    {
        // 重写 OnRedirectToLogin 事件,防止重定向,返回 401
        OnRedirectToLogin = context =>
        {
            if (context.Request.Path.StartsWithSegments("/user") && context.Response.StatusCode == 200)
            {
                context.Response.StatusCode = 401;
            }
            return Task.CompletedTask;
        }
    };
});

 

posted on 2025-03-27 20:19  深入学习ing  阅读(61)  评论(0)    收藏  举报

导航