从零搭建一个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是你的 ...
随机推荐
- vue封装API接口
第一步: 首先引入axios 然后创建两个文件夹api和http http.js 里面的 1 import axios from 'axios';//引入axios 2 3 //环境的切换 开发环境( ...
- Core3.0返回的Json数据大小写格式问题
前言 测试发现,CoreWebAPI返回的Json数据,会将字段的首字母转换为小写, 经百度得,返回数据会默认驼峰命名,导致的. 随即百度, https://www.cnblogs.com/cdone ...
- Netty源码解析 -- PoolChunk实现原理(jemalloc 3的算法)
前面文章已经分享了Netty如何实现jemalloc 4算法管理内存. 本文主要分享Netty 4.1.52之前版本中,PoolChunk如何使用jemalloc 3算法管理内存. 感兴趣的同学可以对 ...
- 深入浅出Mybatis系列 强大的动态SQL
上篇文章<深入浅出Mybatis系列(八)---mapper映射文件配置之select.resultMap>简单介绍了mybatis的查询,至此,CRUD都已讲完.本文将介绍mybatis ...
- [LeetCode]80. Remove Duplicates from Sorted Array II删除数组中的重复值
和第一题不同的地方是,容忍两次重复 虽然题目上说只需要长度,但是否检测的时候如果数组不跟着改变也是不行的 没说清楚题意 自己是用双指针做的,看了大神的答案更简单 public int removeDu ...
- 设计模式——从HttpServletRequestWrapper了解装饰者模式
从一个业务开始 最近项目上紧急需要,为了应付一个不知道啥的安全检测,我们要给系统追加防XSS注入的功能,这里有经验的JavaWeb开发就会想到,用过滤器或者基于项目框架的拦截器来做,但是顺着这个思路下 ...
- Pytest测试框架(一):pytest安装及用例执行
PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest ...
- 软件工程UML第一次作业
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1/ 这个作业要求在哪里 https://edu.cnblogs.com/campus/f ...
- linq to entity不识别方法"System.String ToString()"
将班级id以字符串形式输入如:"1111,1112,1113".数据库里的id为int型,在数据路里找到匹配的相应班级转换成列表.在这里爆出问题:不识别方法"System ...
- Flink SQL 核心概念剖析与编程案例实战
本次,我们从 0 开始逐步剖析 Flink SQL 的来龙去脉以及核心概念,并附带完整的示例程序,希望对大家有帮助! 本文大纲 一.快速体验 Flink SQL 为了快速搭建环境体验 Flink SQ ...