You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建受密码保护的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:35:22