使用MySql对IdentityServer4进行持久化
哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的问题,但毕竟mssql驱动是没问题的,感觉还是私心太大了。不得以之下选择了一个第三方的驱动 Pomelo.EntityFrameworkCore.MySql 驱动,在这里主要是你安装了它,你就又了它的设计器,但你还需要你安装EFCore的设计器,因为你执行dotnet命令迁移的时候还得靠它,好吧,我们继续,在你的应用程序中最好保持这几个包。能多不能少。
- <ItemGroup>
- <PackageReference Include="IdentityServer4" Version="2.0.0-rc1" />
- <PackageReference Include="IdentityServer4.AspNetIdentity" Version="2.0.0-rc1" />
- <PackageReference Include="IdentityServer4.EntityFramework" Version="2.0.0-rc1" />
- <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
- <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
- <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.0.0-rtm-10062" />
- <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" />
- </ItemGroup>
就这样,在Model里创建两个类,一个是用户、一个是关系,这个是Identity的类。其实这个和IdentityServer是没有多大关系的。主要是为了扩展一些东西,比如你需要其它的字段?
- public class ApplicationRole : IdentityRole{}
- public class ApplicationUser : IdentityUser{}
随后我们定义IdentityDbContext,将我们自己定义的两个类放进去,它是个泛型的。
- public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
- {
- 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);
- }
- }
再之后我们就可以注入到.Net Core的服务里了,IdentityServer的数据库中有三个大类,有AspNet的票据用户、资源的管理、以及一些操作的记录。这里你可以用一个database,你也可以分开。
- public void ConfigureServices(IServiceCollection services)
- {
- // Add framework services.
- services.AddDbContext<ApplicationDbContext>(options =>
- options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
- services.AddIdentity<ApplicationUser, ApplicationRole>()
- .AddEntityFrameworkStores<ApplicationDbContext>()
- .AddDefaultTokenProviders();
- services.AddMvc();
- string migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
- services.AddIdentityServer()
- .AddConfigurationStore(options =>
- {
- options.ConfigureDbContext = builder =>
- builder.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
- sql => sql.MigrationsAssembly(migrationsAssembly));
- })
- .AddOperationalStore(options =>
- {
- options.ConfigureDbContext = builder =>
- builder.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
- sql => sql.MigrationsAssembly(migrationsAssembly));
- // this enables automatic token cleanup. this is optional.
- options.EnableTokenCleanup = true;
- options.TokenCleanupInterval = ;
- });
- }
随后注册IdentityServer服务,这个里面调用了 InitializeDatabase 方法为了初始化的迁移数据。
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- InitializeDatabase(app);
- if (env.IsDevelopment())
- app.UseDeveloperExceptionPage();
- else
- app.UseExceptionHandler("/Home/Error");
- app.UseIdentityServer();
- }
这个方法就很有意思了,获取了.net core的服务实例,然后对我的Context进行了更新迁移,直接将Config中的内存数据添加到了数据库中。
- private void InitializeDatabase(IApplicationBuilder app)
- {
- using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
- {
- serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>().Database.Migrate();
- 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();
- }
- }
最后你需要执行三个命令,执行EFCore的数据迁移。
- dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
- dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
- dotnet ef migrations add InitialIdentityServerApplicationDbMigration -c ApplicationDbContext -o Data/Migrations/IdentityServer/ApplicationDb
就这样,生成完毕我们测试一下程序。
Ok,一些正常。
使用MySql对IdentityServer4进行持久化的更多相关文章
- 认证授权:IdentityServer4 - 数据持久化
前言: 前面的文章中IdentityServer4 配置内容都存储到内存中,本篇文章开始把配置信息存储到数据库中:本篇文章继续基于github的代码来实现配置数据持久化到MySQL中 一.基于EFCo ...
- IdentityServer4之持久化很顺手的事
前言 原计划打算在春节期间多分享几篇技术文章的,但到最后一篇也没出,偷懒了吗?算是吧,过程是这样的:每次拿出电脑,在孩姥姥家的院子总有阳光沐浴,看不清屏幕,回屋又有点冷(在强行找理由),于是又带着娃遛 ...
- IdentityServer4.FreeSql 持久化实现
前言 故事是这样开始的: 然后突然又来了句... 扪心自问自从不知道怎么当了 FreeSql 开发群 () 的管理以来, 几乎没有给 FreeSql 做过什么贡献...惭愧惭愧. 借此机会, 似乎可以 ...
- [转]MySQL 5.6 全局事务 ID(GTID)实现原理(三)
原文连接:http://qing.blog.sina.com.cn/1757661907/68c3cad333002s5l.html 原文作者:淘长源 转载注明以上信息 这是 MySQL 5.6 全局 ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- mysql+ssl主从复制
一.作为主服务器Master, 会把自己的每一次改动都记录到 二进制日志 Binarylog 中. (从服务器I/O thread会负责来读取master binary log, 然后写入自身rela ...
- Kafka实战-数据持久化
1.概述 经过前面Kafka实战系列的学习,我们通过学习<Kafka实战-入门>了解Kafka的应用场景和基本原理,<Kafka实战-Kafka Cluster>一文给大家分享 ...
- Redis 持久化操作
hash类型 类比:mysql数据库存储数据 持久化操作 以本身的数据以文件形式保存到硬盘中 手动快照持久化 i 备份机制(频率) vi redis.conf save 900 1 900s如果一个 ...
- NET Core+MySql+Nginx
NET Core+MySql+Nginx 容器化部署 .NET Core容器化@Docker.NET Core容器化之多容器应用部署@Docker-Compose.NET Core+MySql+Ngi ...
随机推荐
- CF-1066B-Heaters
这题就是从1到n点进行遍历,对未加热的点找到最远的能加热到这个点的点,还是看代码讲吧 #include"bits/stdc++.h" using namespace std; co ...
- LVS + keepalived的实现
! Configuration File for keepalived global_defs { notification_email { linuxedu@foxmail.com mageedu@ ...
- 使用apktool反编译apk文件
Apktool https://ibotpeaches.github.io/Apktool/install/ 下载地址:Apktool https://bitbucket.org/iBotPeache ...
- c中结构体边界对齐
原则1.普通数据成员对齐规则:第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储). 原则2 ...
- maven工程根项目运行ok但是子项目就报错的解决办法
正常启动没错 项目出现问题 maven工程根项目运行ok但是子项目就报错 报错信息是xxxx没有创建 解决办法 原来是子项目的依赖少了 没有配置1.8 所以会出现莫明其妙的bug
- sql问题处理
批量杀死MySQL连接 select concat('KILL ',id,';') from information_schema.processlist where Info like 'selec ...
- textarea 实现高度自动增长
有时候希望textarea 能够自动调整高度来适应输入的内容 网上看到了很多解决方案,比如动态创建一个隐藏的div,当用户输入的时候将textarea的内容绑定到div,由于div的高度会自动撑开,因 ...
- Python——urllib函数网络文件获取
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Sublime Text3 旧版本下载以及破解激活方式
前言 当前Sublime Text3 出到了32**版本,以前直接输入激活码的方法已经不能使用. 而官网又不提供旧版本的下载链接,因此在此分享旧版本下载方式以及激活方式. 下载方法 通过下面这个链接下 ...
- volatile和synchronized到底啥区别?多图文讲解告诉你
你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...