ASP.NET Core 之 Identity 入门(一)

前言

在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OWIN的东西,所以很多初学者在学习来很费劲,对于 Identity 都是一头雾水,包括我也是,曾经在学 identity 这个东西前后花了一个多月来搞懂里面的原理。所以大部分开发者对于 Identity 并没有爱,也并没有使用它,会觉得被绑架。

值得庆幸的是,在 ASP.NET Core 中,由于对模块的抽象化逐渐清晰,以及中间件的使用,这使得 Identity 的学习和使用路线变得更加平易近人,下面就让我们一起来看看吧。

Getting Started

在开始之前,让我们先忘记它和Entity Framework的关系,也忘记它和Authentication的关系,我们先学习几个英语单词。

有这么几个“单词”你可能需要弄明白:

# 1: Claims

大家应该都知道身份证长什么样子的,如下:

其中,姓名:奥巴马;性别:男;民族:肯尼亚;出生:1961.08.04,等等这些身份信息,可以看出都是一个一个的键值对,那如果我们想在程序中存这些东西,怎么样来设计呢?对,你可能想到了使用一个字典进行存储,一个Key,一个Value刚好满足需求。但是Key,Value的话感觉不太友好,不太面向对象,所以如果我们做成一个对象的话,是不是更好一些呢?最起码你可以用vs的智能提示了吧,我们修改一下,改成下面这样:

//我给对象取一个名字叫`Claim`你没有意见吧
public class Claim{  

 public string ClaimType { get; set; }  
 
 public string ClaimValue { get; set; } }

ClaimType 就是Key,ClaimValue就代表一个Value。这样的话,刚好可以存储一个键值对。这时候姓名:奥巴马是不是可以存进去了。

微软的人很贴心,给我们准备了一些默认的ClaimType呢?很多常用的都在里面呢,一起看看吧:

这里延伸第一个知识点:ClaimTypes

为了阅读体验,截图我只放了一部分哦。可以看到有什么Name,Email,Gender,MobilePhone等常用的都已经有了,其他的还有很多。细心的读者可能注意了,它的命名空间是System.Security.Claims,那就说明这个东西是.net 框架的一部分,嗯,我们暂时只需要知道这么多就OK了。

Claim 介绍完毕,是不是很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “证件单元”。

# 2: ClaimsIdentity

在有了“证件单元”之后,我们就用它可以制造一张身份证了,那么应该怎么样制造呢?有些同学可能已经想到了,对,就是新建一个对象,然后在构造函数里面把身份证单元传输进去,然后就得到一张身份证了。我们给这张身份证取一个英文名字叫 “ClaimsIdentity”,这个名字看起来还蛮符合的,既有 Claims 表示其组成部分,又有表示其用途的 Identity(身份),很满意的一个名字。

实际上,在现实生活中,我们的身份证有一部分信息是隐藏的,有一部分是可以直接看到的。比如新一代的身份证里面存储了你的指纹信息你是看不到的,这些都存储在身份证里面的芯片中,那能看到的比如姓名啊,年龄啊等。我们在设计一个对象的时候也是一样,需要暴露出来一些东西,那这里我们的 ClaimsIdentity 就暴露出来一个 Name,Lable等。

我们造的身份证(ClaimsIdentity)还有一个重要的属性就是类型(AuthenticationType),等等,AuthenticationType是什么东西?看起来有点眼熟的样子。我们知道我们自己的身份证是干嘛的吧,就是用来证明我们的身份的,在你证明身份出示它的时候,其实它有很多种形式载体的,什么意思呢?比如你可以直接拿出实体形式的身份证,那也可以是纸张形式的复印件,也可以是电子形式的电子码等等,这个时候就需要有一个能够表示其存在形式的类型字段,对,这个AuthenticationType就是干这个事情的。

然后我们在给我们的身份证添加一些润色,让其看起来好看,比如提供一些方法添加 Claims 的,删除 Claims的,写到二进制流里面的啊等等,最终我们的身份证对象看起来基本上是这样了:

public class ClaimsIdentity{  

 public ClaimsIdentity(IEnumerable<Claim> claims){}    //名字这么重要,当然不能让别人随便改啊,所以我不许 set,除了我儿子跟我姓,所以是 virtual 的public virtual string Name { get; }  
   public string Label { get; set; }    //这是我的证件类型,也很重要,同样不许 setpublic virtual string AuthenticationType { get; }    public virtual void AddClaim(Claim claim);    public virtual void RemoveClaim(Claim claim);    public virtual void FindClaim(Claim claim); }

嗯,到这里,我们的身份证看起来似乎很完美了,但是从面向对象的角度来说好像还少了点什么东西? 对~,还是抽象,我们需要抽象出来一个接口来进行一些约束,约束什么呢?既然作为一个证件,那么肯定会涉及到这几个属性信息:
1、名字。2、类型。3、证件是否合法。
反应到接口里面的话就是如下,我们给接口取个名字叫:“身份(IIdentity)”:

这里延伸第二个知识点:IIdentity接口。

// 定义证件对象的基本功能。
public interface IIdentity{  
   //证件名称string Name { get; }    // 用于标识证件的载体类型。string AuthenticationType { get; }    //是否是合法的证件。bool IsAuthenticated { get; } }

所以我们的 ClaimsIdentity 最终看起来定义就是这样的了:

public class ClaimsIdentity : IIdentity{    //......}

ClaimsIdentity 介绍完毕,是不是发现也很简单,其他地方怎么翻译我不管,在本篇文章里面,它叫 “身份证”。

# 3: ClaimsPrincipal

有了身份证,我们就能证明我就是我了,有些时候一个人有很多张身份证,你猜这个人是干嘛的? 对,不是黄牛就是诈骗犯。

但是,有些时候一个人还有其他很多种身份,你猜这个人是干嘛的?这就很正常了对不对,比如你可以同时是一名教师,母亲,商人。如果你想证明你同时有这几种身份的时候,你可能需要出示教师证,你孩子的出生证,法人代表的营业执照证。

在程序中,一个身份证不仅仅代表你这个人了,而是代表一个身份,是证明你自己的主要身份哦。如果一个人还有其他很多种身份,这个时候就需要有一个东西(载体)来携带着这些证件了对吧?OK,我们给需要携带证件的这个对象取一个贴切点的名字,叫“证件当事人(ClaimsPrincipal)”吧。

以下是 Principal 这个单词在词典给出的解释,我用它你应该没意见吧:

principal  ['prɪnsəpl]  adj. 主要的;资本的n. 首长;校长;资本;当事人

这个时候可能有同学会问了,是不是应该叫ClaimsIdentityPrincipal比较好呢?嗯,我也觉得应该叫 ClaimsIdentityPrincipal 可能更好一点,或许微软的人偷懒了,简写成了ClaimsPrincipal

知道其功能后,代码就很好写了,和上面ClaimsIdentity一样的套路:

public class ClaimsPrincipal {   
   //把拥有的证件都给当事人public ClaimsPrincipal(IEnumerable<ClaimsIdentity> identities){}    //当事人的主身份呢public virtual IIdentity Identity { get; }    public virtual IEnumerable<ClaimsIdentity> Identities { get; }    public virtual void AddIdentity(ClaimsIdentity identity);    //为什么没有RemoveIdentity , 留给大家思考吧?}

当时人看起来也几乎完美了,但是我们还需要对其抽象一下,抽象哪些东西呢? 作为一个当事人,你应该有一个主身份吧,就是你的身份证咯,可能你还会用到角色(角色后面会详细介绍,这里你知道有这么个东西就行了)。

这里延伸第三个知识点:IPrincipal 接口。

public interface IPrincipal{   
   //身份IIdentity Identity { get; }    //在否属于某个角色bool IsInRole(string role); }

然后,我们的 证件当事人 看起来应该是这样的:

public class ClaimsPrincipal : IPrincipal {   //...}

ClaimsPrincipal 介绍完了,也很简单吧? 其他地方怎么翻译我不管,在本篇文章里面,它叫 “证件当事人”。

想在,我们已经知道了 “证件单元(Claims)” , “身份证(ClaimsIdentity)” , “证件当事人(ClaimsPrincipal)”,并且整理清楚了他们之间的逻辑关系,趁热打铁,下面这个图是一个identity登入部分的不完全示意图,虚线圈出来的部分应该可以看懂了吧:

可以看出,首先我们在app这边有一些证件单元,然后调用ClaimsIdentity把证件单元初始化为一个身份证,然后再把身份证交给证件当事人由其保管。

才把 Getting Started 写完,发现已经这么长了,所以打算写成一个系列了,可能3 - 4篇吧。

总结

好了,本篇就先介绍到这里,在本篇博客中,我们学会了几个英文单词,并且知道了这些英文单词在程序中是扮演这怎么样一个对象。并且根据图我们知道了这些对象在整个认证系统种处在怎么样一个位置。 我发现如果想把 identity 讲清楚仅仅靠这一篇博客是不够的,下一篇我们将对.NET Authentication中间件进行抽丝剥茧,直到掌握.NET的整个认证系统后,我们再来看一下 Identiy 到底和 Entity Framework 有着怎样的爱恨情仇。

相关文章: 

  • .NET Core中的认证管理解析

原文地址:http://www.cnblogs.com/savorboard/p/aspnetcore-identity.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯JAVA省赛2013-----B------2(马虎算式)

二、马虎的算式 【解析】&#xff1a;暴力穷举即可 枚举每个位上的数字、组合判断、暴力穷举 【答案】&#xff1a;142 方法一&#xff1a;暴力穷举 package com.kuang.Test; public class Test{public static void main(String[] args) {int ans 0;for(int a 1; a < …

简单解决“无法打开内核设备:\\Global\\vmx86”错误

简单解决“无法打开内核设备:\\Global\\vmx86”错误 本文链接&#xff1a;https://blog.csdn.net/tristan_tian/article/details/79434715 我是win10系统&#xff0c;在小娜搜索“服务”后右击选择使用管理员打开。然后在一大串服务中找到vm开头的服务项&#xff0c;全部都启…

按钮右对齐_Python Tkinter Button按钮

简介BUTTON小工具时使用的按钮添加到各种类型的Python应用&#xff0c;Python允许用户配置按钮的按我们的要求&#xff0c;各种选项可以被设置或重置的要求。BUTTON 小工具时使用的按钮添加到各种类型的Python应用。Python允许用户配置按钮的按我们的要求。各种选项可以被设置或…

Java 内存查看与分析

转载自 Java 内存查看与分析1&#xff1a;gc日志输出在jvm启动参数中加入 -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCTimestamps -XX:PrintGCApplicationStopedTime&#xff0c;jvm将会按照这些参数顺序输出gc概要信息&#xff0c;详细信息&#xff0c;gc时间信息&#xff…

【长文干货】浅析分布式系统

测试开发者的共同关注&#xff01; 作者&#xff1a;wadehan&#xff0c;腾讯后台开发高级工程师 商业转载请联系腾讯WeTest获得授权&#xff0c;非商业转载请注明出处。 WeTest导读 我们常常会听说&#xff0c;某个互联网应用的服务器端系统多么牛逼&#xff0c;比如QQ、微信、…

hibernate配置详情2(Dept.hbm.xml)

<?xml version"1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package"org.hibernate_on…

Spring Boot 入门 IDEA 版本 2小时学会springBoot 代码上传至gitee 或者github 事务没做出来

SpringBoot简化了xml的配置可以快速开发&#xff0c;节省很多的时间&#xff0c;springboot的配置速度更快&#xff0c;SpringMvc已经不如springboot了&#xff0c; 市面上更多的是使用spingboot这个框架了。 springboot是springmvc的升级版&#xff0c;但是2者没有必然的联…

华为云微认证答题_158人次通过华为认证考试!今年,湖北这所高校频现大动作...

从2005全国职教工作会上"校企合作"的提出&#xff0c;到2013年"产教融合"的最早出现&#xff0c;再到党的十九大&#xff0c;"产教融合、校企合作"已经逐渐成为教育新趋势。相信有许多家长和大学生都很想了解这种新的教育模式。本期推送&#xf…

在传统.NET Framework 上运行ASP.NET Core项目

新的项目我们想用ASP.NET Core来开发&#xff0c;但是苦于我们历史的遗产很多&#xff0c;比如《使用 JavaScriptService 在.NET Core 里实现DES加密算法》&#xff0c;我们要估计等到.NET Core 1.2我们才会有大部分的API&#xff0c;通过NodeJs方式有点曲线救国的味道&#xf…

JVM 调优系列之图解垃圾回收

转载自 JVM 调优系列之图解垃圾回收摘要: jvm必知系列&#xff0c;总结一些常见jvm回收机制&#xff0c;方便查阅从这篇开始我们开始探讨一些jvm调优的问题。在jvm调优中一个离不开的重点是垃圾回收&#xff0c;当垃圾回收成为系统达到更高并发量的瓶颈时&#xff0c;我们就需…

JAVA注解和反射(笔记)

注解简介 Annotation是从JDK5.0开始引入的新技术). Annotation的作用 : 不是程序本身(可以对程序作出解释.(这一点和注释(comment)没什么区别)可以被其他程序(比如:编译器等)读取. Annotation的格式: 注解是以"注释名"在代码中存在的, 还可以添加一些参数值,例如:S…

车提示检测轮胎气压_水淹车估价中心_辽宁中车检

首页 > 新闻中心发布时间&#xff1a;2021-01-02 00:57:13 导读&#xff1a;辽宁中车检为您提供水淹车估价中心的相关知识与详情&#xff1a;在行车过程中,汽车受到振动,可能会引起前照灯部件的安装位置发生变动,从而改变光束的正确照射方向.同时,灯泡在使用过程中会逐步老化…

.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

0x00 为什么需要Map&#xff08;MapWhen&#xff09;扩展 如果业务逻辑比较简单的话&#xff0c;一条主管道就够了&#xff0c;确实用不到Map。不过当业务逻辑比较复杂的时候&#xff0c;有时候我们可能希望根据情况的不同使用特殊的一组中间件来处理HttpContext。这种情况下如…

2小时学习Spring Boot 2019版本 代码一样推送至github上面去

简介&#xff1a;《2小时学习Spring Boot》后续进阶课程&#xff0c;主要讲述了Spring Boot针对Web方面的相关技巧 讲师实战课程《Spring Boot微信点餐系统》 http://coding.imooc.com/class/117.html 《Spring Cloud微服务实战》 http://coding.imooc.com/class/187.html 均已…

认识JVM--第一篇-对象分配&回收算法

转载自 认识JVM--第一篇-对象分配&回收算法本来标题党想写成《深入JVM》&#xff0c;不过不太敢写&#xff0c;我想一小篇博客我想还不足以说明JVM&#xff0c;在本文中&#xff0c;会就我所知给大家介绍JVM的很多内部知识&#xff0c;概念会相对较粗&#xff0c;因为太细…

JAVASE阶段流程图

转载于https://blog.csdn.net/czc514/article/details/106057366

hibernate配置详情3(Dept)

package org.hibernate_one.entity;import java.io.Serializable;/** 部门实体类* 符合javabean规范* 1.公共类* 2.具有公共的无参的构造方法* 3.私有属性* 4.getter setter方法* 5.实现序列化接口Serializable java.io*/public class Dept implements Serializable {//部门编…

学生上课睡觉班主任怎么处理_【师问师答】学生上课说话,点名批评还嘴怎么办?...

案例我是一个初二的英语老师&#xff0c;昨天上课一男生一直在说话。我点了他名字之后毫不畏惧&#xff0c;仍然接着说话。后来我让他站起来&#xff0c;他说他腰痛不能站。又继续和同桌说话&#xff0c;我火大啊&#xff0c;让他站出去说完了再进来。他就在座位上嘀嘀咕咕&…

.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

0x00 为什么要引入扩展方法 有的中间件功能比较简单&#xff0c;有的则比较复杂&#xff0c;并且依赖其它组件。除了直接用ApplicationBuilder的Use()方法注册中间件外&#xff0c;还可以使用ApplicationBuilder的扩展方法UseMiddleware()注册中间件。这种情况下可以注册类型&a…