Asp.Net Core之Identity源码学习
什么是Identity
ASP.NET Identity是构建核心 Web 应用程序(ASP.NET、登录和用户数据)的成员系统。ASP.NET核心标识允许您向应用程序添加登录功能,并可以轻松自定义有关登录用户的数据。
源码链接 Github链接
用我的话说就是一个权限管理模块,可以提供使用ef持久化储存数据的功能。包含了用户管理,角色管理,用户凭证管理,角色凭证管理,以及各种第三方登录储存。
源码结构
源码主要包含一些接口定义,然后就是接口的封装,在这里我推荐一篇很不错的文章,比我讲的都要详细。
感觉不错的文章
我们来看看源码结构
Microsoft.Extensions.Identity.Stores 和 Microsoft.Extensions.Identity.Core里面的代码是重点 尤其是Microsoft.Extensions.Identity.Core里的那些定义的接口
- IQueryableRoleStore
- IQueryableUserStore
- IRoleClaimStore
- IRoleStore
- IUserAuthenticationTokenStore
- IUserClaimStore
- IUserEmailStore
- IUserLockoutStore
- IUserLoginStore
- IUserPasswordStore
- IUserPhoneNumberStore
- IUserRoleStore
- IUserSecurityStampStore
- IUserStore
- IUserTwoFactorStore
我们以IuserRoleStore接口为例
IUserRoleStore继承了IUserStore接口 好多接口都继承了IUserStore 因为这个是关于用户的最初的接口当其他的接口都继承这个的时候我们可以通过定义一个子类继承其他接口那我们就可以实现这些接口来实现具体的功能了
说到这我们就来看一个实现了功能的类
UserStoreBase这个抽象类算是继承了好多的接口 其中就包含IQueryableUserStore接口 这个接口算是为了查找数据定义的 因为这个接口就一个Users属性
另外的UserStore接口又继承了这个UserStoreBase接口
说着这里的实现其实到这里整个调用这些实现的方法就可以用了,把他们注入到DI容器然后就可以开心的使用了,如下图。官方就是这样操作的。但是可能涉及的接口比较多,源码里就把好多的操作接口给封装成那最经典的三个类了。
在UserStore里注入了Ef的数据上下文,也就是说对数据库的增删改查在UserStore里就已经完成了。
然后就是那最重要的三个类了这三个类算是对UserStore RoleStore那些功能再次封装了,这样在使用方面就注入这个三个类就可以实现所有的功能了。具体的功能大家看看涉及的源码细节。如果有看不懂的,请看我下面的动图示例演示代码,对理解源码有帮助。
SignInManager
UserManager
RoleManager
在源码里使用了很多的将IUserStore转换成其他子接口的使用方法,这大概是叫里氏替换原则吧。大家如果想实现一套自己的,可以定义好接口然后像identity这样实现接口,然后封装成这三个类就好了。或者封装成其他的什么类。这三个类是在图上的位置注入进入的。
关于权限系统的概念,我想做的系统是有三个概念,一个用户,一个角色,一个资源,这个资源可以是声明凭证,也可以是具体的权限,也可以是一些菜单的权限,其实和identity里的claim很像。用户可以拥有很多的角色,也可以拥有很多的资源,角色也可以拥有很多的资源,用户的总资源等于角色资源和用户资源的并集。
此文章算是学习笔记了,不喜欢的求轻喷。
Asp.Net Core之Identity源码学习的更多相关文章
- ASP.NET Core 2.1 源码学习之 Options[1]:Configure
配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 Configur ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor
前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式.而 IOptionsMonitor 则要求配置源必须是 ...
- ASP.NET Core 2.1 源码学习之 Options[3]:IOptionsMonitor 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-monitor-in-asp-net-core. ...
- ASP.NET Core 2.1 源码学习之 Options[1]:Configure 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-configure-in-asp-net-core.html 配置 ...
- ASP.NET Core 选项模式源码学习Options Configure(一)
前言 ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户 ...
- ASP.NET Core 2.1 源码学习之 Options[2]:IOptions
在 上一章 中,介绍了Options的注册,而在使用时只需要注入 IOption<T> 即可: public ValuesController(IOptions<MyOptions& ...
- ASP.NET Core 2.1 源码学习之 Options[2]:IOptions 【转】
原文链接:https://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-in-asp-net-core.html 在 上 ...
- ASP.NET Core 选项模式源码学习Options IOptions(二)
前言 上一篇文章介绍IOptions的注册,本章我们继续往下看 IOptions IOptions是一个接口里面只有一个Values属性,该接口通过OptionsManager实现 public in ...
- ASP.NET Core 选项模式源码学习Options IOptionsMonitor(三)
前言 IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用.IOptionsMonitor用于检索选项并管理TOption实例的选项通知, IOpti ...
- .NET Core 2.1 源码学习:看 SocketsHttpHandler 如何在异步方法中连接 Socket
在 .NET Core 2.1 中,System.Net.Sockets 的性能有了很大的提升,最好的证明是 Kestrel 与 HttpClient 都改为使用 System.Net.Sockets ...
随机推荐
- SELinux 基本原理
首发公号:Rand_cs SELinux 基本原理 本文讲述 SELinux 保护安全的基本原理 安全检查顺序 不废话,直接先来看张图 当我们执行系统调用的时候,会首先对某些错误情况进行检查,如果失败 ...
- Linux扩展篇-shell编程(五)-流程控制(三)-for语句
基本语法: 格式一 for(( 初始值; 循环控制条件; 变量变化)) do statements done 格式二 for 变量 in 值1 值2 值3 ... do statements done ...
- ABC336
E 数位 dp. 定义 \(dp_{pos,s,t,0/1}\) 为在第 \(pos\) 位,当前数字和是 \(s\),这个数模规定的数字和为 \(t\),是 \(/\) 不是极限的情况数. 于是我们 ...
- Selenium模块的使用(二)
selenium处理iframe - 如果定位的标签存在于iframe标签之中,则必须使用switch_to.frame(id) - 动作链(拖动):from selenium.webdriver i ...
- vue动态页签
效果图 前端 1 <template> 2 <!-- 总体情况 - 总览echarts --> 3 4 <div v-loading="loading" ...
- vue柱状图
原型 1 <template> 2 <!-- 上下柱状图 --> 3 <div ref="overallSituation" :style=" ...
- java堆和栈有哪些区别
java堆和栈有哪些区别 Java堆和栈是Java虚拟机(JVM)中的两个重要概念,它们在内存管理.存储对象和执行线程等方面有明显的区别. 1.内存分配和管理Java堆是动态分配的内存区域,主要用来存 ...
- 深入了解身份认证和授权机制,看看API请求到底发生了什么?
前段时间写了一篇基于.NetCore环境使用IdentityServer4为API接口鉴权的文章,更多的是从快速上手的角度描述了IdentityServer4的使用.后续使用过程中,自己有了一些其他想 ...
- mysql子查询不支持limit问题解决
如果sql语句中的子查询包含limit 例如: select * from table where id in (select id from table limit 3) 会报错: This ver ...
- python重拾基础第三天
本节内容 函数基本语法及特性 参数与局部变量 返回值 嵌套函数 递归 匿名函数 函数式编程介绍 高阶函数 内置函数 1. 函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况 ...