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; })
用户数据表:

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" }); }
数据表中记录如下:

1.2.3 AspNetUserRoles——存储为用户分配的角色关系UserRole
以下语句为指定用户分配角色(建设用户与角色的关联关系):
result = await userManager.AddToRoleAsync(user, "SysAdmin");
在数据表中创建记录:

说明: 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表中生成如下记录:

浙公网安备 33010602011771号