asp.net core系列 48 Identity 身份模型自定义
一.概述
ASP.NET Core Identity提供了一个框架,用于管理和存储在 ASP.NET Core 应用中的用户帐户。 Identity添加到项目时单个用户帐户选择作为身份验证机制。 默认情况下,Identity可以使用的 Entity Framework (EF) Core 数据模型。 本文介绍如何自定义的身份标识模型。
1.1 下面是已经存在的身份模型, 由以下实体类型组成:
实体类型 |
说明 |
关系 |
Users(用户表) | 登录用户 | |
Roles (角色表) |
角色 |
|
UserClaims(用户声明表) | 用户拥有的权限 |
每个Users 有多个UserClaims
|
UserTokens | 用户的身份验证令牌 |
每个Users 有多个UserTokens
|
UserLogins | 将用户与登录相关联。 |
每个Users 有多个UserLogins
|
RoleClaims(角色声明表) | 角色拥有的权限 |
每个Roles 有多个RoleClaims
|
UserRoles | 用户和角色关联 |
每个Users 有多个Roles
|
(1) Users 表
字段名称 |
字段类型 |
描述 |
Id | Guid | 主键,默认是Guid |
UserName | Nvarchar(256) | 用户名或邮箱 |
NormalizedUserName | Nvarchar(256) | 规范化用户名,转成了大写 |
Nvarchar(256) | 邮箱 | |
NormalizedEmail | Nvarchar(256) | 规范化邮箱名,转成了大写 |
EmailConfirmed | bit | 验证邮件确认,默认为false |
PasswordHash | Nvarchar(max) | 密码哈希 |
SecurityStamp | Nvarchar(max) | 安全标记,Guid类型,用户凭据更改时生成随机值,如更改用户名 |
ConcurrencyStamp | Nvarchar(max) | 同步标记,Guid类型 |
PhoneNumber | Nvarchar(max) | 电话 |
PhoneNumberConfirmed | bit> | 电话确认 |
TwoFactorEnabled | bit | 双因子验证 |
LockoutEnd | datetimeoffset(7) | 锁定的到期日期,null表示没有锁定 |
LockoutEnabled | bit | 是否可以被锁定 |
AccessFailedCount | int | 登陆失败的次数, 确定是否锁定用户 |
1.2 默认模型的配置
Identity定义了许多从DbContext继承以配置和使用模型的上下文类,此配置是使用上下文类的OnModelCreating方法中的EF Core Code First Fluent API完成的。默认模型结构可以查看Migration文件以及查看模型关系ModelSnapshot文件,但要修改模型不在这里更改。下面是AspNetUsers模型代码:
下面是默认模型生成的数据表以及关系:
二.模型自定义
在EF上下文中当重写OnModelCreating
方法时
,base.OnModelCreating
方法
首先调用; 接下来重写的会覆盖默认模型配置。
public class ApplicationDbContext : IdentityDbContext<WebAppIdentityDemoUser>{public ApplicationDbContext(DbContextOptions<ApplicationDbContext> 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 : IdentityDbContext<WebAppIdentityDemoUser>//更新Startup.ConfigureServices以使用新{Application}User类,最后生成迁移,同步数据库。services.AddDefaultIdentity<WebAppIdentityDemoUser>().AddDefaultUI().AddEntityFrameworkStores<ApplicationDbContext>();
2.2 更改主键类型
在创建数据库之后更改PK列的数据类型在许多数据库系统上都存在问题。更改PK通常涉及删除和重新创建表。因此,在创建数据库时,应在初始迁移中指定PK类型。下面是更改主键类型步骤:
(1) 删除数据库,命令如下:
Drop-Database
(2) 移除之前生成的迁移,命令如下:
Remove-Migration
(3) 修改user,role表主键类型,以及相关代码改动
// 用户表设置主键为Intpublic class WebAppIdentityDemoUser : IdentityUser<int>{/// <summary>/// Full name/// </summary> [PersonalData]public string Name { get; set; }/// <summary>/// Birth Date/// </summary> [PersonalData]public DateTime DOB { get; set; }}// 角色表设置主键为Intpublic class WebAppIdentityDemoRole : IdentityRole<int>{}
(4) 修改上下文
public class ApplicationDbContext : IdentityDbContext<WebAppIdentityDemoUser, WebAppIdentityDemoRole,int>
(5) 修改服务注册
services.AddIdentity<WebAppIdentityDemoUser, WebAppIdentityDemoRole>()//如果使用Identity scaffolder将Identity文件添加到项目中,请删除对该项目的调用AddDefaultUI//.AddDefaultUI().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
(6) 生成迁移代码,命令如下
Add-Migration IdentitySchema
(7) 同步数据库
Update-Database IdentitySchema
此时表的主键类型已修改完成,包括关系表的外键类型也同步更新了,如下图所示:
2.3 添加导航属性
导航属性仅存在于EF模型中,而不存在于数据库中,如果导航关系没有改变,模型更改不需要更新数据库。如果更改关系的模型配置可能比进行其他更改更困难。必须注意取代现有的关系。下面示例是不改变模型关系,只是在user模型上添加导航属性以及在上下文中指定关系:
public class WebAppIdentityDemoUser : IdentityUser<int>{/// <summary>/// Full name/// </summary> [PersonalData]public string Name { get; set; }/// <summary>/// Birth Date/// </summary> [PersonalData]public DateTime DOB { get; set; }//定义导航属性public virtual ICollection<IdentityUserClaim<int>> 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.Entity<WebAppIdentityDemoUser>(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.Entity<IdentityUser>(b =>{b.ToTable("MyUsers");});//更改表字段名称builder.Entity<IdentityUserClaim<string>>(b =>{b.Property(e => e.ClaimType).HasColumnName("CType");b.Property(e => e.ClaimValue).HasColumnName("CValue");});//更改长度builder.Entity<IdentityUser>(b =>{b.Property(u => u.UserName).HasMaxLength(128);}); }
参考文献
自定义Identity
转载于:https://www.cnblogs.com/MrHSR/p/10593987.html
asp.net core系列 48 Identity 身份模型自定义相关推荐
- asp.net core系列 47 Identity 自定义用户数据
一.概述 接着上篇的WebAppIdentityDemo项目,将自定义用户数据添加到Identity DB,自定义扩展的用户数据类应继承IdentityUser类, 文件名为Areas / Ident ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core
0. 前言 这是一个新的系列,名字是<http://ASP.NET Core 入门到实战>.这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我 ...
- ASP.NET Core MVC I\/O编程模型
1.1. I/O编程模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bloc ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- 5.3Role和Claims授权「深入浅出ASP.NET Core系列」
5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...
- 4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
原文:4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,谢谢关注. HTTP请求过程 这里展示整 ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- 5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」
原文:5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢 ...
最新文章
- html文件修改后缀为aspx之后在ie6中格式显示不正确问题的解决办法
- [pytorch、学习] - 5.1 二维卷积层
- 走进JVM【二】理解JVM内存区域
- ef mysql modelfirst_MySQL –EF edmx(Model First)– Sql Server table
- 微擎即用WIFI源码V2.1.7
- MVC3.0 将网站设为首页和加为收藏的实现(IE/Firefox)
- $(document).ready和window.onload的区别
- STM32启动文件详解
- Android应用程序安装过程源代码分析(2)
- linux下R及Rstudio及Rhadoop安装
- 深度深度网络设计中各种归一化方法总结
- 数学公式神器【MathPix Snip】,截屏公式转为LaTeX代码
- 每日学习(React,Redux)
- POI word 模板 字段替换
- 战地指挥官 服务器维护,战地指挥官有哪些常见问题以及解决方法
- 如何用python制作小游戏
- Android UI系列 - 布局 - 属性详解
- 最新传奇木马及其防范全攻略
- JSP宅急送物流管理系统
- 微信链接不要随便点!小心电脑电脑被黑客操控
热门文章
- QtCreate由MinGW编译的项目,换为MSVC编译器后编译无法通过
- C/C++ _wcslwr_s 函数 – unicode 字符串大写转小写 - C语言零基础入门教程
- java if (name!=null name!=),java中的NullPointerException异常
- python制作测试报告_使用 python 生成 extent report 测试报告
- php5.4源码下载,WordPress v5.4.2官方正式版源码下载
- python去重保留唯一一个值_Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)...
- mysql的使用优化问题吗_如何对 mysql 进行优化的问题
- gnu linux中 使用,在Linux上使用GNU sed的方法
- cron 每10分钟执行一次_早餐儿子最爱它,简单卷一卷,10分钟做一大盘,三天两头吃一次...
- 服务器本地文件,云服务器 本地文件