为基于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
相关产品推荐
相关产品推荐

