从零搭建一个IdentityServer——项目搭建
- 创建一个空的Asp.net Core 5.0项目
- 添加IdentityServer4
- IdentityServer4数据持久化
- 配置IdentityServer4证书
- 创建一个基于Jwt身份验证的WebApi项目
- 小结
创建一个空的Asp.net Core 5.0项目

添加IdentityServer4组件
安装完成后通过AddIdentityServer方法将相关的服务注册到容器中,同时这里返回一个builder用于继续构建IdentityServer服务,如存储、缓存、加密相关的密钥等等;



IdentityServer4数据持久化
这个问题的原因在于,IdentityServer4在进行授权时实际上是依赖一系列数据的,这些数据包括Client、Resource、Scope等,所以为了保证授权相关操作能够完成,需要配置相关数据的存储服务,IdentityServer4默认提供了测试基于内存的数据存储,但一般只是用于测试目的:
关于数据持久化,在.net技术栈中可以想到的就是Entity Framework,同时IdentityServer4提供了名为:IdentityServer4.EntityFramework的包,它包含了相关的实体类型(IdentityServer4.EntityFramework.Storage)以及EF的DbContext。所以引入IdentityServer4.EntityFramework包就可以实现基于EF的数据持久化,另外也可以自己实现。

上图中可以看到IdentityServer4关于EF的包有2个,但是实际上安装IdentityServer4.EntityFramework就包含Storage这个包了:

安装完成之后,我们可以在IdentityServer4.EntityFramework.Storage包中找到以下两个DbContext类型:


然后就可以对IdentityServer的存储进行配置了:

以上主要是对数据库链接字符串、数据库版本、字符集以及数据库迁移程序集进行配置,需要注意的是在对数据库进行迁移的时候默认使用DbContext所在的程序集,而IdentityServer4提供的DbContext位于IdentityServer4.EntityFramework.Storage包里面,所以为了能够确保迁移文件正常生成,所以需要将Startup所在的程序集设为迁移程序集(注:更适合的方式是专门创建一个数据库迁移项目来作为迁移程序集,这样数据库迁移的相关内容可以单独维护)。
工具描述,相关命令及参数可参考文档https://docs.microsoft.com/en-us/ef/core/cli/powershell:
注:-c和-o分别是-Context 和-OutputDir 的简写,在参数没有二义性时可以使用简写。
执行数据库更新命令后,数据库将完成创建:
数据库也就创建好了:

启动程序,并访问https://localhost:55006/.well-known/openid-configuration即可看到以下内容,证明IdentityServer4已经成功启动了:

注:关于IdentityServer4的默认数据可通过命令“dotnet new -i IdentityServer4.Templates”先安装IdentityServer4相关模板,然后使用“dotnet new is4ef”命令来创建,具体参考文档:https://identityserver4.readthedocs.io/en/latest/quickstarts/5_entityframework.html
配置IdentityServer4证书
运行程序,通过测试数据中的client及其密码尝试获取access token:

添加代码后再次运行程序,就能够生成Access Token 了:

创建一个基于Jwt身份验证的WebApi项目

设置API的授权访问:

成功访问,但是这里有个小细节需要注意一下,就是当获取到access token后,在token的有效期内,哪怕是把IdentityServer关闭,也能使用token正常访问受保护资源,换句话说access token颁发后就与IdentityServer无关了,以上内容实际上是使用Asp.Net core 5.0以及IdentityServer4实现了一个基于客户端证书(Client Credentials)的Oauth2.0授权流程,但IdentityServer提供的内容不仅于此,后续文章将会对该IdentityServer继续完善,使其成为一个功能完善的身份验证服务。
小结
从零搭建一个IdentityServer——项目搭建的更多相关文章
- 从零搭建一个IdentityServer——目录(更新中...)
从零搭建一个IdentityServer--项目搭建 从零搭建一个IdentityServer--集成Asp.net core Identity 从零搭建一个IdentityServer--初识Ope ...
- 从零搭建一个IdentityServer——会话管理与登出
在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...
- 从零搭建一个IdentityServer——资源与访问控制
IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...
- 从零搭建一个SpringCloud项目之Feign搭建
从零搭建一个SpringCloud项目之Feign搭建 工程简述 目的:实现trade服务通过feign调用user服务的功能.因为trade服务会用到user里的一些类和接口,所以抽出了其他服务需要 ...
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- 如何搭建一个VUE项目
搭建环境 搭建node环境 下载 1.进入node.js官方网站下载页,点击下图中框出位置,进行下载即可,当前版本为8.9.4,下载网址为:https://nodejs.org/zh-cn/downl ...
- vue-用Vue-cli从零开始搭建一个Vue项目
Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...
- 基于 Express 搭建一个node项目 - 起步
一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...
- 从零开始搭建一个react项目
Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...
随机推荐
- 主数据管理(MDM)的6大层级简述,你不可不知的数据治理参考!
前面我写了一篇关于对元数据和元数据管理的认知和理解的文章,有兴趣的朋友可以去看看.接下来我们讲一讲主数据管理(MDM). 主数据管理(MDM) 主数据是系统间共享数据,它是系统间信息交换的基准.主数据 ...
- 【入门必看】不理解「对象」?很可能有致命bug:简单的Python例子告诉你
简介:越来越多的人要在学习工作中用到『编程』这个工具了,其中很大一部分人用的是Python.大部分人只是做做简单的科研计算.绘图.办公自动化或者爬虫,但-- 这就不需要理解「指针与面向对象」了吗? 在 ...
- 闭关修炼180天--手写持久层框架(mybatis简易版)
闭关修炼180天--手写持久层框架(mybatis简易版) 抛砖引玉 首先先看一段传统的JDBC编码的代码实现: //传统的JDBC实现 public static void main(String[ ...
- spring boot编程思想(核心篇) pdf 下载 it教程
资料简介:本书是<Spring Boot 编程思想>的核心篇,开篇总览Spring Boot核心特性,接着讨论自动装配(Auto-Configuration)与SpringApplicat ...
- 持续提升程序员幸福指数——使用abp vnext设计一款面向微服务的单体架构
可能你会面临这样一种情况,在架构设计之前,你对业务不甚了解,需求给到的也模棱两可,这个时候你既无法明确到底是要使用单体架构还是使用微服务架构,如果使用单体,后续业务扩展可能带来大量修改,如果使用微服务 ...
- Java面试被经常问到的常用算法
一.冒泡排序 原理:比较两个相邻的元素,较大的放在右边 N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次 最好时间复杂度为O(N) Cmax = N(N-1)/2 = O(N2 ...
- [LeetCode]148. Sort List链表归并排序
要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O ...
- sql操作数据库(2)--->DQL、数据库备份和还原
查询 查询表中的所有的行和列的数据 select * from 表名; select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...
- BCC和libbpf的转换
BCC和libbpf的转换 本文讲述如何将基于BCC的BPF应用转换为libbpf + BPF CO-RE.BPF CO-RE可以参见上一篇博文. 为什么是libbpf和BPF CO-RE? 历史上, ...
- VoltDB成功入选CNCF Landscape云原生数据库全景图
近日,VoltDB正式入选 CNCF Landscape(可能是目前其中唯一的关系型分布式内存数据库).此次VoltDB 进入 CNCF Landscape,意味着 VoltDB 正式成为了 CNCF ...