.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; } }; });
*感谢您的阅读。喜欢的、有用的就请大哥大嫂们高抬贵手“推荐一下”吧!你的精神 支持是博主强大的写作动力。欢迎转载!
*博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
*我的博客: http://www.cnblogs.com/lxhbky/
*博主的文章是自己平时开发总结的经验,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。
*我的博客: http://www.cnblogs.com/lxhbky/