学海无涯

导航

统计

配置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();
       }
   }

  

 

posted on   宁静致远.  阅读(82)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示