前言

原计划打算在春节期间多分享几篇技术文章的,但到最后一篇也没出,偷懒了吗?算是吧,过程是这样的:每次拿出电脑,在孩姥姥家的院子总有阳光沐浴,看不清屏幕,回屋又有点冷(在强行找理由),于是又带着娃遛弯去啦。哪有那么多理由,就是想偷个懒;不过后面几天把计算机组成原理简单过了过,后面整理整理再单独给小伙伴分享吧。

这次接着IdentityServer4说,之前一直用内存数据进行测试演示,在正式项目中肯定是要存数据库的(除非数据固定,用内存方式实现);接下来就用Demo实操的过程说说IdentityServer4的持久化。

正文

IdentityServer4已经对EF Core有很好的支持与封装,用很少的代码就能实现数据持久化,重点还是需要对EF Core有所了解,如果还有不了解的小伙伴,请先花几分钟看看之前分享的关于EF Core的文章(跟我一起学.NetCore之EF Core 实战入门,一看就会)。

主要需要nuget包如下:

  • IdentityServer4:这个包是IdentityServer4的核心包,项目中只要使用IdentityServer4,就必须引入此包;
  • IdentityServer4.EntityFramework:这个包是IdentityServer4针对EF进行封装的包,支持使用EF进行数据的持久化;
  • Microsoft.EntityFrameworkCore.SqlServer:针对不同的数据库引入不同的EF包,这里使用的是微软提供的本地数据库,所以引入的SqlServer;
  • Microsoft.EntityFrameworkCore.Tools:如果需要在程序的包管理控制台进行迁移操作,就需要在指定程序集中安装此包;
  • Microsoft.EntityFrameworkCore.Design:如果需要在命令行中进行迁移操作,就需要在指定程序集中安装此包;

注:Demo演示采用的是包管理控制台的方式进行迁移操作;命令行的方式思路是一样的,只是使用的命令稍微有点不同;

Demo走起来

  1. 项目准备

    这里就不从头到尾敲代码啦,把上一节Authorization Code的代码拷贝过来,重点还是关注持久化的过程(这个理由棒棒哒)。

    源码地址:https://github.com/zyq025/IDS4Demo/tree/main/AuthorizationCode。

  2. 开始撸码

    先把包都引入到程序中,如下图:

    然后在Startup.cs文件中,将原来的内存模式改为从数据库中读取即可;其实最关键的就是IdentityServer4封装好的两个上下文:

    • ConfigurationDbContext:这个上下文主要是针对配置数据,比如客户端(Client)、资源(Resources)等;
    • PersistedGrantDbContext:这个上下文主要是针对用户授权操作时的数据和临时数据,比如同意授权的数据、Token等;

    在代码中只需要针对这这两个上下文指定数据库就行啦,如果没有什么自定义需求,不用其他配置,如下:

  3. 迁移就完事啦

    代码撸完啦,剩下的就是EF迁移的几步走就完事啦(这里演示用的包管理控制台):

    注: 如果程序中有多个上下文,如果不指定上下文,迁移会报错,因为程序不知要到迁移哪个。

    • 新增迁移

      指定ConfigurationDbContext

      指定PersistedGrantDbContext

      参数简要说明:

      -Context : 指定上下文进行迁移;

      -OutputDir:迁移生成的文件存放路径;

      最后迁移的文件结果如下:

    • 根据迁移文件,同步到数据库中

      先同步ConfigurationDbContext

      这时候对应的数据库就生成了,而且对应配置相关的表已经在数据库创建:

      再同步PersistedGrantDbContext

      这个表少,就两张:

    其实这样就已经可以啦,只要在数据库对应的表中添加对应的数据,就能进行操作啦; 那新手小伙伴肯定得苦恼啦,这么多表,咋知道哪个表存啥数据啊;不急,咱们把原来内存中的数据存进去,然后再看看每个表存了啥,这不就更加明了啦,比一个一个表说的还直接,这种方式还能促使小伙伴动手,不然都不知道里面存了啥(哈哈哈,高招)。那就多出来第四步,如下......

  4. 加个种子数据美美哒

    这里说的种子数据就是指原来在内存中数据,把它们读出来存到数据库中就行;很简单,通过上文对应直接存即可,代码如下:

    方法写好啦,直接在Configure中调用即可,如下:

    这样就完工啦,把授权服务器、资源服务器、客户端都启动,走一遍流程,看看是不是成功啦,不出意外一切顺利,这时再返过来看看每个表中都存啥数据,就真的很清晰啦。这里就不一一截图说,相信小伙伴都能搞得明白。

到这肯定有小伙伴要说话啦,用户那还是用的内存;之所以没放到上面一起说,那是因为用户这块的控制权完全在我们自己手里,可以自己设计(就是用户、菜单、角色那一套),也可以集成微软封装好的Identity(把常用的用户那一套已经封装啦)。

这里演示肯定挑着爽的玩,就集成微软封装好的Identity,来,继续撸码:

  1. 引入相关nuget包

    引入的包简单说明

    IdentityServer4.AspNetIdentity:IdentityServer4对微软封装的Indentity的支持;

    Microsoft.AspNetCore.Identity.EntityFrameworkCore:对Identity提供EF支持;

  2. 撸码就对啦

    因为IdentityDbContext是抽象类,不能直接使用,这里需要针对IdentityDbContext定义一个子类ApplicationDbContext,如下:

    然后在Startup.cs中注册相关服务即可:

  3. 迁移及同步:这里没有指定输出路径,小伙伴根据自己的需要进行指定。

    数据库中生成相关的表,如下:

  4. 更改登录和登出逻辑

    登出的时调用 _signInManager.SignOutAsync();即可

  5. 加点种子数据,即程序启动时加入用户数据

    方法写好,同样在Configure中调用即可,种子数据准备好之后,就可以用Zoe用户进行登录啦,密码就是Zoe123456&

这里就不专门针对微软封装的Identity说的那么细啦,小伙伴可以参考文档:https://docs.microsoft.com/zh-cn/aspnet/identity/overview/getting-started/introduction-to-aspnet-identity。

总结

IdentityServer4的入门暂时先到这篇吧,后续会在实战项目中进行使用分享。下一节先来说说服务发现。

一个被程序搞丑的帅小伙,关注"Code综艺圈",跟我一起学~

IdentityServer4之持久化很顺手的事的更多相关文章

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

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

  2. IdentityServer4.FreeSql 持久化实现

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

  3. 使用MySql对IdentityServer4进行持久化

    哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的 ...

  4. seajs的那点事(很坑的事),和本白的一点事(更坑的事)

    在开始之前,偶先吐槽加逗比一下,2天前,CCAV的本白和百度的菊花成功潜入到了携程大楼 然后在没有找到他们运维的情况下,四处乱逛,企图把他们的服务器给root一下,然后再瞎逛之后到了一个很神奇的地方 ...

  5. [转] React 最佳实践——那些 React 没告诉你但很重要的事

    前言:对很多 react 新手来说,网上能找到的资源大都是些简单的 tutorial ,它们能教会你如何使用 react ,但并不会告诉你怎么在实际项目中优雅的组织和编写 react 代码.用谷歌搜中 ...

  6. 跨平台导PDF,结合wkhtmltopdf很顺手

    前言 好东西要分享,之前一直在使用wkhtmltopdf进行pdf文件的生成,常用的方式就是先安装wkhtmltopdf,然后在程序中用命令的方式将对应的html生成pdf文件,简单而且方便:但重复的 ...

  7. 应该是很简单的事,关于SQL2005的视图浏览不排序问题

    http://bbs.csdn.net/topics/390667337?page=1

  8. 一件很奇怪的事关于Nuget包

    两个项目 A,B 分别引用了Newtonsoft.Json.dll A项目有引用B项目. A B 项目引用Newtonsoft.Json.dll文件源路径是相同的.但是经常报版本不匹配. 之后经过细心 ...

  9. 再访贺利坚(一):IT毕业生去培训机构,这件事很正常(转载)

    转载自: 再访贺利坚(一):IT毕业生去培训机构,这件事很正常 导语:与烟台大学计算机学院贺利坚副教授相识,还是在2012年年底,那个时候我在为社区之星专访栏目寻找合适的采访人.在社区运营的推荐下,我 ...

随机推荐

  1. MariaDB数据库---主从复制,galera架构

    主从复制 补充一点:⑤slave端的IO thread 将从master端请求来的二进制日志文件中的内容存储到relay_log(中继日志)中 图片来源:https://www.cnblogs.com ...

  2. ES6(四)用Promise封装一下IndexedDB

    indexedDB IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据,它可以被网页脚本创建和操作. IndexedDB 允许储存大量数据,提供查找接口,还能建立索引,这些都是 ...

  3. 秒啊,速来get这9个jupyter实用技巧

    1 简介 jupyter notebook与jupyter lab作为广受欢迎的ide,尤其适合开展数据分析相关工作,而掌握它们相关的一些实用技巧,势必会大大提升日常工作效率.而今天我就来给大家介绍9 ...

  4. 1151 LCA in a Binary Tree

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  5. 牛客练习赛64 D【容斥+背包】

    牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...

  6. CodeForces 1119D(差分+前缀和+二分)

    题意:给你一个数组,数组每次每个数都+1,有q次查询每一查询+L到+R中出现的所有不重复的数字个数. +L到+R其实就相当于是0到+(R-L+1) 感觉自己写的好啰嗦,直接上代码加注释: 1 #inc ...

  7. ACM#学习心得0

    加入实验室也有些日子了,这是第一个近来的小小学习心得 1.在之前的训练题和考核题以及平时刷过的题中,我发现自己对字符串这一块的基础知识掌握还是比较差的,总是不能正确的接收的字符或字符串. 这两个星期, ...

  8. DSC注册Agent失败- InternalServerError

    问题 有大概5台Agent Server,注册的时候,发现2台可以成功,其他的不成功. 注册失败的错误日志如下: 初步尝试 首先,Pull Server已经平稳的运行了几年了,此次注册还有部分Agen ...

  9. Matching Engine For Laravel(基于redis的撮合引擎),PHP高性能撮合引擎

    Laravel Package for Matching Engine 快速开始 github地址 安装: composer require sting_bo/mengine 复制配置文件: php ...

  10. Kubernets二进制安装(12)之部署Node节点服务的kube-Proxy

    kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件; kube-proxy负责为Pod创建代理服 ...