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
英文地址,請注明出處:http://en.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 &…