1. 程式人生 > >IdentityServer(14)- 使用EntityFramework Core配置和操作數據

IdentityServer(14)- 使用EntityFramework Core配置和操作數據

ont var sqlserve popu ndb 測試 架構 api pos

IdentityServer具有良好的擴展性,其中一個可擴展點是用於IdentityServer所需數據的存儲機制。 本快速入門介紹了如何配置IdentityServer以使用EntityFramework(EF)作為此數據的存儲機制(而不是使用我們迄今為止使用的內存中實現)。

IdentityServer4.EntityFramework組件

有兩種類型的數據需要持久化到數據庫中。 首先是配置數據(資源和客戶端),第二個是IdentityServer在使用時產生的操作數據(令牌,代碼和同意書)。 這些存儲采用接口進行建模,我們在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

IdentityServer(14)- 使用EntityFramework Core配置和操作數據