如何创建受密码保护的Razor Pages页面?
实现单密码保护的Razor Pages页面访问控制
我想创建一个受密码保护的页面,只有在Password.cshtml页面提交正确密码并完成认证的用户,才能访问Blog.cshtml页面。目前已经写了部分代码,但在认证环节卡壳了,查了相关文档也没解决。
现有代码
Password.cshtml(前端)
@page @model comfrt.world.Pages.Blog.PasswordModel <form asp-page-handler="Submit"> Insert password: <input type="password" name="Password"/> <input type="submit"/> </form>
Password.cshtml(后端)
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace comfrt.world.Pages.Blog { public class PasswordModel : PageModel { public void OnPostSubmit() { if (Request.Form["Password"].Equals("<password>")) { //Authenticate user } } } }
Blog.cshtml
@page @if (!User.Identity.IsAuthenticated) { Response.Redirect("./Password"); } @model comfrt.world.Pages.Blog.BlogModel <div> @* Blog page *@ </div>
解决步骤
1. 配置Cookie认证(Program.cs)
首先在Program.cs中添加Cookie认证服务,这是会话级认证的基础:
var builder = WebApplication.CreateBuilder(args); // 注册Razor Pages服务 builder.Services.AddRazorPages(); // 添加Cookie认证配置 builder.Services.AddAuthentication("CookieAuth") .AddCookie("CookieAuth", options => { options.LoginPath = "/Blog/Password"; // 未认证时自动跳转的密码页 options.ExpireTimeSpan = TimeSpan.FromHours(1); // 认证会话有效期 options.Cookie.Name = "BlogAuthCookie"; // 自定义Cookie名称 }); var app = builder.Build(); // 中间件顺序必须是先认证再授权 app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
2. 完善Password页的认证逻辑
修改Password.cshtml.cs,在密码验证通过后创建用户身份并完成登录:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.Security.Claims; using Microsoft.AspNetCore.Authentication; namespace comfrt.world.Pages.Blog { public class PasswordModel : PageModel { public async Task<IActionResult> OnPostSubmit() { var inputPassword = Request.Form["Password"]; const string validPassword = "<password>"; // 替换为你的真实密码 if (inputPassword.Equals(validPassword)) { // 创建用户身份声明 var claims = new List<Claim> { new Claim(ClaimTypes.Name, "BlogAuthenticatedUser") }; var identity = new ClaimsIdentity(claims, "CookieAuth"); var authProps = new AuthenticationProperties { IsPersistent = false // 关闭浏览器后会话失效 }; // 完成用户登录 await HttpContext.SignInAsync("CookieAuth", new ClaimsPrincipal(identity), authProps); // 登录成功跳转至Blog页 return RedirectToPage("./Blog"); } // 密码错误时添加验证提示 ModelState.AddModelError(string.Empty, "密码不正确"); return Page(); } } }
3. 优化Blog页的授权控制
不要直接在页面中用Response.Redirect,改用ASP.NET Core标准的授权方式:
方式一:后端添加授权特性
修改Blog.cshtml.cs,添加[Authorize]特性指定认证方案:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.RazorPages; namespace comfrt.world.Pages.Blog { [Authorize(AuthenticationSchemes = "CookieAuth")] public class BlogModel : PageModel { public void OnGet() { // 页面业务逻辑 } } }
此时Blog.cshtml可以简化为:
@page @model comfrt.world.Pages.Blog.BlogModel <div> @* Blog页面内容 *@ </div>
方式二:页面直接添加授权指令
如果不想修改后端,也可以在Blog.cshtml顶部添加授权指令:
@page @attribute [Authorize(AuthenticationSchemes = "CookieAuth")] @model comfrt.world.Pages.Blog.BlogModel <div> @* Blog页面内容 *@ </div>
4. (可选)添加退出登录功能
在Blog页添加退出按钮,让用户可以主动结束认证会话:
在Blog.cshtml中添加表单:
<form asp-page-handler="Logout" method="post"> <input type="submit" value="退出登录"/> </form>
在Blog.cshtml.cs中添加退出逻辑:
public async Task<IActionResult> OnPostLogout() { await HttpContext.SignOutAsync("CookieAuth"); return RedirectToPage("./Password"); }
内容的提问来源于stack exchange,提问作者Benned
相关产品推荐
相关产品推荐

