Web API 将 JWT 保存在 cookie 中,但无法将其删除

Web API saves JWT in cookies, but can not remove it

我已经为登录和注销编写了一个 C# web api 端点。当有人登录时,我会在他们的浏览器 cookie 中保存一个 jwt 令牌。但是我无法在用户注销时删除 cookie。 cookie 仅在 POSTMAN 中被删除。 这是我的登录和注销方法:

登录

[Route("login")]
        [HttpPost]
        public async Task<IActionResult> login(PeiUser user)
        {
            var attemptedUser = await _db.PeiUsers.FirstOrDefaultAsync(u => u.UEmail == user.UEmail);
            if (attemptedUser == null)
            {
                return BadRequest(new { message = "Invalid credentials" });
            }
            else
            {
                if (!BCrypt.Net.BCrypt.Verify(user.UPassword, attemptedUser.UPassword))
                {
                    return BadRequest(new { message = "Invalid credentials" });
                }
                else
                {
                    var jwt = _jwtService.Generate(attemptedUser.UId); // Generate the Access token that expires in one day

                    Response.Cookies.Append("jwt", jwt, new CookieOptions //Save the JWT in the browser cookies, Key is "jwt"
                    {
                        HttpOnly = true,
                        SameSite = SameSiteMode.None,
                        Secure = true
                    });

                    return Ok(new { message = "You are now logged in" });
                }
            }
        }

注销



[Route("logout")]
        [HttpGet]
        public async Task<IActionResult> logout()
        {
            Response.Cookies.Delete("jwt");

            return Ok(new { message = "Success" });

        }

注:注销后控制台完美打印成功信息。但是cookie还在。

在 REACT 前端我这样调用:

 const logout = async() => {
        try{
            const res = await fetch('https://localhost:44361/api/users/logout', {
                headers: {"Content-Type": 'application/json'},
                credentials: 'include'
            })
            var content  = await res.json();
            console.log(content);
        }catch(err){
            console.log(err);
        }
    }

注:我从中学到的教程也完美地添加了cookie,没有任何问题。但我必须在 Login 端点的 Cookies.append 属性中添加 SameSite = SameSiteMode.None, Secure = true 才能使其正常工作。 cookie 在 POSTMAN 中被清除。所以我想我缺少一些配置。我通过将方法更改为 GET 和 POST

来尝试 logout 端点

感谢任何帮助。请向我询问任何其他信息

阅读文档后我找到了解决方案。注销端点 Cookies.Delete 中的一个小改动已经完成 trick.I 不知道它为什么工作

Response.Cookies.Delete("jwt", new CookieOptions 
            {
                HttpOnly = true,
                SameSite = SameSiteMode.None,
                Secure = true
            });

您需要将相同的 CookieOptions 传递给 Delete 方法,就像您最初用于创建此 cookie 的 Append 方法一样。这样做的原因与删除 cookie 的 quirky 方式有关:服务器发出一个新的 Set-Cookie 命令,但在过去的。浏览器将此解释为删除 cookie 的标志。但是为了让它发挥作用,它需要所有相同的选项,否则浏览器将无法理解服务器以现有 cookie 为目标。

您可以查看 the implementation of Response.Cookies.Delete 以了解其工作原理:

            Append(key, string.Empty, new CookieOptions
            {
                Path = options.Path,
                Domain = options.Domain,
                Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
                Secure = options.Secure,
                HttpOnly = options.HttpOnly,
                SameSite = options.SameSite
            });