室内设计相关网站,百度站长平台验证网站,网站建设方案实验报告,网站快速排名的方法一.概述 ASP.NET Core Identity提供了一个框架#xff0c;用于管理和存储在 ASP.NET Core 应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下#xff0c;Identity可以使用的 Entity Framework (EF) Core 数据模型。 本文介绍如何自定义…一.概述 ASP.NET Core Identity提供了一个框架用于管理和存储在 ASP.NET Core 应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下Identity可以使用的 Entity Framework (EF) Core 数据模型。 本文介绍如何自定义的身份标识模型。 1.1 下面是已经存在的身份模型, 由以下实体类型组成: 实体类型 说明 关系 Users(用户表)登录用户 Roles (角色表) 角色 UserClaims(用户声明表)用户拥有的权限每个Users有多个UserClaimsUserTokens用户的身份验证令牌每个Users有多个UserTokensUserLogins将用户与登录相关联。每个Users有多个UserLoginsRoleClaims(角色声明表)角色拥有的权限每个Roles有多个RoleClaimsUserRoles用户和角色关联每个Users有多个Roles (1) Users 表 字段名称 字段类型 描述 IdGuid主键默认是GuidUserNameNvarchar(256)用户名或邮箱NormalizedUserNameNvarchar(256)规范化用户名转成了大写EmailNvarchar(256)邮箱NormalizedEmailNvarchar(256)规范化邮箱名转成了大写EmailConfirmedbit验证邮件确认默认为falsePasswordHashNvarchar(max)密码哈希SecurityStampNvarchar(max)安全标记Guid类型用户凭据更改时生成随机值如更改用户名ConcurrencyStampNvarchar(max)同步标记Guid类型PhoneNumberNvarchar(max)电话PhoneNumberConfirmedbit电话确认TwoFactorEnabledbit双因子验证LockoutEnddatetimeoffset(7)锁定的到期日期,null表示没有锁定LockoutEnabledbit是否可以被锁定AccessFailedCountint登陆失败的次数, 确定是否锁定用户 1.2 默认模型的配置 Identity定义了许多从DbContext继承以配置和使用模型的上下文类此配置是使用上下文类的OnModelCreating方法中的EF Core Code First Fluent API完成的。默认模型结构可以查看Migration文件以及查看模型关系ModelSnapshot文件但要修改模型不在这里更改。下面是AspNetUsers模型代码 下面是默认模型生成的数据表以及关系 二.模型自定义 在EF上下文中当重写OnModelCreating方法时base.OnModelCreating方法首先调用; 接下来重写的会覆盖默认模型配置。 public class ApplicationDbContext : IdentityDbContextWebAppIdentityDemoUser{public ApplicationDbContext(DbContextOptionsApplicationDbContext options): base(options){}protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);// Customize the ASP.NET Core Identity model and override the defaults if needed.// For example, you can rename the ASP.NET Core Identity table names and more.// Add your customizations after calling base.OnModelCreating(builder);}} 2.1 自定义用户数据 在上篇有讲过自定义用户数据这里在总结下。自定义用户数据支持通过继承IdentityUser类。 自定义类命名约定 {Application}User。 //定义{Application}User扩展类实现用户模型public class WebAppIdentityDemoUser : IdentityUser//使用{Application}User作为上下文的泛型参数的类型public class ApplicationDbContext : IdentityDbContextWebAppIdentityDemoUser//更新Startup.ConfigureServices以使用新{Application}User类最后生成迁移同步数据库。services.AddDefaultIdentityWebAppIdentityDemoUser().AddDefaultUI().AddEntityFrameworkStoresApplicationDbContext(); 2.2 更改主键类型 在创建数据库之后更改PK列的数据类型在许多数据库系统上都存在问题。更改PK通常涉及删除和重新创建表。因此在创建数据库时应在初始迁移中指定PK类型。下面是更改主键类型步骤 (1) 删除数据库命令如下 Drop-Database (2) 移除之前生成的迁移命令如下 Remove-Migration (3) 修改user,role表主键类型以及相关代码改动 // 用户表设置主键为Intpublic class WebAppIdentityDemoUser : IdentityUserint{/// summary/// Full name/// /summary[PersonalData]public string Name { get; set; }/// summary/// Birth Date/// /summary[PersonalData]public DateTime DOB { get; set; }}// 角色表设置主键为Intpublic class WebAppIdentityDemoRole : IdentityRoleint{} (4) 修改上下文 public class ApplicationDbContext : IdentityDbContextWebAppIdentityDemoUser, WebAppIdentityDemoRole,int (5) 修改服务注册 services.AddIdentityWebAppIdentityDemoUser, WebAppIdentityDemoRole()//如果使用Identity scaffolder将Identity文件添加到项目中请删除对该项目的调用AddDefaultUI//.AddDefaultUI().AddEntityFrameworkStoresApplicationDbContext().AddDefaultTokenProviders(); (6) 生成迁移代码命令如下 Add-Migration IdentitySchema (7) 同步数据库 Update-Database IdentitySchema 此时表的主键类型已修改完成包括关系表的外键类型也同步更新了如下图所示 2.3 添加导航属性 导航属性仅存在于EF模型中而不存在于数据库中如果导航关系没有改变模型更改不需要更新数据库。如果更改关系的模型配置可能比进行其他更改更困难。必须注意取代现有的关系。下面示例是不改变模型关系只是在user模型上添加导航属性以及在上下文中指定关系 public class WebAppIdentityDemoUser : IdentityUserint{/// summary/// Full name/// /summary[PersonalData]public string Name { get; set; }/// summary/// Birth Date/// /summary[PersonalData]public DateTime DOB { get; set; }//定义导航属性public virtual ICollectionIdentityUserClaimint Claims { get; set; }} protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);// Customize the ASP.NET Core Identity model and override the defaults if needed.// For example, you can rename the ASP.NET Core Identity table names and more.// Add your customizations after calling base.OnModelCreating(builder);builder.EntityWebAppIdentityDemoUser(b {// Each User can have many UserClaimsb.HasMany(e e.Claims).WithOne().HasForeignKey(uc uc.UserId).IsRequired();});} 对于所有用户导航属性, 用户和角色导航属性添加所有导航属性。参考官网文档。 2.4 更改表/列名称,字段长度(上下文中更改) protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(builder);//更改表名称builder.EntityIdentityUser(b {b.ToTable(MyUsers);});//更改表字段名称builder.EntityIdentityUserClaimstring(b {b.Property(e e.ClaimType).HasColumnName(CType);b.Property(e e.ClaimValue).HasColumnName(CValue);});//更改长度builder.EntityIdentityUser(b {b.Property(u u.UserName).HasMaxLength(128);}); } 参考文献 自定义Identity 转载于:https://www.cnblogs.com/MrHSR/p/10593987.html