首页 > 解决方案 > 在 _Layout ASP.NET 3.0 Razor Pages 项目中包括注销功能

问题描述

我已经构建了一个简单的剃​​须刀页面应用程序,其中登录使用 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 类,这样我就可以捕获一个 onpost 事件,以删除会话 cookie 或持久性 cookie(如果存在)并将用户重定向到登录页面。

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

第二,关于退出。我想用

    public async Task<IActionResult> Logout()
    {

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

    }

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

谢谢

标签: asp.net-coreasp.net-identityasp.net-core-3.1

解决方案


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


推荐阅读