Cookie过期后从身份注销导致HTTP错误400

问题描述 投票:1回答:1

在我的_LoginPartial.cshtml中,我有这个注销按钮:

<form id="logoutForm" class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Action("Index", "", new { area = "" })">
    <button id="logout" type="submit">
        Log out
    </button>
</form>

然后,据我所知,Logout.cshtml.cs称为:

public class LogoutModel : PageModel
{
    private readonly SignInManager<ApplicationUser> _signInManager;
    private readonly ILogger<LogoutModel> _logger;

    public LogoutModel(SignInManager<ApplicationUser> signInManager, ILogger<LogoutModel> logger)
    {
        _signInManager = signInManager;
        _logger = logger;
    }

    public void OnGet()
    {
    }

    public async Task<IActionResult> OnPost(string returnUrl = null)
    {
        await _signInManager.SignOutAsync();
        _logger.LogInformation("User logged out.");
        if (returnUrl != null)
        {
            return LocalRedirect(returnUrl);
        }
        else
        {
            return RedirectToPage();
        }
    }
}

但是如果用户会话Cookie在用户按下“注销”时已过期,则会收到此描述性错误消息:

HTTP错误400

永远不会命中Logout.cshtml.cs中任何地方设置的任何断点。

发生了什么事?

c# asp.net-core asp.net-core-identity
1个回答
0
投票

如果用户会话Cookie在用户按下“注销”时已过期,则会收到此描述性错误消息:

HTTP错误400

永远不会命中Logout.cshtml.cs中任何地方设置的任何断点。

我们知道,Razor Pages会自动受到XSRF / CSRF的保护。如果当前用户的身份验证过期,则客户端用户发送到服务器的防伪令牌(与当前用户的身份相关联)将导致验证失败,从而导致上述错误。

要解决上述错误,可以将IgnoreAntiforgeryToken属性应用于LogoutModel类,如下所示。

[AllowAnonymous]
[IgnoreAntiforgeryToken]
public class LogoutModel : PageModel
{ 

您可以从以下文档中获取有关“防止跨站点请求伪造(XSRF / CSRF)攻击”的详细信息:

https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery?view=aspnetcore-3.1

© www.soinside.com 2019 - 2024. All rights reserved.