使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(1) 中,IdentityServer4 使用的是内存数据,不方便灵活,这次要把 IdentityServer4 的数据也保存到数据库中。

添加 IdentityServer4.EntityFramework

IdentityServer4 有两种类型的数据需要保存数据库中。第一是配置数据(资源和客户端)。第二个是 IdentityServer 在使用时产生的操作数据(令牌,代码和同意)。这些存储使用接口建模, Nuget包中的 IdentityServer4.EntityFramework 提供这些接口的EF实现。

添加 IdentityServer4.EntityFramework

修改 Startup.cs

Startup.csConfigureServices方法中添加以及修改以下代码:

var connectionString = Configuration.GetConnectionString("DefaultConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    //.AddInMemoryPersistedGrants()
    //.AddInMemoryIdentityResources(Config.GetIdentityResources())
    //.AddInMemoryApiResources(Config.GetApiResources())
    //.AddInMemoryClients(Config.GetClients())
    .AddConfigurationStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseMySQL(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = builder =>
                builder.UseMySQL(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));

            // this enables automatic token cleanup. this is optional.
            options.EnableTokenCleanup = true;
            options.TokenCleanupInterval = 30;
        })
        .AddAspNetIdentity<ApplicationUser>();

添加迁移

在项目目录中打开命令提示符。在命令提示符下运行以下两个命令,一个是为了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

特别注意事项:使用 MariaDBMySQL 数据库时,执行完第一个命令之后,在 VS 中打开 Data\Migrations\IdentityServer\PersistedGrantDb\PersistedGrantDbContextModelSnapshot.cs 文件,找到大概在 32 - 34 行的如以下内容:

                    b.Property<string>("Data")
                        .IsRequired()
                        .HasMaxLength(50000);

HasMaxLength(50000) 内的数字更改为HasMaxLength(20000) ,因为原来的长度 50000 超过了MySQL的字段长度。

修改完并保存后再执行第二个命令。

修改后的内容看起来象下面这个样子:

                    b.Property<string>("Data")
                        .IsRequired()
                        .HasMaxLength(20000);

初始化数据库

进行了迁移后,可以编写代码来从迁移中创建数据库。还可以将之前定义的内存配置数据来为数据库设定种子。在 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
    // ...
}

再次运行程序,就可以将数据保存到数据库中了,我们可以通过数据库的客户端打开并看到写入到里面的内容:

  • InitializeDatabase方法并不适合每次运行应用程序时执行,填充数据库后,请考虑删除(或注释)对它的调用。

原文地址:https://www.cnblogs.com/mahidol/p/9362673.html

时间: 2024-10-02 23:34:20

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)的相关文章

在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器

新建 ASP.NET Core Identity 项目 在新建ASP.NET Core Web 应用程序 窗口中分别选择:ASP.NET Core 2.0,Web应用程序(模型视图控制器)和个人用户账号 项目建立后, 运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息. 打开launchSettings.json: { "profiles": { "IdentityManagerServer": { "commandName

ASP.NET CORE API Swagger+IdentityServer4授权验证

简介 本来不想写这篇博文,但在网上找到的文章博客都没有完整配置信息,所以这里记录下. 不了解IdentityServer4的可以看看我之前写的入门博文 Swagger 官方演示地址 源码地址 配置IdentityServer4服务端 首先创建一个新的ASP.NET Core项目. 这里选择空白项,新建空白项目 等待创建完成后,右键单击项目中的依赖项选择管理NuGet程序包,搜索IdentityServer4并安装: 等待安装完成后,下载官方提供的UI文件,并拖放到项目中.下载地址:https:/

Asp.Net Core Identity 完成注册登录

Identity是Asp.Net Core全新的一个用户管理系统,它是一个完善的全面的庞大的框架,提供的功能有: 创建.查询.更改.删除账户信息 验证和授权 密码重置 双重身份认证 支持扩展登录,如微软.Facebook.google.QQ.微信等 提供了一个丰富的API,并且这些API还可以进行大量的扩展 接下来我们先来看下它的简单使用.首先在我们的DbContext中需要继承自IdentityDbContext. public class AppDbContext:IdentityDbCon

ASP.NET Core Identity Hands On(1)——Identity 初次体验

ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格.登录和用户数据存储 这是来自于 ASP.NET Core Identity 仓库主页的官方介绍,如果你是个萌新你可能不太理解什么是成员资格,那我来解释一下,成员资格由 membership 直译而来, membership 还有会员资格.会员身份.会员全体等相关含义,我们可以将其简单直接但并非十分恰当的理解为用户管理系统 ASP.NET Core Identity(下文简称I

用例子看ASP.NET Core Identity是什么?

原文:用例子看ASP.NET Core Identity是什么? 目录 前言 基于声明的认证(Claims-based Authentication) Claim 在ASP.NET Core Identity中是如何实现的 类ClaimsPrincipal 考察另外一个重要的类ClaimsIdentity 在ASP.NET Core Identity中一同运行 总结 @ 前言 有三个重要的类Claim, ClaimsIdentity, ClaimsPrincipal,我们以一个持有合法证件的学生

【ASP.NET Core分布式项目实战】(二)oauth2 + oidc 实现 server部分

原文:[ASP.NET Core分布式项目实战](二)oauth2 + oidc 实现 server部分 本博客根据http://video.jessetalk.cn/my/course/5视频整理(内容可能会有部分,推荐看源视频学习) 资料 我们基于之前的MvcCookieAuthSample来做开发 MvcCookieAuthSample下载地址:https://files.cnblogs.com/files/wyt007/ASPNETCore%E5%BF%AB%E9%80%9F%E5%85

ASP.NET Core 网站发布到Linux服务器(转)

出处;ASP.NET Core 网站发布到Linux服务器 长期以来,使用.NET开发的应用只能运行在Windows平台上面,而目前国内蓬勃发展的互联网公司由于成本的考虑,大量使用免费的Linux平台,这就使得.NET空有一身绝技但无法得到广大的施展空间,.NET平台被认为只适合开发企业内部应用系统. 2016年6月27日,微软正式发布.NET Core 1.0.ASP.NET 1.0和Entity Framework Core 1.0,通吃 Windows.OS X和Linux三大操作系统..

使用 ASP.NET Core MVC 创建 Web API(二)

原文:使用 ASP.NET Core MVC 创建 Web API(二) 使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 六.添加数据库上下文 数据库上下文是使用Entity Framework Core功能的主类. 此类由 Microsoft.EntityFrameworkCore.DbContext 类派生而来. 1) 在Visual Studio 2017的“解决方案资源管理器”中,右键单击“Models”文

ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)

原文:ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用) 在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. PS:本章将主要采用构造函数注入的方式,下一章将继续分享如何使之能够同时支持属性注入的方式. 约定: 1.仓储层接口都以“I”开头,以“Repos