在 _Layout ASP.NET 3.0 Razor Pages 项目中包含注销功能

Including Logout functionality in _Layout ASP.NET 3.0 Razor Pages project

我构建了一个简单的剃​​刀页面应用程序,其中登录使用 AddAuthentication() 并检查以确保用户名和密码与数据库中的值匹配。然后基于此授权每个页面,因此只有登录用户才能转到其他页面。我的登录视图模型包括以下类型的身份验证:

               var claims = new List<Claim>
                {
                    new Claim(ClaimTypes.Name, UserName)
                };
                var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

                if (RememberMe)
                {
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
                        new ClaimsPrincipal(claimsIdentity),
                        new AuthenticationProperties
                        {
                            IsPersistent = RememberMe,
                            ExpiresUtc = DateTimeOffset.UtcNow.AddHours(2)
                        });
                }
                else
                {
                    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
                        new ClaimsPrincipal(claimsIdentity));
                }
                return RedirectToPage("/index");

现在我需要创建注销功能。我觉得在导航栏中注销似乎很常见。我的导航栏是使用共享 _layout 构建的。因此,首先我需要将某种模型传递给此 _layout class 以便我可以捕获 onpost 事件以删除会话 cookie 或持久性 cookie(如果存在)并将用户重定向到登录页面。

如果没有控制器来维护 MVVM 方法,如何做到这一点?

其次,关于登出。我想用

    public async Task<IActionResult> Logout()
    {

        await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
        return RedirectToPage("/index");

    }

在我传递给 _layout 的模型中。但是,使用 HttpContext 仅适用于 PageModel,因此仅创建模型 class 似乎不起作用,而是我需要创建一个部分 PageModel class 以传递给 _layout。想法?

谢谢

我通常使用带有代码隐藏的单独 Razor 页面来执行注销。您应该在注销后向用户提供一些反馈,而不是仅仅将用户重定向到索引页面。因此,由于注销可以在 GET 上完成,因此您可以从您的布局到您的注销页面 link。