关键词:
原文: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.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类。 自定义类命名约定 ApplicationUser。
//定义ApplicationUser扩展类,实现用户模型 public class WebAppIdentityDemoUser : IdentityUser //使用ApplicationUser作为上下文的泛型参数的类型: public class ApplicationDbContext : IdentityDbContext<WebAppIdentityDemoUser> //更新Startup.ConfigureServices以使用新ApplicationUser类,最后生成迁移,同步数据库。 services.AddDefaultIdentity<WebAppIdentityDemoUser>() .AddDefaultUI() .AddEntityFrameworkStores<ApplicationDbContext>();
2.2 更改主键类型
在创建数据库之后更改PK列的数据类型在许多数据库系统上都存在问题。更改PK通常涉及删除和重新创建表。因此,在创建数据库时,应在初始迁移中指定PK类型。下面是更改主键类型步骤:
(1) 删除数据库,命令如下:
Drop-Database
(2) 移除之前生成的迁移,命令如下:
Remove-Migration
(3) 修改user,role表主键类型,以及相关代码改动
// 用户表设置主键为Int 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; // 角色表设置主键为Int public 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 UserClaims b.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
asp.netcore系列之用户认证-给项目添加identity(代码片段)
对于没有包含认证(authentication),的项目,你可以使用基架(scaffolder)把Identity的程序集包加入到项目中,并且选择性的添加Identity的代码进行生成。 虽然基架已经生成了很多必须的代码,但是你仍然需要更新你的项目来完善... 查看详情
如何使用 ASP.NET Core 3.1 将 Android 应用程序集成到 Identity Server 以进行身份验证?
】如何使用ASP.NETCore3.1将Android应用程序集成到IdentityServer以进行身份验证?【英文标题】:HowtointegrateAndroidApptoIdentityServerwithASP.NETCore3.1forAuthentication?【发布时间】:2021-01-2613:44:03【问题描述】:我已经使用Angular模板创建了AS... 查看详情
如何在 ASP.NET Core Identity 中结合外部登录和双重身份验证?
】如何在ASP.NETCoreIdentity中结合外部登录和双重身份验证?【英文标题】:HowcanIcombineexternalloginsandtwo-factorauthenticationinASP.NETCoreIdentity?【发布时间】:2020-04-0109:22:41【问题描述】:我正在为使用ASP.NETCore3.1构建的简单Web应用程序实... 查看详情
在 ASP.NET Core 上使用 MSAL 和 Identity 注册外部用户
】在ASP.NETCore上使用MSAL和Identity注册外部用户【英文标题】:RegisterexternalusersusingMSALwithIdentityonASP.NETCore【发布时间】:2020-07-0408:48:29【问题描述】:问题:在我的ASP.NETCore3.1MVCWeb应用程序中,我在startup.cs中使用services.AddSignIn(Confi... 查看详情
Asp.Net Core 2.1 Identity - UserStore 依赖注入
】Asp.NetCore2.1Identity-UserStore依赖注入【英文标题】:Asp.NetCore2.1Identity-UserStoredependencyinjection【发布时间】:2018-11-2310:59:06【问题描述】:我正在尝试为我的身份模型实现自定义UserStore;但是,我在应用启动时遇到了这个运行时错... 查看详情
为啥在使用 ASP.NET Core Identity 和基于令牌的身份验证时登录新用户?
】为啥在使用ASP.NETCoreIdentity和基于令牌的身份验证时登录新用户?【英文标题】:Whysign-inanewuserwhenusingASP.NETCoreIdentityandtoken-basedauth?为什么在使用ASP.NETCoreIdentity和基于令牌的身份验证时登录新用户?【发布时间】:2019-09-1711:51:1... 查看详情
Asp.NET Core 2.0 API 控制器中的 User.Identity.Name 为空
】Asp.NETCore2.0API控制器中的User.Identity.Name为空【英文标题】:User.Identity.NameisemptyinAsp.NETCore2.0APIController【发布时间】:2018-03-3022:52:00【问题描述】:我是ASP.NET核心本身的新手。但是,我在ASP.NETCore2.0中创建WebAPI。我已经配置了基... 查看详情
如何将 ASP.NET Core 身份链接到另一个实体?
】如何将ASP.NETCore身份链接到另一个实体?【英文标题】:HowtolinkASP.NETCoreidentitytoanotherentity?【发布时间】:2021-04-2208:48:09【问题描述】:伙计们,我想创建一个简单的应用程序,用户可以在其中发布他们想要的任何文本,带有... 查看详情
ASP.NET Core 2.1 中的 Scaffold Identity UI 并添加全局过滤器
】ASP.NETCore2.1中的ScaffoldIdentityUI并添加全局过滤器【英文标题】:ScaffoldIdentityUIinASP.NETCore2.1andaddGlobalFilter【发布时间】:2019-05-1311:45:19【问题描述】:我有一个ASP.NETCore2.1应用程序,我在其中使用身份脚手架,如here中所述现在我... 查看详情
将 JWT 自动加载到 User.Identity (ASP.NET Core 3.1)
】将JWT自动加载到User.Identity(ASP.NETCore3.1)【英文标题】:LoadJWTintoUser.Identityautomatically(ASP.NETCore3.1)【发布时间】:2020-09-2116:26:37【问题描述】:我正在从事一个具有微服务架构的项目。我有一个APIRest作为API网关,我想从JSONWeb令牌... 查看详情
理解asp.netcore
注:本文隶属于《理解ASP.NETCore》系列文章,请查看置顶博客或点击此处查看全文目录之前,我们已经了解了ASP.NETCore中的身份认证,现在,我们来聊一下授权。老规矩,示例程序源码XXTk.Auth.Samples已经提交了,需要的请自取。概... 查看详情
.NET Core Identity Server 4 身份验证 VS 身份验证
】.NETCoreIdentityServer4身份验证VS身份验证【英文标题】:.NETCoreIdentityServer4AuthenticationVSIdentityAuthentication【发布时间】:2017-06-2614:04:23【问题描述】:我试图了解在ASP.NETCore中进行身份验证的正确方法。我查看了几个资源(其中大... 查看详情
如何在 ASP .NET CORE Identity 中通过 SignInManager 登录后获取用户声明?
】如何在ASP.NETCOREIdentity中通过SignInManager登录后获取用户声明?【英文标题】:HowtogetuserclaimsaftersigninthroughSignInManagerinASP.NETCOREIdentity?【发布时间】:2018-09-1607:18:41【问题描述】:我有一个ASP.NETCore2.0项目,我在其中使用Microsoft的... 查看详情
ASP.NET Core 2 - 身份 - 自定义角色的 DI 错误
】ASP.NETCore2-身份-自定义角色的DI错误【英文标题】:ASP.NETCore2-Identity-DIerrorswithcustomRoles【发布时间】:2018-01-3000:39:29【问题描述】:我的Startup.cs中有这段代码:services.AddDbContext<ApplicationDbContext>(options=>options.UseSqlServer(Confi... 查看详情
如何上传个人资料图片并在身份 asp.net core 3 中更新
】如何上传个人资料图片并在身份asp.netcore3中更新【英文标题】:Howtouploadaprofilepictureandupdateitinidentityasp.netcore3【发布时间】:2020-03-0513:39:32【问题描述】:我想上传identity用户的头像并在账户管理中更新。如果有任何关于asp.netc... 查看详情
.netcore共享.netformsauthenticationcookie(代码片段)
Asp.net项目迁移到asp.netcore项目后需要兼容以前老的项目的登录方式。 FormsAuthenticationcookie登录。 从网上搜集到关于这个问题的解决思路都没有完美解决。帖子如下: 坎坷路:ASP.NETCore1.0Identity身份验证(中集)通... 查看详情
.net6.0中使用identity框架实现jwt身份认证与授权(代码片段)
...中,我们将了解如何通过实现JWT身份认证来保护 ASP.NETCoreWebAPI 应用程序。我们还将了解如何在 ASP.NETCore 中使用授权来提供对应用程 查看详情
.net6.0中使用identity框架实现jwt身份认证与授权(代码片段)
...中,我们将了解如何通过实现JWT身份认证来保护 ASP.NETCoreWebAPI 应用程序。我们还将了解如何在 ASP.NETCore 中使用授权来提供对应用程 查看详情