本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可以运行的验证服务程序,是因为在真实开发过程中很难直接用生成的模板来进行开发,其次是通过生成的方式开发者本身可能会对某些技术细节有所忽略。
   
  本文从以下几个方面来完成IdentityServer项目搭建:

创建一个空的Asp.net Core 5.0项目

  通过VS创建一个空的Asp.net core 5.0项目:

  注:此处选择了Docker支持,需要安装Docker Desktop,另外第一次通过Docker调试应用程序需要下载相应的Docker Image和VS的调试环境,如果镜像文件下载慢,那么可以变更docker的注册镜像:https://blog.csdn.net/zhangqingmu/article/details/104655635/,如果VS调试环境下载慢可参考https://blog.csdn.net/lindexi_gd/article/details/106925674手动下载。
  项目启动后看到以下结果:

添加IdentityServer4组件

  IdentityServer4是一组中间件,它实现了OpenID Connect和Oauth2.0协议,来提供身份验证以及授权服务,添加IdentityServer4仅需要安装IdentityServer4组件,然后对相关服务和中间件进行配置即可:
 

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

  

  接着将IdentityServer中间件添加到Asp.net core的http请求管道中:
  
  注:在添加中间件的时候需要注意IdentityServer中间件的放置顺序,另外在调用UseIdentityServer这个方法中还自动添加了身份验证的中间件。

IdentityServer4数据持久化

  按理来说现在已经可以运行项目了,但是运行的时候出现了无法解析IClientStore类型错误:
  

  这个问题的原因在于,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类型:

  ConfigurationDbContext :
  PersistedGrantDbContext :
   
  
  为了EF能够正常工作需要根据数据库类型安装相应的EF数据库提供器(本例使用的是Mariadb):

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

  

  以上主要是对数据库链接字符串、数据库版本、字符集以及数据库迁移程序集进行配置,需要注意的是在对数据库进行迁移的时候默认使用DbContext所在的程序集,而IdentityServer4提供的DbContext位于IdentityServer4.EntityFramework.Storage包里面,所以为了能够确保迁移文件正常生成,所以需要将Startup所在的程序集设为迁移程序集(注:更适合的方式是专门创建一个数据库迁移项目来作为迁移程序集,这样数据库迁移的相关内容可以单独维护)。

  另外还需要注意的是数据库链接字符串,在开发时可能数据库安装在本地可以使用127.0.0.1,但是如果在dorcker中调试的话127.0.0.1无法链接到数据库。
  完成配置后即可将数据库结构迁移到数据库中,首先需要安装EF的工具:
  工具描述,相关命令及参数可参考文档https://docs.microsoft.com/en-us/ef/core/cli/powershell
  
  执行命令(参数o表示迁移文件输出路径,因为存在多个DbContext以及需要多个数据迁移,所以分开存储):
  Add-Migration initPersistedGrantDb -c PersistedGrantDbContext -o Migrations/IdentityServer/PersistedGrantDb
  Add-Migration initConfigurationDb -c ConfigurationDbContext -o Migrations/IdentityServer/ConfigurationDb

  注:-c和-o分别是-Context 和-OutputDir 的简写,在参数没有二义性时可以使用简写。

  生成的文件:
  

  执行数据库更新命令后,数据库将完成创建:

  Update-Database -Context PersistedGrantDbContext
  Update-Database -Context ConfigurationDbContext
  

  数据库也就创建好了:

  

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

  

  但是由于数据库中还没有任何数据,所以还无法进行授权操作,因为数据库中还没有任何数据,这里简单的把IdentityServer4模板创建的创建初始数据代码引入,并完成数据创建:
  

  注:关于IdentityServer4的默认数据可通过命令“dotnet new -i IdentityServer4.Templates”先安装IdentityServer4相关模板,然后使用“dotnet new is4ef”命令来创建,具体参考文档:https://identityserver4.readthedocs.io/en/latest/quickstarts/5_entityframework.html

  在启动参数中包含“/seed”时创建数据,关于启动参数,可以直接执行程序时添加,如dotnet .\IdentityServer.dll /seed,或者通过VS中设置调试参数进行调试(数据生成后删除):
  

配置IdentityServer4证书

  运行程序,通过测试数据中的client及其密码尝试获取access token:

  

  啊哦,出错了,未配置签名证书,无法创建Jwt token,简单来说就是为了保证token的签名和验证,需要配置一个数字签名证书,关于证书配置可参考文档:https://identityserver4.readthedocs.io/en/latest/topics/startup.html#key-material
  为了方便,使用开发证书进行测试:
  

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

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

  最后通过VS新建一个默认的WebApi项目来验证一下是否能够通过access_token访问受保护资源。
  在新建的项目中添加基于Jwt bearer的验证服务:
  
  同时添加身份验证中间件:
  

  设置API的授权访问:

  

  获取token后访问受保护API:
  

  成功访问,但是这里有个小细节需要注意一下,就是当获取到access token后,在token的有效期内,哪怕是把IdentityServer关闭,也能使用token正常访问受保护资源,换句话说access token颁发后就与IdentityServer无关了,以上内容实际上是使用Asp.Net core 5.0以及IdentityServer4实现了一个基于客户端证书(Client Credentials)的Oauth2.0授权流程,但IdentityServer提供的内容不仅于此,后续文章将会对该IdentityServer继续完善,使其成为一个功能完善的身份验证服务。

小结

  本篇文章从一个空项目开始,不断往里面添加组件和代码,搭建了一个基于IdentityServer4的身份验证服务器,并且到目前为止已经实现了IdentityServer4的相关数据持久化,并且能够通过Client_Credentials等方式获取Access Token,实现了基于Jwt的身份验证,这一切实际上都是基于Oauth2.0协议的,关于Oauth2.0可以参考文章:https://www.cnblogs.com/selimsong/p/8037717.html
  但IdentityServer4是一个实现OpenIDConnect协议的身份验证/授权服务,更多内容将在后续文章中介绍。
参考:
 

从零搭建一个IdentityServer——项目搭建的更多相关文章

  1. 从零搭建一个IdentityServer——目录(更新中...)

    从零搭建一个IdentityServer--项目搭建 从零搭建一个IdentityServer--集成Asp.net core Identity 从零搭建一个IdentityServer--初识Ope ...

  2. 从零搭建一个IdentityServer——会话管理与登出

    在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...

  3. 从零搭建一个IdentityServer——资源与访问控制

    IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...

  4. 从零搭建一个SpringCloud项目之Feign搭建

    从零搭建一个SpringCloud项目之Feign搭建 工程简述 目的:实现trade服务通过feign调用user服务的功能.因为trade服务会用到user里的一些类和接口,所以抽出了其他服务需要 ...

  5. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  6. 如何搭建一个VUE项目

    搭建环境 搭建node环境 下载 1.进入node.js官方网站下载页,点击下图中框出位置,进行下载即可,当前版本为8.9.4,下载网址为:https://nodejs.org/zh-cn/downl ...

  7. vue-用Vue-cli从零开始搭建一个Vue项目

    Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...

  8. 基于 Express 搭建一个node项目 - 起步

    一,如何基于 Express 搭建一个node项目 什么是Express 借用官方的介绍,Express是一个基于Node.js平台的极简.灵活的web应用开发框架,它提供了一系列强大的特性,帮助你创 ...

  9. 从零开始搭建一个react项目

    Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...

随机推荐

  1. WP | BUGKU 论剑

    题目:bugku Misc论剑 第一步:在winhex里分析 发现文件头有两个 两个jpg文件中间还有一段二进制码 在kali里分离出两个一样jpg图片,但是没有什么发现 二进制码解出来也没有flag ...

  2. MVC中Bundle的使用

    BundleConfig配置 (1)StyleBundle中的参数,即为cshtml中需要调用的虚拟路径名称. (2)Include包含路径,可以包含一个或多个css或js文件.即包含一组文件. pu ...

  3. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.6)- 串行NOR Flash下载算法(MCUXpresso IDE篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE开发环境下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行N ...

  4. Java日常开发的21个坑,你踩过几个?

    前言 最近看了极客时间的<Java业务开发常见错误100例>,再结合平时踩的一些代码坑,写写总结,希望对大家有帮助,感谢阅读~ 1. 六类典型空指针问题 包装类型的空指针问题 级联调用的空 ...

  5. 10天,从.Net转Java,并找到月薪2W的工作(三)

    放弃Offer之后,压力一天比一天打 好点的公司,除了技术追根问底,还对你平时代码实践问的很多.比如问你,redis缓存一般设置多大.问你项目内容的细节,业务流程. 集合.锁.Jvm.多线程高并发.微 ...

  6. 卷积神经网络CNN-学习1

    卷积神经网络CNN-学习1 十年磨一剑,霜刃未曾试. 简介:卷积神经网络CNN学习. CNN中文视频学习链接:卷积神经网络工作原理视频-中文版 CNN英语原文学习链接:卷积神经网络工作原理视频-英文版 ...

  7. 使用metadata-extractor获取照片中的位置、曝光度、大小...

    使用metadata-extractor实现获取图片中的属性信息 官网:https://drewnoakes.com/code/exif/ 简介:metadata-extractor允许您通过简单的A ...

  8. C语言实现汉诺塔

    汉诺塔 要把A柱子上的盘子移动到C柱子上,在移动过程中可以借助B柱子,但是要求小的盘子在上大的盘子在下. 解题思路: 1.把A柱子上的前N-1个盘子借助C柱子,全部移动到B柱子上(过程暂不考虑),再把 ...

  9. 1.第一个QT程序

    第一个QT程序 应用程序类QApplication 窗口类MyWidget 进入事件循环 a.exec() 头文件 mywidget.h QApplication 文件Demo_pro 我怎么知道我用 ...

  10. 杭电OJ----1097:一个难题(c++)

    问题描述 lcy给feng5166,lwg,JGShining和Ignatius带来了一个难题:给了a和b,如何知道a ^ b.每个人都反对这个BT问题,所以lcy使问题比开始容易. 这个难题描述了: ...