1. 程式人生 > >IdentityServer(14)- 通過EntityFramework Core持久化配置和操作資料

IdentityServer(14)- 通過EntityFramework Core持久化配置和操作資料

本文用了EF,如果不適用EF的,請參考這篇文章,實現這些介面來自己定義儲存等邏輯。http://www.cnblogs.com/stulzq/p/8144056.html

IdentityServer具有良好的擴充套件性,其中一個可擴充套件點是用於IdentityServer所需資料的儲存機制。 本快速入門介紹瞭如何配置IdentityServer以使用EntityFramework(EF)作為此資料的儲存機制(而不是使用我們迄今為止使用的記憶體中實現)。

IdentityServer4.EntityFramework元件

有兩種型別的資料需要持久化到資料庫中。 首先是配置資料(資源和客戶端),第二個是IdentityServer在使用時產生的操作資料(令牌,程式碼和使用者的授權資訊consents)。 這些儲存採用介面進行建模,我們在IdentityServer4.EntityFramework

Nuget包中提供這些介面的EF實現。

IdentityServer專案通過新增對IdentityServer4.EntityFramework Nuget包的引用開始。

使用SqlServer

鑑於EF的靈活性,您可以使用任何EF支援的資料庫。 對於這個快速入門,我們將使用Visual Studio附帶的SqlServer的LocalDb版本。

資料庫Schema更改和使用EF遷移

IdentityServer4.EntityFramework包包含從IdentityServer的模型對映的實體類。 隨著IdentityServer的模型的改變,IdentityServer4.EntityFramework

中的實體類也會改變。 當您使用IdentityServer4.EntityFramework並隨著時間的推移升級時,您將負責自己的資料庫Schema以及實體類更改所需的更改。 管理這些變化的一種方法是使用EF遷移,這個快速入門將顯示如何完成。 如果遷移不是您的偏好,那麼您可以以任何您認為合適的方式管理架構更改。

為IdentityServer4.EntityFramework中的實體維護SqlServer的SQL指令碼。 https://github.com/IdentityServer/IdentityServer4.EntityFramework/tree/dev/src/Host/Migrations/IdentityServer

使用EF工具進行遷移

關於EF遷移可以看我的這篇文章:http://www.cnblogs.com/stulzq/p/7717873.html

我們需要手動更改專案的csproj檔案來新增EF工具:

然後在結束</ Project>元素之前新增下面的程式碼片段:

<ItemGroup>
  <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>

看起來像這樣:

儲存並關閉檔案。 為了測試你已經正確安裝了這些工具,你可以在專案所在的目錄下開啟一個命令shell並執行dotnet ef。 它應該是這樣的:

配置store

下一步是在Startup.cs中ConfigureServices方法中的AddInMemoryClients,AddInMemoryIdentityResources和AddInMemoryApiResources進行替換。 我們將用這個程式碼替換它們:

const string connectionString = @"Data Source=(LocalDb)\MSSQLLocalDB;database=IdentityServer4.Quickstart.EntityFramework-2.0.0;trusted_connection=yes;";
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddTestUsers(Config.GetUsers())
    // this adds the config data from DB (clients, resources)
    .AddConfigurationStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
    })
    // this adds the operational data from DB (codes, tokens, consents)
    .AddOperationalStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));

        // this enables automatic token cleanup. this is optional.
        options.EnableTokenCleanup = true;
        options.TokenCleanupInterval = 30;
    });

您可能需要將這些名稱空間新增到檔案中:

using Microsoft.EntityFrameworkCore;
using System.Reflection;

上面的程式碼是對一個連線字串進行硬編碼,如果你願意,你可以隨意更改。 此外,對AddConfigurationStoreAddOperationalStore的呼叫是註冊EF支援的儲存實現。

傳遞給這些API的“builder”回撥方法是EF的機制,允許您為這兩個儲存中的每一個配置用於DbContextDbContextOptionsBuilder。 這就是我們的DbContext類可以用你想要使用的資料庫提供程式來配置。 在這種情況下,通過呼叫UseSqlServer,我們正在使用SqlServer。 你也可以知道,這是提供連線字串的地方。

UseSqlServer中的“options”回撥函式是配置定義EF遷移的程式集的方法。 EF需要使用遷移來定義資料庫的Schema。

新增遷移

要建立遷移,請在IdentityServer專案目錄中開啟命令提示符。 在命令提示符下執行這兩個命令:

dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb

執行情況應該如下:

您現在應該在專案中看到一個〜/ Data / Migrations / IdentityServer資料夾。 這包含新建立的遷移的程式碼。

初始化資料庫

現在我們已經添加了遷移,我們可以編寫程式碼來從遷移中建立資料庫。 我們還將使用我們在之前的快速入門中定義的記憶體配置資料對資料庫進行種子處理。

在Startup.cs中新增這個方法來幫助初始化資料庫:

private void InitializeDatabase(IApplicationBuilder app)
{
    using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
    {
        serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();

        var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
        context.Database.Migrate();
        if (!context.Clients.Any())
        {
            foreach (var client in Config.GetClients())
            {
                context.Clients.Add(client.ToEntity());
            }
            context.SaveChanges();
        }

        if (!context.IdentityResources.Any())
        {
            foreach (var resource in Config.GetIdentityResources())
            {
                context.IdentityResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }

        if (!context.ApiResources.Any())
        {
            foreach (var resource in Config.GetApiResources())
            {
                context.ApiResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
    }
}

然後我們可以從Configure方法呼叫它:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // this will do the initial DB population
    InitializeDatabase(app);

    // the rest of the code that was already here
    // ...
}

現在,如果執行IdentityServer專案,則應建立資料庫並使用快速入門配置資料進行種子插入。 您應該能夠使用SQL Server Management Studio或Visual Studio來連線和檢查資料。

執行程式

您現在應該能夠執行任何現有的客戶端應用程式並登入,獲取令牌並呼叫API - 全部基於資料庫配置。

本文程式碼:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/8_EntityFrameworkStorage
原文:https://identityserver4.readthedocs.io/en/release/quickstarts/8_entity_framework.html

額外,同時使用ASP.NET Identity和EF的示例請看:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/Combined_AspNetIdentity_and_EntityFrameworkStorage

相關推薦

IdentityServer14- 通過EntityFramework Core持久化配置操作資料

本文用了EF,如果不適用EF的,請參考這篇文章,實現這些介面來自己定義儲存等邏輯。http://www.cnblogs.com/stulzq/p/8144056.html IdentityServer具有良好的擴充套件性,其中一個可擴充套件點是用於IdentityServer所需資料的儲存機制。 本快速入

IdentityServer14- 使用EntityFramework Core配置操作數據

ont var sqlserve popu ndb 測試 架構 api pos IdentityServer具有良好的擴展性,其中一個可擴展點是用於IdentityServer所需數據的存儲機制。 本快速入門介紹了如何配置IdentityServer以使用EntityFra

14ASP.NET Core 中的日誌記錄

1.前言 ASP.NET Core支援適用於各種內建和第三方日誌記錄提供應用程式的日誌記錄API。本文介紹瞭如何將日誌記錄API與內建提供應用程式一起使用。 2.新增日誌提供程式 日誌記錄提供應用程式顯示或儲存日誌。例如,控制檯提供應用程式在控制檯上顯示日誌,Azure Application Insi

web服務器LAMP通過DNS輪詢功能nfs共享實現負載均衡

hosts dir 通過 sts lvcreate etc update file fst web服務器(LAMP)通過DNS輪詢功能和nfs共享實現負載均衡,部署discuz論壇 拓撲思路: 服務器1:mariadb+nfs;172.20.120.40 服務器2:apac

JVM 之 14 類載入器詳解雙親委派模型

類載入器         虛擬機器設計團隊把類載入階段中“通過一個類的全限定名來獲取描述此類的二進位制位元組流”這個動作放到Java虛擬機器外部去實現,以便讓應用程式自己決定如何去獲取所需要的類。實現這個動作的

基於MVC4+EasyUI的Web開發框架經驗總結14--自動生成圖示樣式檔案圖示的選擇操作

在很多Web系統中,一般都可能提供一些圖示的選擇,方便配置按鈕,選單等介面元素的圖示,從而是Web系統介面看起來更加美觀和協調。但是在系統中一般內建的圖示樣式相對比較有限,而且硬編碼寫到樣式表裡面,這樣給我們擴充套件使用有很多的不方便。基於這個原因,我想如果能夠獨立一個模組,自動根據圖示生成圖示CSS樣式檔案

二叉樹14----由前序遍歷中序遍歷重建二叉樹,遞迴方式

相關連結: 1、二叉樹定義 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeN

Azure Service Bus在NET Core 控制檯中如何操作 Service Bus Queue

一,引言   上一篇講到關於 Azure ServiceBus 的一些概念,講到 Azure Service Bus(服務匯流排),其實也叫 ”雲訊息服務“,是微軟在Azure 上提供的一種 ”雲訊息服務“,在應用和服務之間傳遞訊息時,即使訊息的接受著處於離線狀

數據庫設計概念、內容、步驟參考資料

及其 用戶 各類 都沒有 處理 步驟 有效 database 意思 概念 百度百科對數據庫設計的給了如下的描述: 數據庫設計(Database Design)是指對於一個給定的應用環境,構造最優的數據庫模式,建立數據庫及其應用系統,使之能夠有效地存儲數據,滿足各種用戶的應用

深入淺出解讀"多巴胺Dopamine論文"、環境配置例項分析

Paper: Dopamine–a research framework for deep reinforcement Learning Github: https://github.com/google/dopamine 論文的首頁明顯告訴我們,這是一篇Google出的論文(

自己實現的資料表格控制元件dataTable,支援自定義樣式標題資料、ajax等各種自定義設定以及分頁自定義

一、前言 也沒什麼好說的嘛,用了蠻多github上開源的能夠實現dataTable功能的表格外掛,不過都預設繫結樣式啊,資料格式也設定的比較死,所以忍不住自己實現了一個簡單的可自定義樣式和自定義資料返回格式的資料表格外掛,原生js是保留的,後面如果更新新版本的話會去除對jq

IdentityServer12- 使用 ASP.NET Core Identity

原文: IdentityServer(12)- 使用 ASP.NET Core Identity IdentityServer具有非常好的擴充套件性,其中使用者及其資料(包括密碼)部分你可以使用任何想要的資料庫進行持久化。 如果需要一個新的使用者資料庫,那麼ASP.NET Core Identity是你的一

ASP.NET Core on K8S學習之旅14Ingress灰度釋出

本篇已加入《.NET Core on K8S學習實踐系列文章索引》,可以點選檢視更多容器化技術相關係列文章。 之前一篇介紹了Ingress的基本概念和Nginx Ingress的基本配置和使用,本篇繼續Ingress的使用,來看看如何使用Ingress實現灰度釋出(金絲雀釋出)。此外,我也有錄製一個10min

通過Java SE 7自帶的監控服務WatchService API實現類似.NET FileWatcher的功能

thread new and mar chan col att 項目 chang 轉自:http://www.cnblogs.com/callwangxiang/archive/2011/08/04/JavaDirectoryWatcherFileWatcher.html

pdf打開錯誤之讀取本文檔時出現問題14

pdf 錯誤 14最近使用Adobe Acrabat 8 Professional打開一PDF文檔並順手編輯時,當時保存文檔時略覺有問題。可能是文件較大的原因,再次保存時即成功。但遺憾的是,再使用該工具打開該PDF文檔時出現如標題所示錯誤。無奈時,我嘗試著使用GOOGLE Chrome瀏覽器打開上述PDF文件

springBoot14:使用SQL關系型數據庫-事務處理

springboot springboot事務處理 一、事務的四個特性(ACID)原子性(Atomicity): 事務是一個原子操作,由一系列動作組成。事務的原子性確保動作要麽全部完成,要麽完全不起作用。一致性(Consistency): 一旦事務完成(不管成功還是失敗),系統必須確保它所建模的業務處

HD-ACM算法專攻系列14——Quoit Design

name images 技術分享 dmi nsq com bool sig 經典問題 問題描述: 源碼: 經典問題——最近鄰問題,標準解法 #include"iostream" #include"algorithm" #include"cmath" using

程序猿的量化交易之路27--Cointrader之PriceData價格數據14

time abstract ansi crypto ket pub return nds set 轉載須註明出處:http://blog.csdn.net/minimicall?viewmode=contents,http://cloudtrade.top/ Pr

自己搭建自動化巡檢系統 通過telnet實現遠程創建loopback

telnet loopback 我們在上一章完成了用代碼操作telnet,實現了遠程控制,分析前面的代碼會發現健壯性太低,需要進行優化,後續會通過開發一個交互式界面來完成人工介入操作網絡的過程。本次實驗目的:實現自動化創建環回口首先更新拓撲,拉出新的路由器和一臺交換機import telnetlibi

QT學習筆記14 定時器類DTimer的使用

fin isa play htm number conn stat alt .cn 一、   在前面的學習筆記中,我們已經學習定時器事件http://www.cnblogs.com/blog-ccs/p/7445323.html   現在,我們學習QTimer定時器類,比較