asp.netcore系列48identity身份模型自定义(代码片段)

lonelyxmas lonelyxmas     2022-12-02     715

关键词:

原文: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 中使用授权来提供对应用程 查看详情