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 表

字段名称

字段类型

描述

IdGuid主键,默认是Guid
UserNameNvarchar(256)用户名或邮箱
NormalizedUserNameNvarchar(256)规范化用户名,转成了大写
EmailNvarchar(256)邮箱
NormalizedEmailNvarchar(256)规范化邮箱名,转成了大写
EmailConfirmedbit验证邮件确认,默认为false
PasswordHashNvarchar(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 : 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/536627.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/536627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle中创建游标,oracle 存储过程创建游标

Oracle与Sql Server差异点详解1、create函数或存储过程异同点Oracle 创建函数或存储过程一般是 create or replace ……SQL SERVER 则是在创建之前加一条语句&#xff0c;先判断是否已经存在&#xff0c;如果存在删除已有的函数或存储过程。函数语句&#xff1a;if exists (sel…

hosts文件不起作用

突然发现电脑的hosts文件不起作用了。之前用的狠正常&#xff0c;近期也没有修改过。首先排除什么格式、DNS、注册表之类的问题。最终解决办法&#xff08;权限问题&#xff1a;有问题的hosts文件图标上有个锁&#xff09;&#xff1a;1.C:\Windows\System32\drivers\etc下复制…

oracle面临的挑战,未来数据库管理员面临的三大挑战

原标题&#xff1a;未来数据库管理员面临的三大挑战前言今天的数据库管理员面临着三大挑战&#xff1a;工作重心向以应用程序为中心转移、支持多个数据库平台的需求、在云端以及在本地管理数据库性能的责任不断扩大。为了在今天和未来都能站稳脚跟&#xff0c;数据库管理员需要…

Reducer拆分

看到Redux官网上Reducer拆分后&#xff0c;最后生成的state的组合有点懵&#xff0c;主要是对combineReducers()这个工具类不了解&#xff0c;其实该方法是消除了一些样板代码。 如todoApp事例&#xff1a; import { combineReducers } from reduxconst todoApp combineReduce…

oracle中asmcmd,ASM工具asmcmd

Oracle的ASM一直不够透明&#xff0c;但Oracle还是提供了一些工具来访问ASM磁盘组的&#xff0c;asmcdm就是其中一个工具,本文将对其进行详细介绍。感觉Oracle的ASM一直很不透明&#xff0c;不过Oracle还是提供了一些工具来访问ASM磁盘组的&#xff0c;asmcdm就是其中一个工具。…

php页面底部信息居中,css底部如何局中?css三种居中方法

本篇文章给大家带来的内容是关于css底部如何局中&#xff1f;css三种居中方法&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。某天组长让我改一个表格的样式&#xff0c;要求底部局中。当时想很简单的嘛&#xff0c;哼哧哼哧…

打造汽车“安卓平台”,大众或亲手干掉传统汽车产业

干掉传统汽车产业的&#xff0c;很可能是大众&#xff0c;而不是特斯拉。 于无声处听惊雷。 2019年的日内瓦车展&#xff0c;看起来并没有传出太大的新闻。汽车世界的目光&#xff0c;依然被特斯拉的喧嚣所吸引。 然而&#xff0c;大众汽车展台上发生的一件看似不起眼的小事情&…

php返回101,PHP 101:变量与函数

功能很好.我看到功能徽标()比$logo更好. echo不占用太多内存,但$logo确实如此.即使函数logo()需要一些东西,它也将由PHP自己的垃圾收集器处理.您还可以使用这些函数来确保不会滥用分配的内存.> memory_get_peak_usage();> memory_get_usage();说明&#xff1a;Upon the e…

从 SPA 到 PWA:Web App的下一站在哪?

从AJAX&#xff08;Asynchronous JavaScript XML&#xff0c;异步JavaScript和XML&#xff09;开始&#xff0c; 尤其是 AngularJS 推出之后&#xff0c;SPA&#xff08;Single Page App&#xff0c;单页应用&#xff09;已经成为前端 App 的必选方案。 SPA 可以在客户端提供完…

php如何调用手机拨打电话,ionic调用手机系统的拨打电话

linux中wc命令用法Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1&#xff0e;命令格式: wc [选项]文件... 2&#xff0e;命令功能: 统计指定文件中的字节数. ...POJ1364 King-差分Description Once, in one kingdom, ther…

使用class-validator替换Joi包的方法

前言 对每个接口的传入参数进行校验&#xff0c;是一个Web后端项目的必备功能&#xff0c;有一个npm包叫Joi可以很优雅的完成这个工作&#xff0c;比如这样子&#xff1a; const schema {userId: Joi.string() }; const {error, value} Joi.validate({ userId: a string }, s…

linux服务器下降,linux - 远程升级Ubuntu:如何最大程度地降低丢失服务器的风险? - Ubuntu问答...

问题描述背景&#xff1a;由于raid控制器的不兼容性问题&#xff0c;我被迫将服务器从Ubuntu 8.04 LTS远程升级到10.04 LTS。与服务器的Internet连接比较稳定&#xff0c;很少掉线。尽管如此&#xff0c;我还是担心在升级时会丢失通过SSH的连接&#xff0c;从而使服务器处于无法…

Linux中英文命令对应

本文我们把Linux的中英文命令做了对应翻译&#xff0c;给需要的朋友参考一下。很多朋友在论坛上找Linux英文命令&#xff0c;我们给大家整理了比较全的Linux英文命令&#xff0c;并且附上了对应的中文意思。 su&#xff1a;Swith user 切换用户&#xff0c;切换到root用户 cat:…

linux实验四文件安全,西北农林科技大学Linux实验四 用户和文件安全

一、 实验目的实验四 用户和文件安全1. 理解用户、组的概念2. 理解/etc/passwd、/etc/group、/etc/shadow文件 3. 练习useradd、groupadd、gpasswd、groups命令二、 实验内容 1. 添加用户 2. 添加组3. 添加用户到工作组 4. 改变目录原始组 5. 建立多个用户共享的目录6. 理解文件…

Unable to resolve dependency问题解决

Unable to resolve dependency 是一个让我头疼的问题 之前总是阴差阳错调试好 但是也没有总结出来方法 但是今天找到了 方法来源 https://jingyan.baidu.com/article/19192ad8c489dfe53e5707ee.html 原因就是用户的gradle.properties 设置了代理&#xff0c;将文件内的代理注释…

linux 服务器进程,如何查看Linux服务器的进程

Linux服务器正常启动后&#xff0c;提供服务时会调用程序&#xff0c;占用进程。这时候如何查看系统中有哪些进程在被调用呢&#xff1f;我们可以通过以下命令来查看。1.psps命令是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和它所运行的状态…

计数排序与桶排序python实现

计数排序与桶排序python实现 计数排序 计数排序原理&#xff1a; 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值1的数组&#xff0c;初始化都为0 然后遍历原序列&#xff0c;并为数组中索引为当前值&#xff0d;最小值的值&#xff0b;&#xff11; 此时数组中…

perl脚本执行linux命令行,Perl调用shell命令方法小结

一、systemperl也可以用system调用shell的命令,它和awk的system一样,返回值也是它调用的命令的退出状态.代码如下:[rootAX3sp2 ~]# cat aa.pl#! /usr/bin/perl -w$file "wt.pl";system("ls -l wt.pl");$result system "ls -l $file";print &qu…

JVM快速调优手册02:常见的垃圾收集器

2019独角兽企业重金招聘Python工程师标准>>> 如果说收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体实现。 Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定&#xff0c;因此不同的厂商、不同版本的虚拟机所提供的垃圾收集器都可…

linux运维平台工具,Linux运维自动化工具 Kickstart

简介&#xff1a;批量安装操作系统工具之 Kickstart &#xff0c;RedHat 早前推出的产品( 不多说了&#xff0c;现在都玩 Cobbler 啦&#xff0c;见 http://www.linuxidc.com/Linux/2016-04/129977.htm )。测试环境&#xff1a;CentOS 6.6 x86_64 minimal一、安装软件包shell &…