Blazor——数据库结构

1  数据库结构

 1.1  数据表:一共8张表:_EFMigrationsHistory,    AspNetUsers, AspNetRoles, AspNetUserRoles, AspNetRoleClaims,      AspNetUserClaims, AspNetUserLogins, AspNetUserTokens.

1.2 数据表的作用

      1.2.1 AspNetUsers——存储user/用户数据

用户注册:会在AspNetUsers中增加一条记录,由于是模拟环境无法验证用户邮箱,因此字段EmailConfirmed的值是0;在这种情况下,使用新增的用户登录就会产生NotAllowed的结果。

      要解决这个问题,有两种方案:修改用户记录,将字段EmailConfirmed赋值为1;将options.SignIn.RequireConfirmedAccount=false;     

builder.Services.AddIdentityCore<ApplicationUser>(options =>
{
   options.SignIn.RequireConfirmedAccount = false;
//options.Stores.MaxLengthForKeys = 128;
//options.SignIn.RequireConfirmedAccount = true;

})

用户数据表:

image

1.2.2  AspNetRoles——存储用户角色/Role

      在DBCore的OnModelCreating方法中使用以下代码,可以创建角色并在表中生成记录:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    //add roles: "System Administrator", "Administrator", "User"
    builder.Entity<ApplicationRole>().HasData(new ApplicationRole { Name = "SysAdmin", NormalizedName = "SYSADMIN", Id = 100, ConcurrencyStamp = "100" });
    builder.Entity<ApplicationRole>().HasData(new ApplicationRole { Name = "Admin", NormalizedName = "ADMIN", Id =101, ConcurrencyStamp = "101" });
    builder.Entity<ApplicationRole>().HasData(new ApplicationRole { Name = "User", NormalizedName = "USER", Id = 102, ConcurrencyStamp = "102" });
    
    //builder.Entity<ApplicationRole>().HasData(new ApplicationRoleClaim { ClaimType = "12", ClaimValue = "34" });
}

数据表中记录如下:

image

1.2.3 AspNetUserRoles——存储为用户分配的角色关系UserRole

以下语句为指定用户分配角色(建设用户与角色的关联关系):

result = await userManager.AddToRoleAsync(user, "SysAdmin");

在数据表中创建记录:

image

 说明: UserId=1, 表示用户的UserId是1,给这位用户分配了一个角色,角色的RoleId是100; 用户的具体信息可以可以根据这个ID号1到用户表AspNetUsers中查找,可以发现这个用户是SysAdmin; Role的具体信息可以根据这个Id号100到AspNetRoles表中查找, 可以发现这个角色是SysAdmin。

1.2.4  添加用户声明

          执行以下代码,便会在数据表AspNetUserClaims中添加记录;当用户登录时,都会从表中读取声明并添加到cookie中。       

 var user = await UserManager.FindByEmailAsync(Input.Email);
 var claimeResult = await UserManager.AddClaimAsync(user, new Claim("your-claim2", "your-value2"));

 

1.2.5  添加用户登录声明

          执行以下代码,便会在数据表AspNetUserLogins中添加记录;

            var user = await UserManager.FindByEmailAsync(Input.Email);
            await UserManager.AddLoginAsync(user, new UserLoginInfo("Bizerba", "RD", "Bizerba-RD"));

 

    删除与添加记录:

await UserManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await UserManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken1");
await UserManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken1", newRefreshToken);

删除、添加、验证在:

var user = await UserManager.FindByEmailAsync(Input.Email);
await UserManager.RemoveAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var newRefreshToken = await UserManager.GenerateUserTokenAsync(user, "MyApp", "RefreshToken");
await UserManager.SetAuthenticationTokenAsync(user, "MyApp", "RefreshToken", newRefreshToken);

var refreshToken = await UserManager.GetAuthenticationTokenAsync(user, "MyApp", "RefreshToken");
var isValid = await UserManager.VerifyUserTokenAsync(user, "MyApp", "RefreshToken", refreshToken);

 1.2.6 添加角色声明——AspNetRoleClaims

     以下代码为角色添加声明

 var role = await roleManager.FindByNameAsync("SysAdmin");
 if (role != null)
 {
     result = await roleManager.AddClaimAsync(role, new Claim("scope", "1"));
 }    

代码执行后,在AspNetRoleClaims表中生成如下记录:

image

 

posted on 2025-06-18 14:36  博观约取*厚积薄发  阅读(24)  评论(0)    收藏  举报