在我的ASP.NET Core应用程序中,我有以下途径让用户注销:
[HttpPost("logout")]
public async Task Logout()
{
await _signInManager.SignOutAsync();
}
我有这个路线来检查当前的用户名:
[HttpGet("getusername")]
public string GetUserName()
{
return _userManager.GetUserName(User);
}
然而,当调用路由时,第二个路由的行为仍然像用户登录一样。这个问题声称,如果SignOutAsync生成的HTTP响应没有得到客户端的处理,但它是通过AJAX请求的,代码为:
async function logout(){
let response = await fetch('/api/user/logout', {method: 'post'});
if(response.ok){
Cookies.remove('username');
window.location.reload();
}else{
alert(`Failed to log out due to networking error: ${response.status} ${response.statusText}`)
}
}
因此该改变被处理。为什么这段代码没有按预期运行,注销AJAX调用在哪里结束会话?我使用Linux上的Firefox 81.0.1作为我的客户端。
我发现了这个问题。这取决于关于Asp.net Core和Firefox的两个意想不到的事实:
- 当从Asp.net Core路由返回一个空字符串时,它会返回HTTP 204 No Content
- 当Firefox收到HTTP 204 No Content的响应时,它不会加载新页面,而是再次显示旧页面(带有一个闪光灯,表明正在进行实际刷新!(
总之,当我注销时,用户名注销在后端发生了,但我没有意识到这一点,因为当我在另一个选项卡中刷新用户名检查路由时,用户名再次出现。我认为这是Firefox的一个问题。