当前位置: 移动技术网 > IT编程>开发语言>.net > 用例子看ASP.NET Core Identity是什么?

用例子看ASP.NET Core Identity是什么?

2019年03月13日  | 移动技术网IT编程  | 我要评论

绝心虐恋,神兵玄奇漫画,台儿庄战役简介

@

前言

有三个重要的类claim, claimsidentity, claimsprincipal,我们以一个持有合法证件的学生bob做比方,claimsprincipal就是持有证件的学生bob,claimsidentity就是学生bob的证件驾照,claim就是bob驾照中的各种信息。
下边就开始围绕上边这段话展开描述:

基于声明的认证(claims-based authentication)

在开始学习标识管理系统(identity system)之前,很有必要搞清楚什么是基于声明的身份认证。
我们假设一个场景。bob是一名大学生,准备去银行为自己开户。银行工作人员需要bob提供他的有效证件,于是bob就把自己的驾照提供给了银行工作人员。银行工作人员可以从驾照上获取到bob的个人信息,例如姓名、出生日期和地址等。
bob希望能够享受到银行针对大学生的优惠政策,于是银行工作人员又请bob提供了学生证,同时从上边可以获取到姓名、所在的大学名称、院系以及学号等信息。(这里提供别人的学生证一定是不行的!)
使用以上生活中典型的应用场景,可以帮助我们进一步去理解基于声明(claims-based authentication)的身份认证。这个例子中bob拥有两个标识(identity,就相当于有效的身份证明,即证明你是你的那张纸,也就是identity):驾照+学生证。(当然还可以提供更多的identity,比如护照、户口本等等。)
好吧,我自己用文字越写越怕不明白,通过上边的这些文字,只需要清楚这么几点内容:

claim

  • 就是一个键值对,例如:name:bob
  • claim可以是姓名、出身日期、地址、所在大学、学号等等信息

    identity

  • 很多条claim组成了一个identity
  • identity就是一个有效的身份证明 = 证明你是你的那张纸 = 驾照、学生证等等
  • 一个人可以拥有很多个identity

在这里插入图片描述
bob去开户,先提供了一个identity(这里就是驾照),接着又提供了一个identity(学生证)

清楚了这些,我们继续看

在asp.net core identity中是如何实现的

asp.net core 是开源的,这能够让我们非常方便的去学习和理解它是如何构成并运行的。源码可以。
可以把源码下载下来,然后查看源码,路径为:
corefx-master(解压后主文件夹)/src/system.security.claims/src/system/security
在这里插入图片描述

类claimsprincipal

一个用户(user)被声明成claimsprincipal类型(继承自iprincipal接口)。claimsprincipal类来自system.security.claims命名空间。

public class claimsprincipal : iprincipal
{
    ...........
    ...........
    public virtual iidentity identity { get; }
    public virtual ienumerable<claimsidentity> identities { get; }
    public virtual ienumerable<claim> claims { get; }
    ...........
    ...........
    public virtual bool hasclaim(predicate<claim> match);
    public virtual bool hasclaim(string type, string value);
    public virtual bool isinrole(string role);
    ...........
    ...........
}

从claimsprincipal类中可以看到有一个返回类型为claimsidentity集合的identities属性,代表着一个user可以拥有多个identity。
在这里的另外一个属性identity,不要被迷惑,他返回的是claimsprincipal中主要的(如果有多个)那一个claimidentity。
另外一个重要的属性claims,它返回了一个在claimsprincipal中所有的claimsidentity所包含得全部claims的集合。

考察另外一个重要的类claimsidentity

在这里还是要再次明确一下:

  • claim就是一个键值对,用来描述一个特新,比如姓名:bob就是一个claim,生日:2009.9.15这也是一个claim。其中姓名或生日就是这个claim的一种类型,即claimtype。
  • 一组claim就构成了一个identity,具有这些claims的identity就是 claimsidentity ,也可以把claimsidentity理解为“证件”,驾照就是一种claimsidentity,学生证也是一种claimidentity。
  • claimsidentity的持有者就是claimsprincipal ,一个claimsprincipal可以持有多个claimsidentity,就比如bob既持有驾照(claimidentity),又持有身份证(claimidentity)。
    理解了claim, claimsidentity, claimsprincipal这三个概念,就能理解生成登录cookie为什么要用下面的代码?
...
var claimsidentity = new claimsidentity(new claim[] { new claim(claimtypes.name, loginname) }, "basic");
var claimsprincipal = new claimsprincipal(claimsidentity);
await context.authentication.signinasync(_cookieauthoptions.authenticationscheme, claimsprincipal);
...

要用cookie代表一个通过验证的主体,必须包含claim, claimsidentity, claimsprincipal这三个信息,以一个持有合法驾照的人做比方,claimsprincipal就是持有证件的人bob,claimsidentity就是证件驾照,"basic"就是证件类型(这里假设是驾照),claim就是驾照中的信息。
如果感觉困扰,可以再看下
这篇教程中,语言啰嗦之处还请见谅指证,因为自己在理解的时候花了不少时间,就怕解释不清说不清!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网