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

为基于Razor Pages的ASP.NET Core Web应用添加用户角色

在ASP.NET Core Razor Pages(独立账户)中实现角色权限管理

1. 启用角色服务支持

默认独立账户模板未开启角色功能,先在Program.cs中扩展身份服务,添加角色支持:

var builder = WebApplication.CreateBuilder(args);

// 配置数据库上下文
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

// 启用身份验证并添加角色服务
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddRoles<IdentityRole>() // 核心:添加角色管理支持
    .AddEntityFrameworkStores<ApplicationDbContext>();

// 其他服务配置...

var app = builder.Build();

// 中间件配置(静态文件、路由、认证授权等)...

app.Run();

2. 初始化超级用户与角色

通过种子数据创建初始角色和超级用户,在Program.cs中添加以下逻辑(放在app.Run()之前):

using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    try
    {
        var roleManager = services.GetRequiredService<RoleManager<IdentityRole>>();
        var userManager = services.GetRequiredService<UserManager<IdentityUser>>();

        // 创建预设角色
        string[] roleNames = { "SuperAdmin", "Admin", "User" };
        foreach (var roleName in roleNames)
        {
            if (!await roleManager.RoleExistsAsync(roleName))
                await roleManager.CreateAsync(new IdentityRole(roleName));
        }

        // 创建超级用户
        var superAdminEmail = "superadmin@yourdomain.com";
        var superAdminPassword = "Super@123"; // 需符合身份验证密码规则
        var superAdmin = await userManager.FindByEmailAsync(superAdminEmail);
        if (superAdmin == null)
        {
            var newSuperAdmin = new IdentityUser 
            { 
                UserName = superAdminEmail, 
                Email = superAdminEmail, 
                EmailConfirmed = true 
            };
            await userManager.CreateAsync(newSuperAdmin, superAdminPassword);
            await userManager.AddToRoleAsync(newSuperAdmin, "SuperAdmin");
        }
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "初始化角色和超级用户时出错");
    }
}

运行一次应用后,数据库会生成对应角色和超级用户,后续可注释这段代码避免重复执行。

3. 构建用户创建页面(Razor Page)

新建Pages/Users/CreateUser.cshtml及对应的页面模型,实现角色受限的用户创建功能:

CreateUser.cshtml(前端)

@page
@model CreateUserModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<h1>创建新用户</h1>

<div class="row">
    <div class="col-md-4">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Input.Email" class="control-label"></label>
                <input asp-for="Input.Email" class="form-control" />
                <span asp-validation-for="Input.Email" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.Password" class="control-label"></label>
                <input asp-for="Input.Password" class="form-control" />
                <span asp-validation-for="Input.Password" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Input.Role" class="control-label"></label>
                <select asp-for="Input.Role" class="form-control" asp-items="@Model.RoleOptions">
                    <option value="">请选择角色</option>
                </select>
                <span asp-validation-for="Input.Role" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="创建" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

CreateUser.cshtml.cs(页面模型)

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;

namespace YourAppNamespace.Pages.Users
{
    // 仅允许超级管理员和管理员访问此页面
    [Authorize(Roles = "SuperAdmin, Admin")]
    public class CreateUserModel : PageModel
    {
        private readonly UserManager<IdentityUser> _userManager;
        private readonly RoleManager<IdentityRole> _roleManager;

        public CreateUserModel(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            _userManager = userManager;
            _roleManager = roleManager;
        }

        [BindProperty]
        public InputModel Input { get; set; }

        public SelectList RoleOptions { get; set; }

        public class InputModel
        {
            [Required]
            [EmailAddress]
            public string Email { get; set; }

            [Required]
            [DataType(DataType.Password)]
            public string Password { get; set; }

            [Required]
            public string Role { get; set; }
        }

        public async Task OnGetAsync()
        {
            // 根据当前用户角色,筛选可分配的角色
            var currentUser = await _userManager.GetUserAsync(User);
            var isSuperAdmin = await _userManager.IsInRoleAsync(currentUser, "SuperAdmin");

            var availableRoles = isSuperAdmin
                ? _roleManager.Roles.Select(r => r.Name).ToList()
                : new[] { "User" }; // 管理员仅能创建普通用户

            RoleOptions = new SelectList(availableRoles);
        }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                await OnGetAsync();
                return Page();
            }

            var user = new IdentityUser 
            { 
                UserName = Input.Email, 
                Email = Input.Email, 
                EmailConfirmed = true 
            };
            var createResult = await _userManager.CreateAsync(user, Input.Password);

            if (createResult.Succeeded)
            {
                await _userManager.AddToRoleAsync(user, Input.Role);
                return RedirectToPage("/Index"); // 跳转到首页或用户列表页
            }

            foreach (var error in createResult.Errors)
            {
                ModelState.AddModelError(string.Empty, error.Description);
            }

            await OnGetAsync();
            return Page();
        }
    }
}

注意:将YourAppNamespace替换为你的项目命名空间。

4. 页面权限控制

在需要权限校验的页面模型上添加[Authorize]属性,限制角色访问:

// 仅超级管理员可访问的页面
[Authorize(Roles = "SuperAdmin")]
public class SystemSettingsModel : PageModel
{
    // 页面逻辑...
}

也可在前端根据角色动态显示内容:

@if (User.IsInRole("SuperAdmin"))
{
    <a asp-page="/Users/CreateUser" class="btn btn-primary">创建管理员/普通用户</a>
}
else if (User.IsInRole("Admin"))
{
    <a asp-page="/Users/CreateUser" class="btn btn-primary">创建普通用户</a>
}

内容的提问来源于stack exchange,提问作者Megan Paterson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:50:42