从零搭建一个IdentityServer——集成Asp.net core Identity
前面的文章使用Asp.net core 5.0以及IdentityServer4搭建了一个基础的验证服务器,并实现了基于客户端证书的Oauth2.0授权流程,以及通过access token访问被保护资源,本文将继续完善IdentityServer实现与Identity组件的集成,可使用Identity的用户来完成授权。
- 集成Asp.net core Identity与元包(MetaPackage)
- Asp.net core Identity数据持久化
- Asp.net core Identity UI
- Asp.net core Identity与IdentityServer4集成
- 小结
集成Asp.net core Identity
在软件领域中只要提到身份验证就能想到登录,而登录往往与用户名和密码相关联,IdentityServer4或者说OAuth2.0和OpenIDConnect也是一样的,它需要用户数据来支持完成相关的验证及授权操作,下面我们就先来实现IdentityServer4的用户数据接入及与用户数据相关的授权流程。
首先为IdentityServer添加Asp.Net core Identity模块:
Asp.net core Identity是Asp.net core的身份验证组件,它不仅包含了身份验证所需的数据及数据持久化支持,另外还提供了用户管理、登录管理等一系列的服务和UI,在创建新的Asp.net core mvc或api项目时,如果勾选身份验证选项就会默认包含该组件,但是由于文本中的例子是从零开始的,所以Identity组件也需要手动添加。
在添加Identity之前还有一个概念需要再说一下就是metapackege(元包,具体参考:https://natemcmaster.com/blog/2018/08/29/netcore-primitives-2/),它实质上是一组共享库,提供了.net core和asp.net core应用的基础运行时和基础功能,在创建项目时默认会依赖相应.net core版本的元包,而元包共享的程序集实际上在dotnet的安装目录的shared目录下,元包的好处就是在框架发布时,发布文件就不需要包含元包内容,减少发布文件大小:

而Asp.net core 5.0应用程序包含两个元包:

其中Microsoft.AspNetCore.App中包含了Identity的基础组件:

基础组件中已经包含了Identity的基础组件,如IdentityUser等相关的实体以及相关的服务类型/接口,所以换句话说使用Identity功能仅需要完成数据持久化及UI即可。

Asp.net core Identity数据持久化
EF core是.net core下面的首选数据持久化框架,所以同样的identity也提供了基于EF core的数据持久化组件,添加基于EF的Identity数据持久化组件:

同时为了方便后续的扩展,新建一个ApplicationUser继承于IdentityUser和ApplicationDbContext继承于IdentityDbContext<ApplicationUser>:

添加Identity的数据上下文及identity服务:

添加数据库迁移代码并更新到数据库:
Add-Migration initIdentityDb -c ApplicationDbContext -o Migrations/IdentityServer/IdentityDb
Update-Database -Context ApplicationDbContext

Asp.net core Identity UI
Identity的UI是一个Razor的类库,换句话说就是页面文件被包含在类库里面了,如果要对UI进行修改可以通过VS的构建程序构建(VS Code可参考文档:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-5.0&tabs=netcore-cli#scaffold-identity-into-an-empty-project):

在对话框中选择“标识(Identity)”中的“标识(Identity)”选项:

在标识对话框中勾选“替代所有文件”,布局文件没有留空即可,最后选择Identity的DbContext即可:

添加Razor服务、静态文件处理中间件(访问js等文件)及Razor终结点映射:

访问登录地址:https://localhost:55002/Identity/Account/Login

到目前为止identity的数据库和UI都已经添加到项目中并且可以运行了,但是还存在一些问题,如默认的Identity UI相关功能依赖IEmailSender组件等等,同时还需要与IdentityServer4集成,其登录、注册、登出等基础功能需要根据IdentityServer4本身的一些需求进行修改。
Asp.net core Identity与IdentityServer4集成
下面就进入IdentityServer4与Asp.net core Identity的集成工作,首先先添加IdentityServer4.AspNetIdentity组件:

然后通过IIdentityBuilder向容器中添加相关服务:

最后对修改一下Identity的注册代码,将与IEmailSender有关的代码注释掉(注:默认生成代码中包含邮件发送逻辑,但是没有EmailSender的实现,除了注释相关代码外也可以实现一个IEmailSender并注册到容器中来解决问题):

启动应用,访问注册页面注册用户:https://localhost:55002/Identity/Account/Register

注册成功后,在数据库中为相应的client信息手动添加一条基于用户名密码的Grant Type(password),即可使用注册的用户来通过password的方式获取access token了:

以下是通过刚注册用户名密码获得的access token:

对上面的access token解码后可以看到它的payload部分包含以下信息(sub使用了用户的Id):

小提示:在IdentityServer4中获取Token时会根据请求对携带的Client信息以及相关参数进行验证,本例中如果Client不支持Password的Grant Type,那么会导致不支持相应的授权类型而导致无法正确获得Access Token,遇到无法正确获得Access Token或者一些验证错误的时候可以在调试模式下查看IdentityServer的输出,里面会包含相关授权成功/失败的信息。
小结
本篇文章通过集成asp.net core identity组件实现了用户管理,包括注册、登录等,并且实现了通过注册的用户,基于Oauth2.0的用户名密码模式(password grant type)来获取到Access Token,但就目前为止本系统文章所实现的、演示的IdentityServer功能仍旧是基于Oauth2.0协议,从下一篇文章开始就会开始介绍OpenIDConnect(oidc)相关的内容,此外现阶段实现的Identity登录也仅仅只是Identity本身的内容,针对OpenIDConnect或者说IdentityServer4它还有一些额外的操作,如事件、授权同意等等,这些内容也会在后续文章中不断完善。
参考:
https://natemcmaster.com/blog/2018/08/29/netcore-primitives-2/
本文链接:https://www.cnblogs.com/selimsong/p/14338193.html
从零搭建一个IdentityServer——集成Asp.net core Identity的更多相关文章
- 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权
OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...
- 从零搭建一个IdentityServer——目录(更新中...)
从零搭建一个IdentityServer--项目搭建 从零搭建一个IdentityServer--集成Asp.net core Identity 从零搭建一个IdentityServer--初识Ope ...
- 从零搭建一个IdentityServer——会话管理与登出
在上一篇文章中我们介绍了单页应用是如何使用IdentityServer完成身份验证的,并且在讲到静默登录以及会话监听的时候都提到会话(Session)这一概念,会话指的是用户与系统之间交互过程,反过来 ...
- 从零搭建一个IdentityServer——资源与访问控制
IdentityServer作为授权服务器它的最终目的是用于对资源进行管控,这里所说的资源有两种,其一是API资源,实际上也就是OIDC协议中客户端(RP)所需要访问的一系列受保护的资源(API),授 ...
- 从零搭建一个IdentityServer——项目搭建
本篇文章是基于ASP.NET CORE 5.0以及IdentityServer4的IdentityServer搭建,为什么要从零搭建呢?IdentityServer4本身就有很多模板可以直接生成一个可 ...
- 从零搭建一个IdentityServer——初识OpenIDConnect
上一篇文章实现了IdentityServer4与Asp.net core Identity的集成,可以使用通过identity注册功能添加的用户,以Password的方式获取Access token, ...
- 从零搭建一个IdentityServer——单页应用身份验证
上一篇文章我们介绍了Asp.net core中身份验证的相关内容,并通过下图描述了身份验证及授权的流程: 注:改流程图进行过修改,第三方用户名密码登陆后并不是直接获得code/id_token/acc ...
- 从零搭建一个SpringCloud项目之Feign搭建
从零搭建一个SpringCloud项目之Feign搭建 工程简述 目的:实现trade服务通过feign调用user服务的功能.因为trade服务会用到user里的一些类和接口,所以抽出了其他服务需要 ...
- IdentityServer(12)- 使用 ASP.NET Core Identity
IdentityServer具有非常好的扩展性,其中用户及其数据(包括密码)部分你可以使用任何想要的数据库进行持久化. 如果需要一个新的用户数据库,那么ASP.NET Core Identity是你的 ...
随机推荐
- python 无损压缩照片,支持批量压缩,支持保留照片信息
由于云盘空间有限,照片尺寸也是很大,所以写个Python程序压缩一下照片,腾出一些云盘空间 1.批量压缩照片 新建 photo_compress.py 代码如下 1 # -*- coding: utf ...
- centos8中的MySQL卸载和安装
centos8中的MySQL卸载和安装 前言 前几天在自己的服务器上安装了一个NDB集群[而且还没有成功] 放弃治疗后用一台没有mysql的服务器实现了单机版本的集群. 本来以为这事到这就结束了,结果 ...
- 【windows】【消息中间件】【安装】Elasticsearch
一.准备工作 elasticsearch的下载地址:https://www.elastic.co/cn/downloads/elasticsearch ik分词器的下载地址:https://githu ...
- Mysql实现定时清空一张表的旧数据并保留几条数据
要达到如下目的: Mysql数据库会每隔一段时间(可以是2小时,也可以是一天,这个可以自定义),定时对一张库中的表做一个判断,如果这张表的数据超过了20条(这个数据也是自定义的,也可以是200条),就 ...
- .net core 3.1 过滤器(Filter) 与中间件与AOP面向切面 与拦截器及其应用
Filter(过滤器) 总共有五种,Authorization Filter,Resource Filter,Exception Filter,Action Filter,Result Filter ...
- ADF 第八篇:传递参数(Pipeline的Parameter和Variable,Activity的output)和应用表达式
Azure Data Factory传递参数的方式主要有两种,通过Pipeline的Parameter和Variable来传递参数,通过Activity的输出来传递参数.要在Activity中引用Pa ...
- JPA 缓存
JPA有两种类型的缓存: EntityManager自身就是一种缓存.事务中从数据库获取的和写入到数据库的数据会被缓存(什么样的数据会被缓存,在后面有介绍).在一个程序中也许会有很多个不同的Entit ...
- JVM 低延迟垃圾收集器 Shenandoah 和 ZGC
本文部分摘自<深入理解 Java 虚拟机第三版> 概述 衡量垃圾收集器的三项指标分别是:内存占用.吞吐量和延迟.这三者共同构成一个"不可能三角",即一款优秀的收集器最多 ...
- 使用ThreadLocal
使用ThreadLocal 阅读: 135212 多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程.例如,打 ...
- CentOs 7 安装mysql5.7.18(二进制版本)
1.下载二进制版本安装包.搜狐开源镜像站:http://mirrors.sohu.com/mysql/MySQL-5.7/ , 找 mysql-5.7.18-linux-glibc2.5-x86_ ...