从零搭建一个IdentityServer——项目搭建

  本篇文章是基于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服务,如存储、缓存、加密相关的密钥等等;html

  

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

 IdentityServer4数据持久化

  按理来讲如今已经能够运行项目了,可是运行的时候出现了没法解析IClientStore类型错误:
  

   这个问题的缘由在于,IdentityServer4在进行受权时其实是依赖一系列数据的,这些数据包括Client、Resource、Scope等,因此为了保证受权相关操做可以完成,须要配置相关数据的存储服务,IdentityServer4默认提供了测试基于内存的数据存储,但通常只是用于测试目的:git

   

   关于数据持久化,在.net技术栈中能够想到的就是Entity Framework,同时IdentityServer4提供了名为:IdentityServer4.EntityFramework的包,它包含了相关的实体类型(IdentityServer4.EntityFramework.Storage)以及EF的DbContext。因此引入IdentityServer4.EntityFramework包就能够实现基于EF的数据持久化,另外也能够本身实现。github

  

 

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

  

   安装完成以后,咱们能够在IdentityServer4.EntityFramework.Storage包中找到如下两个DbContext类型:shell

  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 的简写,在参数没有二义性时可使用简写。服务器

  生成的文件:
  

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

  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协议的身份验证/受权服务,更多内容将在后续文章中介绍。
参考:
 
相关文章
相关标签/搜索