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
});
我已经为登录和注销编写了一个 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
});