配置APS.NET Core 提供的 用户角色的数据库
Authentication :验证用户是否登录
Authorization :验证用户是否对某个资源有访问权限
ASP.NET Core 提供了Identity 身份标识框架,它用户RBAC 基于角色的访问控制策略。内置了对用户(UserManager)、角色(RoleManager)等表的管理接口。
Identity 身份标识框架中提供了 IdentityUser<TKey>、IdentityRole<TKey> 两个实体类型,TKey代表键的类型。我们一般还是需要为实体类增加额外属性,因此我们一般编写继承这两个类的User和Role.
一、定义用户和角色类
用户类:
1 2 3 4 5 | public class User:IdentityUser< long > { public DateTime CreationTime { get ; set ; } public string ? NickName { get ; set ; } } |
角色类:
1 2 3 4 | public class Role:IdentityRole< long > { } |
二、用NuGet 安装 Microsoft.AspNetCore.Identity.EntityFrameworkCore 包
三、定义权限数据库上下文
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class IdDbContext : IdentityDbContext<User, Role, long > { public IdDbContext(DbContextOptions options) : base (options) { } protected override void OnModelCreating(ModelBuilder builder) { base .OnModelCreating(builder); builder.ApplyConfigurationsFromAssembly( this .GetType().Assembly); } } |
UserManager 和 RoleManager 封装了对 IdentityDbContext 的操作,所以无须直接通过DbContext来操作。
四、注册服务并配置 用户和角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //配置用户角色 builder.Services.AddDbContext<IdDbContext>(options => { string connStr = builder.Configuration.GetConnectionString( "DefaultConnection" ); options.UseSqlServer(connStr); }); builder.Services.AddDataProtection(); services.AddIdentityCore<User>(options => { options.Password.RequireDigit = false ; options.Password.RequireLowercase = false ; options.Password.RequireNonAlphanumeric = false ; options.Password.RequireUppercase = false ; options.Password.RequiredLength = 6; options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider; options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider; }); var idBuilder = new IdentityBuilder( typeof (User), typeof (Role), services); idBuilder.AddEntityFrameworkStores<IdDbContext>() .AddDefaultTokenProviders() .AddRoleManager<RoleManager<Role>>() .AddUserManager<UserManager<User>>(); |
五、执行数据库迁移,生成用户角色相关权限表
1 2 | Add-Migration Update-databse |
1 2 | //项目中有多个DbContext 时,执行迁移需要指出是那个 add-migration add_user_Role -context IdDbContext |
六、创建用户名和角色
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | [Route( "api/[controller]" )] [ApiController] public class UserRoleController : ControllerBase { private readonly ILogger<UserRoleController> m_logger; private readonly UserManager<User> m_userManager; private readonly RoleManager<Role> m_roleManager; public UserRoleController(ILogger<UserRoleController> logger, UserManager<User> userManager, RoleManager<Role> roleManager) { m_logger = logger; m_userManager = userManager; m_roleManager = roleManager; } [HttpPost] public async Task<ActionResult> CreateUserRole() { bool roleExists = await m_roleManager.RoleExistsAsync( "admin" ); if (!roleExists) { Role role = new Role { Name = "Admin" }; var r = await m_roleManager.CreateAsync(role); if (!r.Succeeded) { return BadRequest(r.Errors); } } User user = await m_userManager.FindByNameAsync( "yyy" ); if (user == null ) { user = new User { UserName = "yyy" , Email = "flyingdream8@163.com" , EmailConfirmed = true }; var r = await m_userManager.CreateAsync(user, "123456" ); if (!r.Succeeded) { return BadRequest(r.Errors); } r = await m_userManager.AddToRoleAsync(user, "admin" ); if (!r.Succeeded) { return BadRequest(r.Errors); } } return Ok(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)