Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core .Net Core无法在cookie过期后发布到注销页_Asp.net Core_Logout_Razor Pages - Fatal编程技术网

Asp.net core .Net Core无法在cookie过期后发布到注销页

Asp.net core .Net Core无法在cookie过期后发布到注销页,asp.net-core,logout,razor-pages,Asp.net Core,Logout,Razor Pages,当我创建一个新的Asp.Net核心web应用程序和 services.configureApplicationOK(选项=> { options.ExpireTimeSpan=TimeSpan.FromSeconds(5); }); 然后我在5秒钟后注销。但是,当时我的页面上仍然有“注销”按钮,如果我单击该按钮,我会收到一个400错误请求 然后,我尝试删除过期代码,通过注销按钮注销,然后使用邮递员发布注销后操作,但我得到了相同的结果 [AllowAnonymous] 公共类LogoutMode

当我创建一个新的Asp.Net核心web应用程序和

services.configureApplicationOK(选项=>
{
options.ExpireTimeSpan=TimeSpan.FromSeconds(5);
});
然后我在5秒钟后注销。但是,当时我的页面上仍然有“注销”按钮,如果我单击该按钮,我会收到一个
400错误请求

然后,我尝试删除过期代码,通过注销按钮注销,然后使用邮递员发布注销后操作,但我得到了相同的结果

[AllowAnonymous]
公共类LogoutModel:PageModel
{
专用只读签名管理器\u签名管理器;
专用只读ILogger\u记录器;
公共注销模型(SignInManager SignInManager、ILogger记录器)
{
_signInManager=signInManager;
_记录器=记录器;
}
公共互联网
{
}
//当我注销时(无论是通过单击注销按钮还是在cookie过期后),
//试着调用这个动作,我收到了一个400个错误的请求
公共异步任务OnPost(字符串returnUrl=null)
{
等待_signInManager.SignOutAsync();
_logger.LogInformation(“用户注销”);
if(returnUrl!=null)
{
返回LocalRedirect(returnUrl);
}
其他的
{
返回页();
}
}
}
有人知道这里发生了什么吗


编辑:顺便说一句,我使用的是.Net Core 2.2

所有帖子都受到即时防伪令牌的保护。当用户登录时,防伪令牌实际上绑定到该特定用户。由于用户的身份验证很快过期,几乎在页面加载时,令牌已经无效。它是为特定用户创建的,但该用户不再经过身份验证。因此,在发出注销post请求时,令牌验证将失败,您将获得400

一个快速修复方法是将
[IgnoreAntiforgeryToken]
属性应用于您的
LogoutModel
。从技术上讲,这消除了一层安全性,但我看不到恶意恶意参与者伪造对注销端点的请求能获得多少好处


然而,这主要是人为的问题。您可能会调低auth cookie到期时间来测试到期时会发生什么,但5秒的到期时间并不现实。这样,用户就必须对每个请求进行真正的重新验证,这意味着他们永远不会真正通过登录页面。一旦他们登录,他们就会过期,必须重新登录。对于更现实的数字,如20分钟,用户在同一页面上坐20分钟以上,然后尝试单击“注销”的可能性很低,这基本上不是问题。

在版面页面上检查会话过期情况,并在Account Controller中调用注销操作

下面是Layout.cshtml部分中的脚本,并在Appsettings.json中添加sessiontimeout

<script>
    //session end
    var sessionTimeoutWarning = @Configuration.GetSection("Cookie")["sessionTimeout"] - 1;

    var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
    setTimeout('SessionEnd()', sTimeout);

    function SessionEnd() {
        window.location = "/Account/LogOff";
    }
    </script>

该问题仍然存在于.NET Core 3.1中。这很烦人。注销用户的注销操作应导致注销用户,即不执行任何操作,但肯定不会显示错误消息。
 public ActionResult LogOff()
        {
            _signInManager.SignOutAsync();
            return RedirectToAction("Index", "Home");
        }