1.概念

以下概念从官网整理的,我也是看官网一步一步学习的

官网地址 https://identityserver4.readthedocs.io/en/latest/index.html

1.1 IdentityServer 是将符合规范的 OpenID Connect 和 OAuth 2.0 端点添加到任意 ASP.NET Core 应用程序的中间件。

IdentityServer 是一个 OpenID Connect 提供者——它实现了 OpenID Connect 和 OAuth 2.0 协议。

1.2 IdentityServer 能做什么

  • 保护您的资源
  • 使用本地帐户存储或通过外部身份提供商对用户进行身份验证
  • 提供会话管理和单点登录
  • 管理和验证客户
  • 向客户端颁发身份和访问令牌
  • 验证令牌

1.3 身份服务器:IdentityServer 是一个 OpenID Connect 提供者——它实现了 OpenID Connect 和 OAuth 2.0 协议。

1.4 用户:用户是使用注册客户端访问资源的人。

1.5 客户:客户端是一个从 IdentityServer 请求令牌的软件——用于验证用户(请求身份令牌)或访问资源(请求访问令牌)。客户端必须先向 IdentityServer 注册,然后才能请求令牌。

1.7 资源:资源是您想要使用 IdentityServer 保护的东西——您的用户的身份数据或 API。

1.8 身份令牌:身份令牌代表身份验证过程的结果。它至少包含用户的标识符(称为sub又名主题声明)以及有关用户如何以及何时进行身份验证的信息。它可以包含额外的身份数据。

1.9 访问令牌:访问令牌允许访问 API 资源。客户端请求访问令牌并将它们转发到 API。访问令牌包含有关客户端和用户(如果存在)的信息。API 使用该信息来授权对其数据的访问。

2.安装IdentityServer模板及数据库迁移

2.1 安装命令 dotnet new -i IdentityServer4.Templates

2.2 所需依赖包

<ItemGroup>
<PackageReference Include="IdentityServer4" Version="4.1.2" />
<PackageReference Include="IdentityServer4.AspNetIdentity" Version="4.1.2" />
<PackageReference Include="IdentityServer4.EntityFramework" Version="4.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.6">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.6">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
</ItemGroup>

2.3 创建项目模板 (依次执行以下命令)

创建项目模板

md MyIdentityServer4DataMigration

cd MyIdentityServer4DataMigration

md src

cd src

dotnet new is4empty -n IdentityServerBySqlServer

dotnet new is4empty -n IdentityServerByMySql

cd ../

dotnet new sln -n MyIdentityServer4DataMigration

dotnet sln add .\src\IdentityServerBySqlServer\IdentityServerBySqlServer.csproj

dotnet sln add .\src\IdentityServerByMySql\IdentityServerByMySql.csproj

创建完成后打开,如下如所示

然后安装依赖包,首先是sqlserver的

把上面的依赖包命令粘贴到IdentityServerBySqlServer.csproj里,control+s保存,会自动安装依赖包

然后

cd src

dotnet new is4ui

大部分包我是通过Nuget手动安装的,命令没有那么全,SqlServer相关依赖包安装完成后如下图所示

3. Startup代码

3.1sqlserver代码

public class Startup
{
public IWebHostEnvironment Environment { get; } public Startup(IWebHostEnvironment environment)
{
Environment = environment;
} public void ConfigureServices(IServiceCollection services)
{ //var serverVersion = new MySqlServerVersion(new Version(8, 0, 21)); //// Replace 'YourDbContext' with the name of your own DbContext derived class.
//services.AddDbContext<YourDbContext>(
// dbContextOptions => dbContextOptions
// .UseMySql(connectionString, serverVersion)
// .EnableSensitiveDataLogging() // <-- These two calls are optional but help
// .EnableDetailedErrors() // <-- with debugging (remove for production).
//); var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
const string connectionString = @"Server=localhost; Port=3306;Stmt=; Database=MyIdentityServer4DB; Uid=root; Pwd=Docimax@123;";
var serverVersion = new MySqlServerVersion(new Version(5, 7, 28));
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString,serverVersion));
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.User = new UserOptions
{
RequireUniqueEmail = true, //要求Email唯一
AllowedUserNameCharacters = null //允许的用户名字符
};
options.Password = new PasswordOptions
{
RequiredLength = 8, //要求密码最小长度,默认是 6 个字符
RequireDigit = true, //要求有数字
RequiredUniqueChars = 3, //要求至少要出现的字母数
RequireLowercase = true, //要求小写字母
RequireNonAlphanumeric = false, //要求特殊字符
RequireUppercase = false //要求大写字母
}; //options.Lockout = new LockoutOptions
//{
// AllowedForNewUsers = true, // 新用户锁定账户
// DefaultLockoutTimeSpan = TimeSpan.FromHours(1), //锁定时长,默认是 5 分钟
// MaxFailedAccessAttempts = 3 //登录错误最大尝试次数,默认 5 次
//};
//options.SignIn = new SignInOptions
//{
// RequireConfirmedEmail = true, //要求激活邮箱
// RequireConfirmedPhoneNumber = true //要求激活手机号
//};
//options.ClaimsIdentity = new ClaimsIdentityOptions
//{
// // 这里都是修改相应的Cliams声明的
// RoleClaimType = "IdentityRole",
// UserIdClaimType = "IdentityId",
// SecurityStampClaimType = "SecurityStamp",
// UserNameClaimType = "IdentityName"
//};
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddIdentityServer()
//.AddTestUsers(TestUsers.Users)
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b => b.UseMySql(connectionString, serverVersion,
sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b => b.UseMySql(connectionString, serverVersion,
sql => sql.MigrationsAssembly(migrationsAssembly));
});
} public void Configure(IApplicationBuilder app)
{
InitializeDatabase(app); if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // uncomment if you want to add MVC
//app.UseStaticFiles();
//app.UseRouting(); app.UseIdentityServer(); // uncomment, if you want to add MVC
//app.UseAuthorization();
//app.UseEndpoints(endpoints =>
//{
// endpoints.MapDefaultControllerRoute();
//});
} 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.Clients)
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
} if (!context.IdentityResources.Any())
{
foreach (var resource in Config.IdentityResources)
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
} if (!context.ApiScopes.Any())
{
foreach (var resource in Config.ApiScopes)
{
context.ApiScopes.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}
}

3.2 Mysql代码

 public class Startup
{
public IWebHostEnvironment Environment { get; } public Startup(IWebHostEnvironment environment)
{
Environment = environment;
} public void ConfigureServices(IServiceCollection services)
{ //var serverVersion = new MySqlServerVersion(new Version(8, 0, 21)); //// Replace 'YourDbContext' with the name of your own DbContext derived class.
//services.AddDbContext<YourDbContext>(
// dbContextOptions => dbContextOptions
// .UseMySql(connectionString, serverVersion)
// .EnableSensitiveDataLogging() // <-- These two calls are optional but help
// .EnableDetailedErrors() // <-- with debugging (remove for production).
//); var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
const string connectionString = @"Server=localhost; Port=3306;Stmt=; Database=MyIdentityServer4DB; Uid=root; Pwd=Docimax@123;";
var serverVersion = new MySqlServerVersion(new Version(5, 7, 28));
services.AddDbContext<ApplicationDbContext>(options => options.UseMySql(connectionString,serverVersion));
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.User = new UserOptions
{
RequireUniqueEmail = true, //要求Email唯一
AllowedUserNameCharacters = null //允许的用户名字符
};
options.Password = new PasswordOptions
{
RequiredLength = 8, //要求密码最小长度,默认是 6 个字符
RequireDigit = true, //要求有数字
RequiredUniqueChars = 3, //要求至少要出现的字母数
RequireLowercase = true, //要求小写字母
RequireNonAlphanumeric = false, //要求特殊字符
RequireUppercase = false //要求大写字母
}; //options.Lockout = new LockoutOptions
//{
// AllowedForNewUsers = true, // 新用户锁定账户
// DefaultLockoutTimeSpan = TimeSpan.FromHours(1), //锁定时长,默认是 5 分钟
// MaxFailedAccessAttempts = 3 //登录错误最大尝试次数,默认 5 次
//};
//options.SignIn = new SignInOptions
//{
// RequireConfirmedEmail = true, //要求激活邮箱
// RequireConfirmedPhoneNumber = true //要求激活手机号
//};
//options.ClaimsIdentity = new ClaimsIdentityOptions
//{
// // 这里都是修改相应的Cliams声明的
// RoleClaimType = "IdentityRole",
// UserIdClaimType = "IdentityId",
// SecurityStampClaimType = "SecurityStamp",
// UserNameClaimType = "IdentityName"
//};
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders(); services.AddIdentityServer()
//.AddTestUsers(TestUsers.Users)
.AddAspNetIdentity<ApplicationUser>()
.AddConfigurationStore(options =>
{
options.ConfigureDbContext = b => b.UseMySql(connectionString, serverVersion,
sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b => b.UseMySql(connectionString, serverVersion,
sql => sql.MigrationsAssembly(migrationsAssembly));
});
} public void Configure(IApplicationBuilder app)
{
InitializeDatabase(app); if (Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} // uncomment if you want to add MVC
//app.UseStaticFiles();
//app.UseRouting(); app.UseIdentityServer(); // uncomment, if you want to add MVC
//app.UseAuthorization();
//app.UseEndpoints(endpoints =>
//{
// endpoints.MapDefaultControllerRoute();
//});
} 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.Clients)
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
} if (!context.IdentityResources.Any())
{
foreach (var resource in Config.IdentityResources)
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
} if (!context.ApiScopes.Any())
{
foreach (var resource in Config.ApiScopes)
{
context.ApiScopes.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}
}

4.数据迁移

第一种方式(推荐)

1. vs2019 ===> 工具 ===> Nuget 包管理器 ====> 程序包管理器控制台
 2. 执行以下命令
 add-migration InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
 add-migration InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
 add-migration AppDbMigration -c ApplicationDbContext -o Data
 update-database -context PersistedGrantDbContext
 update-database -context ConfigurationDbContext
 update-database -context ApplicationDbContext

第二种方式

PowerShell执行数据迁移命令,然后运行程序

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

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

迁移完成后如下图所示

检查SqlServer数据库是否生成表结构

//接下来操作mysql
cd ../

cd IdentityServerByMySql

dotnet new is4ui

dotnet add package IdentityServer4.EntityFramework

mysql的相关依赖包,如下图所示:

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

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

MySql迁移完成后检查MySql数据库

.Net5 IdentityServer4下SqlServer和Mysql数据迁移的更多相关文章

  1. MySQL数据迁移那些事儿

    前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表.某个库或某个实例.根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题.本篇文章,我们一起来看下 MySQL ...

  2. ABP框架使用Oracle数据库,并实现从SQLServer中进行数据迁移的处理

    ABP框架的数据访问底层是基于EFCore(Entity Framework Core)的,是微软标志性且成熟的ORM,因此它本身是支持多种主流数据库MySQL,SqlServer,Oracle,SQ ...

  3. ETL数据从sqlserver到mysql之间迁移

    因近期需要进行sqlserver数据到mysql之间的数据同步.偶然之间发现了这一款工具ELK 一.下载 1.Kettle可以在http://kettle.pentaho.org/网站下载 2.下载的 ...

  4. 记一次MySQL数据迁移到SQLServer全过程

    为什么要做迁移? 由于系统版本.数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导.开发请示,得到批准后,便有了这次学习的机会,所以特此来记 ...

  5. centos下mysql数据迁移方法

    第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...

  6. mssql与mysql 数据迁移

    概要: mssql向mysql迁移的实例,所要用到的工具bcp和load data local infile. 由于订单记录的数据是存放在mssql服务器上的,而项目需求把数据迁移到mysql ser ...

  7. mysql 数据迁移

    最近线上系统新挂了一次磁盘,需要将系统磁盘下的 mysql 数据目录迁移到 数据盘上. 经过一番考察,mysql在安装时,使用了预编译的二进制tar.gz包.共有两处配置了 datadir属性 /et ...

  8. MySQL数据迁移问题

    最近尝试了一下小型数据迁移.本地迁移,windows平台,修改配置文件中的data_dir项,然后将旧的data文件下的数据文件全部拷贝过去. 之后登陆数据库,竟然1145错误.可以看到数据库的结构, ...

  9. Mysql 数据迁移后 启动出错

    今天上班后不知道为什么,mysql一直无法启动,折腾了半天于是决定重装 我本地的server用的是wamp , 重装的时候, 要进行数据备份 , 我使用的最简单粗暴的备份方式, 就是直接进入到mysq ...

随机推荐

  1. CyclicBarrier分析

    简介 CyclicBarrier 是什么? CyclicBarrier 使用 CyclicBarrier 源码解析 CyclicBarrier 简单实现 barrierAction 是由哪个线程执行的 ...

  2. 如何让Android 支持HEIF 图片解码和加载(免费的方法)

    字节跳动火山引擎ImageX提供了一种能力,可以支持客户端android 直接解码HEIF 和HEIC图片,经过测试发现,可以免费使用: 一.阅前准备 HEIF图片格式是什么? 高效率图像格式(Hig ...

  3. go语言json技巧

    go语言json技巧 本文总结了在项目中遇到的那些关于go语言JSON数据与结构体之间相互转换的问题及解决办法. 基本的序列化 首先我们来看一下Go语言中json.Marshal()(系列化)与jso ...

  4. 用golang刷LeetCode

    用golang刷LeetCode 用Go语言刷LeetCode记录,只是为了练习Go语言,能力有限不保证都是最优解,只能在此抛转引玉了. 数据结构和算法 数据结构和算法是程序员的命根子,没了命根子也就 ...

  5. Step By Step(Lua开篇)

    Step By Step(Lua开篇) 一.简介: Lua作为目前最为流行的.免费轻量级嵌入式脚本语言,在很多工业级的应用程序中被广泛应用,如Adobe's Photoshop,甚至是在一些著名的游戏 ...

  6. Jmeter- 笔记1 - 理论知识

    为什么不用loadrunner,lonadrunner免费最大并发用户50,再往上就要买license了. 性能输出结果不是bug 假如调试脚本没有出错,但运行脚本时,可能前期没有问题,但到后期偶尔/ ...

  7. TensorFlow Frontend前端

    TensorFlow Frontend前端 TensorFlow前端有助于将TensorFlow模型导入TVM. Supported versions: 1.12 and below Tested m ...

  8. CodeGen按钮循环

    CodeGen按钮循环 按钮循环是一个模板文件构造,它允许您迭代CodeGen拥有的按钮信息集合.              在按钮循环中处理的按钮的定义可以来自两个位置之一. 如果基于UI工具箱输入 ...

  9. 在python_request 中 nb-log 日志模块的使用,应用到项目实际使用

    一.安装 pip install nb-log pycham 中安装: 二.基本使用 2.1 pycham中调整设置控制台日志打印出的颜色 2.2 设置完成后去掉console弹出的颜色设置 2.3  ...

  10. Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache.org/schema/dubbo]

    dubbo的官方文档写的真好, http://dubbo.apache.org/zh-cn/docs/2.7/user/dependencies/ 在使用dubbo过程中的问题, 和解决 org.sp ...