從壹開(kāi)始 [ Ids4實(shí)戰(zhàn) ] 之三║ 詳解授權(quán)持久化 & 用戶(hù)數(shù)據(jù)遷移
哈嘍大家周三好,今天終于又重新開(kāi)啟 IdentityServer4 的落地教程了,不多說(shuō),既然開(kāi)始了,就要努力做好????。
書(shū)接上文,在很久之前的上篇文章《二║ 基礎(chǔ)知識(shí)集合 & 項(xiàng)目搭建一》中,我們簡(jiǎn)單的說(shuō)了說(shuō) IdentityServer4 是如何調(diào)用和配置 Token 的,主要是一些入門(mén)的基礎(chǔ)知識(shí)和概念,也算是第一次嘗鮮了,其實(shí) Ids4 本身沒(méi)有那么神秘,我們只需要知道它是一個(gè)豐富的認(rèn)證框架,又具有很好的可擴(kuò)展性,核心就是如何配置某些客戶(hù)端通過(guò)該授權(quán)服務(wù)來(lái)包括另一些資源服務(wù)器,供用戶(hù)使用。因?yàn)橹虚g隔了很長(zhǎng)時(shí)間了,這里簡(jiǎn)單的回顧下上篇文章說(shuō)了什么,下邊這幾個(gè)小問(wèn)題,相信大家腦中都能很快的有一些概念,至少是臉熟了,如果不是很清楚,請(qǐng)翻看上邊的鏈接,或者官網(wǎng)再看看:
1、什么是資源?什么是客戶(hù)端?什么是令牌 ?
2、IdentityServer4 主要是授權(quán)還是認(rèn)證 ?
3、OAuth 2.0、OpenID、OpenID Connect三者的關(guān)系 ?
4、Ids4 依賴(lài)的 Nuget 包是什么 ?
5、如何快速開(kāi)發(fā) UI ?
今天這篇文章主要是操作和探索相結(jié)合的一篇,我看網(wǎng)上很多教程,基本上是按照官網(wǎng)概念的知識(shí)點(diǎn),配合著 Github 開(kāi)源地址,講解一遍,知識(shí)是懂了,可是要是自己開(kāi)發(fā)起來(lái),還是有很多的疑惑,甚至是根本走不下去,我就從初學(xué)者的立場(chǎng)出發(fā),換一個(gè)思路,簡(jiǎn)單的對(duì)其進(jìn)行探索,希望能讓初學(xué)者感興趣,而不會(huì)失去學(xué)習(xí)的沖動(dòng),當(dāng)然,這篇文章不會(huì)一下子就很完整,需要一段時(shí)間的沉淀和完善,我會(huì)不定時(shí)將學(xué)習(xí)到的感悟一一補(bǔ)充下來(lái),然后也會(huì)和別人討論的心得寫(xiě)下來(lái),慢慢的將這篇文章逐漸完整起來(lái)。希望大家都積極評(píng)論,混個(gè)臉熟也會(huì)挺好,如果一直潛水,可能都不知道你的存在。????
之前的配置都是在內(nèi)存中,下面將如何把這些數(shù)據(jù)存儲(chǔ)到Sql Server數(shù)據(jù)庫(kù), 這樣更符合生產(chǎn)環(huán)境的要求。好啦,馬上開(kāi)始今天的內(nèi)容~~~
(這是簡(jiǎn)單處理了下登錄頁(yè),要用就要好看些)
1、安裝依賴(lài)環(huán)境 ——基礎(chǔ)
我們要把所有的數(shù)據(jù)都存儲(chǔ)下來(lái),采用接口進(jìn)行建模,我們?cè)?nbsp;IdentityServer4.EntityFramework
Nuget 包中提供這些接口的 EF 實(shí)現(xiàn)。
算上我們上篇文章中引用的 IdentityServer4 包,一共這三個(gè) Nuget 依賴(lài)環(huán)境:
2、三個(gè)上下文 —— 核心
這一節(jié)大家如果看懂的話(huà),一定會(huì)對(duì) IdentityServer4 豐富性和可擴(kuò)展性 有特別切身的了解和體會(huì)!????
Z、為什么要定義多個(gè)上下文?
為什么要多個(gè)上下文?
還記得在第二個(gè)系列 DDD 中,我們說(shuō)到了多個(gè)上下文的用途,單個(gè)數(shù)據(jù)庫(kù)可以有多個(gè)上下文。例如, 如果您的數(shù)據(jù)庫(kù)包含多個(gè)數(shù)據(jù)庫(kù)架構(gòu), 并且您希望將每個(gè)架構(gòu)作為單獨(dú)的自包含區(qū)域處理, 則此功能非常有用。在使用多個(gè)上下文類(lèi)型時(shí),您還會(huì)看到其他問(wèn)題, 例如共享實(shí)體類(lèi)型及其從一個(gè)上下文傳遞到另一個(gè)上下文等。一般來(lái)說(shuō),設(shè)計(jì)多個(gè)上下文,會(huì)使您的設(shè)計(jì)更干凈, 并分離不同的功能區(qū)域,但同時(shí)它的成本也增加了復(fù)雜性。框架之所以會(huì)設(shè)計(jì)成多個(gè)上下文,是為了更好的擴(kuò)展,我們也可以部署到不同的物理機(jī)數(shù)據(jù)庫(kù)中,更好的實(shí)現(xiàn)獨(dú)立性。
在我們的 IdentityServer4-EF 框架中,有三個(gè)上下文,準(zhǔn)確來(lái)說(shuō)是 2+1 個(gè)上下文,為什么這么說(shuō)呢 ?
因?yàn)榈谌齻€(gè)上下文不是官方定義的,是我們自己根據(jù)需要進(jìn)行合理擴(kuò)展的,比如我們可以使用 Asp.Net Core 自帶的 Identity 身份認(rèn)證機(jī)制來(lái)實(shí)現(xiàn)擴(kuò)展,當(dāng)然,你也可以自己定義相應(yīng)的操作,如果你還不懂,就想象一下我們?cè)?Blog.Core 項(xiàng)目中,我們不是自己定義的基于 JWT 的認(rèn)證授權(quán)么( 用戶(hù)表 + 角色表 + 關(guān)系表等等 ),但是如果你看我的 DDD 項(xiàng)目的話(huà),應(yīng)該可以看到我又使用了 Core 官方自帶的 Identity 機(jī)制,畢竟結(jié)合 EFCore 我們可以很快的實(shí)現(xiàn)用戶(hù)數(shù)據(jù)的管理,而不用自己造***了。
咱們這里先說(shuō)說(shuō)前兩個(gè)上下文,在我們使用 Ids4 的時(shí)候,有兩種類(lèi)型的數(shù)據(jù)需要持久化到數(shù)據(jù)庫(kù)中:
1、配置數(shù)據(jù)(資源、客戶(hù)端、身份);//這里是對(duì)應(yīng)配置上下文
ConfigurationDbContext
2、IdentityServer在使用時(shí)產(chǎn)生的 操作數(shù)據(jù)(令牌,代碼和用戶(hù)的授權(quán)信息consents);//這里是對(duì)應(yīng)操作上下文
PersistedGrantDbContext
這兩個(gè)上下文以及對(duì)應(yīng)的數(shù)據(jù)模型,已經(jīng)被 IdentityServer4 官方給封裝好了, 我們不需要做額外的操作,直接進(jìn)行遷移即可。
A:ConfigurationDb
ConfigurationDbContext (IdentityServer configuration data) —— 負(fù)責(zé)數(shù)據(jù)庫(kù)中對(duì)客戶(hù)端、資源和 CORS 設(shè)置的配置存儲(chǔ);
如果需要從 EF 支持的數(shù)據(jù)庫(kù)加載客戶(hù)端、標(biāo)識(shí)資源、API 資源或 CORS 數(shù)據(jù) (而不是使用內(nèi)存中配置), 則可以使用配置存儲(chǔ)。此支持提供 IClientStore、IResura Store 和 ICorsPolicyService 擴(kuò)展性點(diǎn)的實(shí)現(xiàn)。這些實(shí)現(xiàn)使用名為 ConfigurationDbContext 的 dbcontext 派生類(lèi)對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行建模。
更多內(nèi)容請(qǐng)查看官網(wǎng) :http://docs.identityserver.io/en/latest/reference/ef.html#configuration-store-support-for-clients-resources-and-cors-settings
具體在 startup 中如何配置,下面會(huì)說(shuō)到。
B:PersistedGrantDb
PersistedGrantDbContext (IdentityServer operational data.) -—— 負(fù)責(zé)存儲(chǔ)同意、授權(quán)代碼、刷新令牌和引用令牌;
如果需要從 EF 支持的數(shù)據(jù)庫(kù) (而不是默認(rèn)的內(nèi)存數(shù)據(jù)庫(kù)) 加載授權(quán)授予、同意和令牌 (刷新和引用), 則可以使用操作存儲(chǔ)。此支持提供了 IPersistedGrantStore 擴(kuò)展點(diǎn)的實(shí)現(xiàn)。實(shí)現(xiàn)使用名為 PersistedGrantDbContext 的 dbcontext 派生類(lèi)對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行建模。
C:ApplicationDb
ApplicationDbContext 繼承 IdentityDbContext (Entity Framework database context used for identity.) —— 負(fù)責(zé)與 asp. net 標(biāo)識(shí)相關(guān)的用戶(hù);
這個(gè)上下文,就是 IdentityServer4 體現(xiàn) 可擴(kuò)展性 的關(guān)鍵點(diǎn),為什么說(shuō)是可擴(kuò)展的,因?yàn)檫@是我們自己定義的,你可以在這里僅僅定義一個(gè)User表,也可以像我們的 Blog.Core 項(xiàng)目中,定義三個(gè)表。我們可以在這個(gè)上下文中,進(jìn)行配置,來(lái)控制我們的用戶(hù)數(shù)據(jù),當(dāng)然這里看著很簡(jiǎn)單,是因?yàn)槔^承了 NetCore 官方的 Identity 了,可以使用他們的那一套邏輯。
public class ApplicationUser : IdentityUser { //可以在這里擴(kuò)展,下文會(huì)說(shuō)到 } // 定義用戶(hù)管理上下文,繼承 NetCore 自帶的 Identity 認(rèn)證機(jī)制,也可以不繼承而自定義表結(jié)構(gòu)。 public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Customize the ASP.NET Identity model and override the defaults if needed. // For example, you can rename the ASP.NET Identity table names and more. // Add your customizations after calling base.OnModelCreating(builder); } }
這個(gè)上下文,主要是用來(lái)處理我們的用戶(hù)數(shù)據(jù)相關(guān)的部分:
1、有多少用戶(hù)數(shù)據(jù)和角色數(shù)據(jù);
2、哪些用戶(hù),又擁有什么角色,又對(duì)應(yīng)哪些Claims 聲明。
這一塊更像是我們的平時(shí)的權(quán)限管理系統(tǒng),就是在 User、Role、Claim 之間交互,文章下邊會(huì)有一個(gè)數(shù)據(jù)模型圖,會(huì)很清晰的看出來(lái)各自的對(duì)應(yīng)關(guān)系。
我們既然需要用到這幾個(gè)上下文,就需要添加他們所對(duì)應(yīng)的服務(wù),別著急,往下看。
3、配置 EF-Ids4 相關(guān)服務(wù) —— 必要
上邊我們說(shuō)到了三個(gè)上下文,如果我們直接執(zhí)行遷移命令是會(huì)報(bào)錯(cuò)的,比如我們直接遷移 PersistedGrantDbContext 上下文:
所以,就需要在項(xiàng)目中配置對(duì)應(yīng)的服務(wù),我們?cè)?startup.cs 啟動(dòng)文件中,配置服務(wù) ConfigureService :
配置 EF 操作數(shù)據(jù)庫(kù),很簡(jiǎn)單,這個(gè)就按照平時(shí)我們使用的正常的方法即可:
1、獲取數(shù)據(jù)庫(kù)連接字符串:
( 我這里使用的是讀取文件的形式,其實(shí)就是字符串放到文件里了,大家自己根據(jù)需要做相應(yīng)調(diào)整即可,我這么是防止密碼泄露。)
2、配置數(shù)據(jù)庫(kù)服務(wù):
var builder = services.AddIdentityServer(options => { options.Events.RaiseErrorEvents = true; options.Events.RaiseInformationEvents = true; options.Events.RaiseFailureEvents = true; options.Events.RaiseSuccessEvents = true; })
// Configures IdentityServer to use the ASP.NET Identity implementations of IUserClaimsPrincipalFactory,
// IResourceOwnerPasswordValidator, and IProfileService. Also configures some of
// ASP.NET Identity's options for use with IdentityServer (such as claim types to
// use and authenticaiton cookie settings).
.AddAspNetIdentity<ApplicationUser>() // 添加配置數(shù)據(jù)(客戶(hù)端 和 資源) .AddConfigurationStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly)); }) // 添加操作數(shù)據(jù) (codes, tokens, consents) .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(connectionString, sql => sql.MigrationsAssembly(migrationsAssembly)); // 自動(dòng)清理 token ,可選 options.EnableTokenCleanup = true; });
然后是我們的用戶(hù)數(shù)據(jù)存儲(chǔ),其實(shí)我們可以根據(jù)自己的需要,自己建立對(duì)應(yīng)的表,比如我們 Blog.Core 項(xiàng)目中,我們定義了用戶(hù)、角色和關(guān)系表等數(shù)據(jù)庫(kù)接口,但是這樣的話(huà),可能少一些情況,所以一般情況下,都是采用的 asp.net core 自帶的 Identity 身份驗(yàn)證,而且對(duì)擴(kuò)展性很友好,就比如下文我們就對(duì)用戶(hù)主表做了自定義擴(kuò)展,繼承了 IdentityUser, ApplicationUser : IdentityUser
// 數(shù)據(jù)庫(kù)配置系統(tǒng)應(yīng)用用戶(hù)數(shù)據(jù)上下文 services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(connectionString)); // 啟用 Identity 服務(wù) 添加指定的用戶(hù)和角色類(lèi)型的默認(rèn)標(biāo)識(shí)系統(tǒng)配置 services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();
4、Migrations 遷移 —— 結(jié)果
我這里提供了兩種方法,至于哪種更好,大家可以自己都試試,我都用過(guò),可能第二種稍微多了一點(diǎn),不過(guò)原理都是一樣的。
方式一:在包控制臺(tái)
一、遷移項(xiàng)目( 使用 Package Manager Console ): 1、add-migration InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb 2、add-migration InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb 3、add-migration AppDbMigration -c ApplicationDbContext -o Data 4、update-database -c PersistedGrantDbContext 5、update-database -c ConfigurationDbContext 6、update-database -c ApplicationDbContext
最后成功的生成了我們需要的數(shù)據(jù)庫(kù):
方式二:在命令窗口
判斷是否支持命令行遷移,你可以在項(xiàng)目所在的目錄下打開(kāi)一個(gè)命令 Power shell 并運(yùn)行命令 dotnet ef, 它應(yīng)該是這樣的:
我是在 PowerShell 中操作的:
//1.dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb //2.dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb //3.dotnet ef migrations add AppDbMigration -c ApplicationDbContext -o Data //4.dotnet run /seed
這里我就不一一操作了,就是普通的命令執(zhí)行,生成的數(shù)據(jù)庫(kù)一模一樣的。
但是要注意下,上邊我們?cè)诎芾砜刂婆_(tái),僅僅是遷移了數(shù)據(jù)庫(kù),還沒(méi)有進(jìn)行數(shù)據(jù) Seed 生成,不過(guò)你看 PowerShell 的命令中的第四步,我使用 dotnet run /seed 的命令,和上邊的不一樣,沒(méi)錯(cuò),是因?yàn)橄逻呂矣昧肆硪环N方法,通過(guò)代碼的方法進(jìn)行 Migrate 了,并且同時(shí)還 Seed 了數(shù)據(jù),那具體如何操作呢,別慌,第三節(jié)我會(huì)說(shuō)到了,現(xiàn)在這個(gè)時(shí)候,我們已經(jīng)把數(shù)據(jù)庫(kù)的所有表都已經(jīng)生成好了,先不著急同步數(shù)據(jù),我們先看看到底生成了哪些數(shù)據(jù)表。
1、整體數(shù)據(jù)模型圖
我簡(jiǎn)單的做了下整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)模型圖,不同模塊用不同的顏色區(qū)分,大家也能很清楚的看出來(lái)各自對(duì)應(yīng)的關(guān)系,一目了然,其中配置數(shù)據(jù)又有三個(gè)部分,分別對(duì)應(yīng)的是 客戶(hù)端 + 資源 + 身份 。
接下來(lái),咱們針對(duì)這三個(gè)模塊簡(jiǎn)單的說(shuō)一說(shuō),因?yàn)檫@里還沒(méi)有數(shù)據(jù),說(shuō)起來(lái)可能會(huì)比較抽象,這里先留一個(gè)坑,等配合 Vue 客戶(hù)端使用了以后,再把完整數(shù)據(jù)展示出來(lái),可能更好的理解了。
2、三個(gè)模塊表
操作數(shù)據(jù)模塊
這是 Ids4 官方封裝的第一部分——操作數(shù)據(jù)。PersistedGrants的數(shù)據(jù),在登陸時(shí)當(dāng)你同意請(qǐng)求許可的時(shí)候,就會(huì)在這個(gè)表里面添加一條數(shù)據(jù)。
舉個(gè)栗子,我在 Blog.Vue 項(xiàng)目點(diǎn)擊登錄,跳轉(zhuǎn)到 BlogIdp 授權(quán)中心,認(rèn)證成功后,跳轉(zhuǎn)回來(lái),就會(huì)在這個(gè)表中多了一條數(shù)據(jù)(這個(gè)功能我下次會(huì)開(kāi)放出來(lái),代碼已經(jīng)寫(xiě)好):
MMD4TtLkVH7sXIwFS/DLZRfLQnUga0XMrBDVuQZWfOw= | user_consent | c2841087-1b35-4ab4-afd6-f27f80c94e6c | blogvuejs | 2019-05-08 03:35:30.0000000 | NULL | {"SubjectId":"c2841087-1b35-4ab4-afd6-f27f80c94e6c","ClientId":"blogvuejs","Scopes":["openid","profile","roles","blog.core.api"],"CreationTime":"2019-05-08T03:35:30Z","Expiration":null} |
配置數(shù)據(jù)模塊
這一大塊,是 Ids4 官方定義的第二模塊 —— 配置數(shù)據(jù),從這里我們可以看出來(lái) IdentityServer4 的另一個(gè)特性——豐富性,上邊咱們說(shuō)到了可擴(kuò)展性,它提供了豐富的配置數(shù)據(jù)結(jié)構(gòu),從三個(gè)方面來(lái)給我們定義好了這些數(shù)據(jù),而不用我們?cè)偃ヒ粋€(gè)一個(gè)的去設(shè)計(jì),去思考。
我們可以通過(guò)這些表結(jié)構(gòu)來(lái)存儲(chǔ)我們的服務(wù)數(shù)據(jù),比如有哪些API資源(Blog.Core.API),哪些客戶(hù)端資源,還有用到了哪些資源等等,如果你還不清楚的,可以想想上篇文章中,我們講內(nèi)存模式的 Ids4 的配置,就是這些數(shù)據(jù),在下邊的文章中,我們會(huì)進(jìn)行 Seed Data,那個(gè)時(shí)候我們?cè)龠M(jìn)一步看下。
具體的數(shù)據(jù)大家可以看看,截個(gè)圖:
用戶(hù)數(shù)據(jù)模塊
這一塊我們就很清楚了,因?yàn)檫@是我們自定義的用戶(hù)數(shù)據(jù)(當(dāng)然本項(xiàng)目是直接繼承的 NetCore 的 Identity) ,光從數(shù)據(jù)庫(kù)表名上,我們就知道其中的含義了,就是用戶(hù)角色管理。
上邊咱們也簡(jiǎn)單的說(shuō)了下數(shù)據(jù)庫(kù)表結(jié)構(gòu),然后再結(jié)合三個(gè)上下文,大家應(yīng)該都能明白各自的含義了,好啦,現(xiàn)在就是萬(wàn)事俱備,只欠數(shù)據(jù)了,是時(shí)候動(dòng)手了!
還記得我們上邊在生成數(shù)據(jù)庫(kù)的時(shí)候,我采用了兩個(gè)方法,第一種很常規(guī),那接下來(lái)就說(shuō)說(shuō)第二種中第四步( dotnet run /see ),是如何操作的。
1、定義 SeedData 類(lèi)
首先,需要定義一個(gè) SeedData 類(lèi),主要是用來(lái) update-database 和 Seed Data 這兩個(gè)作用,因?yàn)槠脑?,具體的代碼在 Github 上,大家自行下載查看即可:
2、擴(kuò)展用戶(hù)主表數(shù)據(jù)
上邊咱們也說(shuō)到了,我們通過(guò)繼承使用 Identity 機(jī)制,來(lái)擴(kuò)展了用戶(hù)管理,很自然的,我們需要用到 IdentityUser ,但是它的這個(gè)用戶(hù)數(shù)據(jù)肯定不能滿(mǎn)足我們的需求,所以,這里又一次體現(xiàn)了 Ids4 可擴(kuò)展性的優(yōu)點(diǎn),我們可以自定義用戶(hù)主表:
// Add profile data for application users by adding properties to the ApplicationUser class public class ApplicationUser : IdentityUser { // 自定義屬性 public string name { get; set; } public string RealName { get; set; } public int sex { get; set; } = 0; public int age { get; set; } public DateTime birth { get; set; } = DateTime.Now; public string addr { get; set; } public bool tdIsDelete { get; set; } }
3、獲取 Blog 項(xiàng)目用戶(hù)數(shù)據(jù)
這個(gè)功能是一個(gè)充分不必要的條件,主要是為了解決某些項(xiàng)目先用了自身一套認(rèn)證系統(tǒng),然后又上了 IdentityServer4 項(xiàng)目的情況,就比如我們的 Blog.Core 項(xiàng)目,就是這個(gè)情況。
那用戶(hù)的數(shù)據(jù)從哪里拿到呢,很巧,大家還記得我在某一篇文章《 42 ║支持多種數(shù)據(jù)庫(kù) & 快速數(shù)據(jù)庫(kù)生成》中,自動(dòng)生成數(shù)據(jù)庫(kù)的方案,就是這么使用的,從 Github 上直接拉取數(shù)據(jù)即可,這里整個(gè)派上用場(chǎng),感覺(jué)很不錯(cuò),
private static string GitJsonFileFormat = "https://github.com/anjoy8/Blog.Data.Share/raw/master/Blog.Core.Data.json/{0}.tsv"; // 遠(yuǎn)程獲取 Blog.Core 數(shù)據(jù)庫(kù)的三表數(shù)據(jù) var BlogCore_Users = JsonHelper.ParseFormByJson<List<sysUserInfo>>(GetNetData.Get(string.Format(GitJsonFileFormat, "sysUserInfo"))); var BlogCore_Roles = JsonHelper.ParseFormByJson<List<Role>>(GetNetData.Get(string.Format(GitJsonFileFormat, "Role"))); var BlogCore_UserRoles = JsonHelper.ParseFormByJson<List<UserRole>>(GetNetData.Get(string.Format(GitJsonFileFormat, "UserRole")));
4、執(zhí)行Seed方法,查看數(shù)據(jù)
經(jīng)歷了定義上下文 -> 數(shù)據(jù)庫(kù)遷移 -> 獲取數(shù)據(jù) -> Seed Data 的過(guò)程后,就剩下最后一步了,執(zhí)行操作:
很簡(jiǎn)單,我在 Blog.Core 項(xiàng)目中,采用的是 appsettings.json 文件配置的方法,這里換另一種方法,Program.cs 控制臺(tái)參數(shù)的形式
在上一講中,我們用到了官方的 快速啟動(dòng) 代碼,里邊已經(jīng)包含了基本的頁(yè)面,當(dāng)然你也可以根據(jù)自己的情況去自定義,甚至采用靜態(tài)的Ajax 來(lái)實(shí)現(xiàn),我這里還是使用的 MVC 結(jié)構(gòu),只不過(guò)套用了下一個(gè)簡(jiǎn)單樣式(樣式版權(quán)是http://www.uimaker.com/ 網(wǎng)站的,請(qǐng)不要做商業(yè)用途,注意產(chǎn)權(quán)),至少看起來(lái)好看了一些。
具體的登錄操作就不演示了,等下次把 增刪改查 都做好了,再統(tǒng)一做下動(dòng)圖展示吧,具體如何設(shè)計(jì),請(qǐng)聽(tīng)下回分解。
今天我們簡(jiǎn)單的實(shí)現(xiàn)了對(duì) IdentityServer4-EFCore 的相關(guān)配置,概念不是很難,為了加深印象,還是提幾個(gè)小問(wèn)題,請(qǐng)大家多思考:
1、Ids4 一共用到了幾個(gè)上下文,分別的用處是什么?
2、在遷移中,數(shù)據(jù)庫(kù)生成了多少表,各個(gè)模塊又是干什么的?
3、Ids4 的良好擴(kuò)展性,體現(xiàn)在哪里?豐富性又體現(xiàn)在哪里?
4、ApplicationUser 類(lèi)是起到什么作用的?
5、思考1:如果同一個(gè)用戶(hù)有多個(gè)角色如何處理?
6、思考2:如果不使用 NetCore 自帶的 Identity 認(rèn)證,如何自定義上下文?
https://github.com/anjoy8/Blog.IdentityServer
原文地址:https://www.cnblogs.com/laozhang-is-phi/p/10660403.html
04 ║ 用戶(hù)數(shù)據(jù)管理 & 前后端授權(quán)聯(lián)調(diào) https://www.cnblogs.com/laozhang-is-phi/p/10911438.html
https://github.com/anjoy8/Blog.IdentityServer