哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的问题,但毕竟mssql驱动是没问题的,感觉还是私心太大了。不得以之下选择了一个第三方的驱动 Pomelo.EntityFrameworkCore.MySql 驱动,在这里主要是你安装了它,你就又了它的设计器,但你还需要你安装EFCore的设计器,因为你执行dotnet命令迁移的时候还得靠它,好吧,我们继续,在你的应用程序中最好保持这几个包。能多不能少。

  1. <ItemGroup>
  2. <PackageReference Include="IdentityServer4" Version="2.0.0-rc1" />
  3. <PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.0.0-rc1" />
  4. <PackageReference Include="IdentityServer4.EntityFramework" Version="2.0.0-rc1" />
  5. <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
  6. <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
  7. <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
  8. <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
  9. <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10062" />
  10. <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
  11. </ItemGroup>

  就这样,在Model里创建两个类,一个是用户、一个是关系,这个是Identity的类。其实这个和IdentityServer是没有多大关系的。主要是为了扩展一些东西,比如你需要其它的字段?

  1. public class ApplicationRole : IdentityRole{}
  2. public class ApplicationUser : IdentityUser{}

  随后我们定义IdentityDbContext,将我们自己定义的两个类放进去,它是个泛型的。

  1. public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
  2. {
  3. public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
  4. : base(options)
  5. {
  6. }
  7.  
  8. protected override void OnModelCreating(ModelBuilder builder)
  9. {
  10. base.OnModelCreating(builder);
  11. // Customize the ASP.NET Identity model and override the defaults if needed.
  12. // For example, you can rename the ASP.NET Identity table names and more.
  13. // Add your customizations after calling base.OnModelCreating(builder);
  14. }
  15. }

  再之后我们就可以注入到.Net Core的服务里了,IdentityServer的数据库中有三个大类,有AspNet的票据用户、资源的管理、以及一些操作的记录。这里你可以用一个database,你也可以分开。

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. // Add framework services.
  4. services.AddDbContext<ApplicationDbContext>(options =>
  5. options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
  6.  
  7. services.AddIdentity<ApplicationUser, ApplicationRole>()
  8. .AddEntityFrameworkStores<ApplicationDbContext>()
  9. .AddDefaultTokenProviders();
  10.  
  11. services.AddMvc();
  12.  
  13. string migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
  14. services.AddIdentityServer()
  15. .AddConfigurationStore(options =>
  16. {
  17. options.ConfigureDbContext = builder =>
  18. builder.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
  19. sql => sql.MigrationsAssembly(migrationsAssembly));
  20. })
  21. .AddOperationalStore(options =>
  22. {
  23. options.ConfigureDbContext = builder =>
  24. builder.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
  25. sql => sql.MigrationsAssembly(migrationsAssembly));
  26.  
  27. // this enables automatic token cleanup. this is optional.
  28. options.EnableTokenCleanup = true;
  29. options.TokenCleanupInterval = ;
  30. });
  31. }

  随后注册IdentityServer服务,这个里面调用了 InitializeDatabase 方法为了初始化的迁移数据。

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. InitializeDatabase(app);
  4.  
  5. if (env.IsDevelopment())
  6. app.UseDeveloperExceptionPage();
  7. else
  8. app.UseExceptionHandler("/Home/Error");
  9. app.UseIdentityServer();
  10. }

  这个方法就很有意思了,获取了.net core的服务实例,然后对我的Context进行了更新迁移,直接将Config中的内存数据添加到了数据库中。

  1. private void InitializeDatabase(IApplicationBuilder app)
  2. {
  3. using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
  4. {
  5. serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
  6. serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
  7.  
  8. var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
  9. context.Database.Migrate();
  10. if (!context.Clients.Any())
  11. {
  12. foreach (var client in Config.GetClients())
  13. {
  14. context.Clients.Add(client.ToEntity());
  15. }
  16. context.SaveChanges();
  17. }
  18.  
  19. if (!context.IdentityResources.Any())
  20. {
  21. foreach (var resource in Config.GetIdentityResources())
  22. {
  23. context.IdentityResources.Add(resource.ToEntity());
  24. }
  25. context.SaveChanges();
  26. }
  27.  
  28. if (!context.ApiResources.Any())
  29. {
  30. foreach (var resource in Config.GetApiResources())
  31. {
  32. context.ApiResources.Add(resource.ToEntity());
  33. }
  34. context.SaveChanges();
  35. }
  36. }

  最后你需要执行三个命令,执行EFCore的数据迁移。

  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 InitialIdentityServerApplicationDbMigration -c ApplicationDbContext -o Data/Migrations/IdentityServer/ApplicationDb

  就这样,生成完毕我们测试一下程序。

Ok,一些正常。

使用MySql对IdentityServer4进行持久化的更多相关文章

  1. 认证授权:IdentityServer4 - 数据持久化

    前言: 前面的文章中IdentityServer4 配置内容都存储到内存中,本篇文章开始把配置信息存储到数据库中:本篇文章继续基于github的代码来实现配置数据持久化到MySQL中 一.基于EFCo ...

  2. IdentityServer4之持久化很顺手的事

    前言 原计划打算在春节期间多分享几篇技术文章的,但到最后一篇也没出,偷懒了吗?算是吧,过程是这样的:每次拿出电脑,在孩姥姥家的院子总有阳光沐浴,看不清屏幕,回屋又有点冷(在强行找理由),于是又带着娃遛 ...

  3. IdentityServer4.FreeSql 持久化实现

    前言 故事是这样开始的: 然后突然又来了句... 扪心自问自从不知道怎么当了 FreeSql 开发群 () 的管理以来, 几乎没有给 FreeSql 做过什么贡献...惭愧惭愧. 借此机会, 似乎可以 ...

  4. [转]MySQL 5.6 全局事务 ID(GTID)实现原理(三)

    原文连接:http://qing.blog.sina.com.cn/1757661907/68c3cad333002s5l.html 原文作者:淘长源 转载注明以上信息 这是 MySQL 5.6 全局 ...

  5. .NET Core+MySql+Nginx 容器化部署

    .NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...

  6. mysql+ssl主从复制

    一.作为主服务器Master, 会把自己的每一次改动都记录到 二进制日志 Binarylog 中. (从服务器I/O thread会负责来读取master binary log, 然后写入自身rela ...

  7. Kafka实战-数据持久化

    1.概述 经过前面Kafka实战系列的学习,我们通过学习<Kafka实战-入门>了解Kafka的应用场景和基本原理,<Kafka实战-Kafka Cluster>一文给大家分享 ...

  8. Redis 持久化操作

    hash类型 类比:mysql数据库存储数据 持久化操作 以本身的数据以文件形式保存到硬盘中 手动快照持久化 i 备份机制(频率) vi redis.conf save 900 1  900s如果一个 ...

  9. NET Core+MySql+Nginx

    NET Core+MySql+Nginx 容器化部署 .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NET Core+MySql+Ngi ...

随机推荐

  1. CF-1066B-Heaters

    这题就是从1到n点进行遍历,对未加热的点找到最远的能加热到这个点的点,还是看代码讲吧 #include"bits/stdc++.h" using namespace std; co ...

  2. LVS + keepalived的实现

    ! Configuration File for keepalived global_defs { notification_email { linuxedu@foxmail.com mageedu@ ...

  3. 使用apktool反编译apk文件

    Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...

  4. c中结构体边界对齐

    原则1.普通数据成员对齐规则:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 原则2 ...

  5. maven工程根项目运行ok但是子项目就报错的解决办法

    正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了  没有配置1.8  所以会出现莫明其妙的bug

  6. sql问题处理

    批量杀死MySQL连接 select concat('KILL ',id,';') from information_schema.processlist where Info like 'selec ...

  7. textarea 实现高度自动增长

    有时候希望textarea 能够自动调整高度来适应输入的内容 网上看到了很多解决方案,比如动态创建一个隐藏的div,当用户输入的时候将textarea的内容绑定到div,由于div的高度会自动撑开,因 ...

  8. Python——urllib函数网络文件获取

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  9. Sublime Text3 旧版本下载以及破解激活方式

    前言 当前Sublime Text3 出到了32**版本,以前直接输入激活码的方法已经不能使用. 而官网又不提供旧版本的下载链接,因此在此分享旧版本下载方式以及激活方式. 下载方法 通过下面这个链接下 ...

  10. volatile和synchronized到底啥区别?多图文讲解告诉你

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...