翻译--Introduction to Authentication with ASP.NET Core

原文:https://andrewlock.net/introduction-to-authentication-with-asp-net-core/#authentication-in-asp-net-core

这是第一次用一系列的文章研究认证和授权在ASP.NET Core中的应用。在文中,我将简单说下认证以及身份验证在ASP.NET Core是如何工作的。

认证和授权之间的区别

       首先,我们需要分清楚这两个在安全认证方面的区别。简单的说认证是一个确定你是谁(什么角色)的过程,与此同时授权主要是围绕着允许你操作什么,即权限。显而易见,在你决定一个用户允许干什么事情的之前,你必须知道他们是谁,所以这个时候就需要授权操作了,你也需要通过一些途径对用户进行认证。

ASP.NET Core中的认证机制

         在ASP.NET Core中,关于身份验证的基本属性没有太大的改变----即使他们有所不同,一般对于ASP.NET开发者来说他们是有相似之处的。例如,在ASP.NET 4.X中,在HttpContext中有个属性User,类型为IPrincipal,表示一个请求中的当前用户。而在ASP.NET Core 也有个类似的属性User。不同之处在于ASP.NET Core 中的User属性类型为ClaimsPrincipal,是实现于IPrincipal。

      相比较于ASP.NET 4.x,ASP.NET Core使用ClaimsPrincipal的举动在一定程度上强调了认证机制的处理模式发生了根本性的转变。在ASP.NET 4.x中,认证机制一般是基于角色(Role-based),所以一个用户可能拥有一个或者多个角色。同时你的应用程序的不同模块可能需要用户拥有一个特殊的角色才能进入操作它。在ASP.NET Core 中基于角色授权的形式依然可以使用,但是这主要是为了版本向后兼容的原因。开发者们的主要目的还是希望你们使用基于声明的身份认证方式(claims-based)。

基于声明的身份认证

      Claims-based authentication的概念对于第一次接触它的人来说可能有点丈二和尚,但是在实际的项目经验中你可能已经使用过与它类似的身份验证方式。你可以认为Claims 是对被验证主体特征的一种表述或者是一种特定身份验证的属性。这种表述包含了name 和value。举个例子,你的出生日期是个claim,姓氏也是个claim,邮箱地址是个claim或者是否是VIP是个claim。记录这些声明都是关于什么或者想要验证谁的身份是什么,又或者他们能做什么。

      身份验证本身是许多的声明(claims)关联在一起的单一的表示。比如一个驾驶证件,这个身份验证包含了许多的claims—FirstName,LastName,DateOfBirth,Address,以及哪种类型的车是允许你驾驶。你的护照也是一种拥有不用的claims的身份验证。

      所以贯穿整个ASP.NET Core,身份验证就是CliamsIdentity(声明的验证)。该类的一个简单的示例版本可能就类似于这样(该类事实上是很大很复杂的)

 

public class ClaimsIdentity: IIdentity

{

    public string AuthenticationType { get; }

    public bool IsAuthenticated { get; }

    public IEnumerable<Claim> Claims { get; }

 

    public Claim FindFirst(string type) { /*...*/ }

    public Claim HasClaim(string type, string value) { /*...*/ }

}

      在上面的展示的是主要的属性,包含了与身份验证(identity)有关联的所有Claims。

      这里还有一些很有用的方法在使用claims的时候,其中有两个我已经在上面的代码中展示出来了。它们在你即将使用授权认证(Authorisation)的时候是非常有用的,同时你是否已经有兴趣给Claim一些特别的身份验证了。

      AuthenticationType的功能是显而易见的。在之前的案例中,它可能是护照或者驾驶证,但是在ASP.NET中它更类似于Cookie、Bearer或是Google等等 ,它的作用就是被用来验证用户的同时判定claims中关联的身份信息。

      最后,IsAuthenticated表示是否需要进行身份验证。这看起来很多余—当不需要身份验证的时候怎么样使你的验证中带有声明信息?一个脚本在你的网站是允许用户执行等。例如购物车案例中,你依然需要用户带有身份验证的信息,而且身份验证中依然要附带着用户信息的多种声明,但是它们并不会参与身份认证。这是非常重要的需要我们深刻记住。

      补充一点,ASP.NET Core 中如果你在构造函数中创建了一个ClaimsIdentity 和AuthenticationType,IsAuthenticated将默认为true。所以身份认证的用户一定是有AuthenticationType属性。反过来说,不存在不需要身份验证的用户却拥有AuthenticationType属性。

      多重身份验证

                  希望在这个模块中你能在概念上理解claims以及他们之间的和identity之间的关联。在文章开始模块中我已经说过HttpContext中User 的属性是ClaimsPrincipal不是ClaimsIdentity。让我们看看简单的示例:

public class ClaimsPrincipal :IPrincipal
{
    public IIdentity Identity { get; }
    public IEnumerable<ClaimsIdentity> Identities { get; }
    public IEnumerable<Claim> Claims { get; }
 
    public bool IsInRole(string role) { /*...*/ }
    public Claim FindFirst(string type) { /*...*/ }
    public Claim HasClaim(string type, string value) { /*...*/ }
}

从该类中我们能够看到重要的一点是Identities返回的是IEnumerable<Claim>,说明了一个ClaimsPrincipal是由多个Identities组成的。该类中依然有Identity属性,是为了实现IPrincipal接口—在.Net Core的Identities中仅仅只会选择第一个identity。

      回到之前关于护照和驾驶证的例子中,多重身份验证实际中还是很有意义的—这些文档均拥有两个身份形式,每一个身份都包含了一些claims。在案例中你就是证件持有者,你有两种身份。 当你拥有这两种身份验证信息的所有权之后,你作为拥有者将获取所有验证验证(Identities)信息的claims.

      考虑到另外一种情况—乘飞机。首先在订票处你将被问道证明你的这些信息比如你的姓和你的名字等等。幸运的是你记得护照上的身份验证的诸多信息,所以你将被允许订购机票,接下来你将进入下一步。

......待续

第一次翻译,翻译的不是很好,多指教

上一篇:2021-01-26 TODO


下一篇:Introduction to Fabric.js. Part 1.(介绍Fabric.js第一部分)