从零搭建一个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是你的 ...
随机推荐
- NPOI导入excel
1.引用NPOI: using NPOI.HSSF.UserModel;using NPOI.HSSF.Util;using NPOI.SS.UserModel; 2.导出excel 1 privat ...
- (三)文件的链接(ln)
一.链接的分类及特点 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link ...
- java instanceof 判断是否是String
if(formbean.getBean().get("RZZGMCM") instanceof String){ formbean.getBean().put("RZZG ...
- 【代码周边】npm是What?
社区 程序员自古以来就有社区文化: 社区的意思是:拥有共同职业或兴趣的人们,自发组织在一起,通过分享信息和资源进行合作.虚拟社区的参与者经常会在线讨论相关话题,或访问某些网站.前端程序员也有社区,世界 ...
- Idea创建Maven项目时出现Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1错误
如果Maven中用的jre用的是idea中自带的,但是环境变量JAVA_HOME配置的是自己的jdk,那么就会出现 解决方法是到settiing中把jre改成自己的jdk中的jre 经过尝试,问题解决
- offset()与position()的区别
jQuery中有两个获取元素位置的方法offset()和position(),两者的定义如下: offset(): 获取匹配元素在当前视口的相对偏移. 返回的对象包含两个整形属性:top 和 left ...
- Service Mesh——微服务中的流量管理中间件
Service Mesh--微服务中的流量管理中间件 摘自-https://zhuanlan.zhihu.com/p/28794062 Service mesh 与 Cloud Native Kube ...
- 第十六章节 BJROBOT 开机自启动服务【ROS全开源阿克曼转向智能网联无人驾驶车】
1.把小车平放在地板上,用资料里的虚拟机,打开一个终端 ssh 过去主控端运行rosrun robot_upstart install znjrobot/launch/bringup.launch 2 ...
- MODBUS_RTU通信协议
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表.Modbus已经成为工业领域通信协议 ...
- 初识分布式图数据库 Nebula Graph 2.0 Query Engine
摘要:本文主要介绍 Query 层的整体结构,并通过一条 nGQL 语句来介绍其通过 Query 层的四个主要模块的流程. 一.概述 分布式图数据库 Nebula Graph 2.0 版本相比 1.0 ...