日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

asp.net core系列 48 Identity 身份模型自定义

發布時間:2025/3/8 asp.net 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的asp.net core系列 48 Identity 身份模型自定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。