网站如何经过身份验证_ASP.NET核心身份验证简介

身份验证和授权之间的区别

首先,我们应该澄清这两个安全依赖方面的区别。简单的答案是,身份验证是确定您的身份的过程,而授权则围绕您可以做的事情,即权限。显然,在您确定允许用户执行操作之前,您需要知道他们是谁,因此在需要授权时,您还必须首先以某种方式对用户进行身份验证。

ASP.NET Core中的身份验证

与ASP.NET身份相关的基本属性在ASP.NET Core中并没有真正改变 - 虽然它们不同,但它们应该是ASP.NET开发人员所熟悉的。例如,在ASP.NET 4.x中,有一个名为Useron 的属性HttpContext,它是一个类型IPrincipal,表示请求的当前用户。在ASP.NET核心有一个类似的属性命名User,区别在于这种属性的类型的ClaimsPrincipal,它实现了IPrincipal。

ClaimsPrincipal与ASP.NET 4.x相比,使用此举突出了ASP.NET Core中身份验证工作方式的根本转变。以前,授权通常是基于角色的,因此用户可能属于一个或多个角色,并且应用的不同部分可能要求用户具有特定角色才能访问它。在ASP.NET Core中,仍然可以使用这种基于角色的授权,但这主要是出于向后兼容的原因。他们真正希望您采取的路线是基于声明的身份验证。

基于声明的身份验证

基于声明的身份验证的概念在您第一次使用时可能会有点混乱,但在实践中它可能与您已经使用的方法非常相似。您可以将声明视为对特定身份的声明或属性。该语句由名称和值组成。例如,您可以提出DateOfBirth索赔,FirstName索赔,EmailAddress索赔或IsVIP索赔。请注意,这些陈述是关于身份什么或谁,而不是他们可以做什么

身份本身代表一个单一的声明,可能有许多与之相关的声明。例如,考虑驾驶执照。这是一个包含了一些索赔的单一身份- ,FirstName,,LastName 和你被允许驾驶哪些车辆。您的护照与另一套索赔的身份不同。DateOfBirthAddress

因此,让我们在ASP.NET Core的上下文中看一下。ASP.NET Core中的身份是一个ClaimsIdentity。该类的简化版本可能如下所示(实际的类更大!):

public class ClaimsIdentity: IIdentity{ public string AuthenticationType { get; } public bool IsAuthenticated { get; } public IEnumerable Claims { get; } public Claim FindFirst(string type) { /*...*/ } public Claim HasClaim(string type, string value) { /*...*/ }}

我已经在本大纲中展示了主要属性,包括Claims与身份相关的所有声明。有许多实用方法可供使用,其中Claims两个我在这里展示。这些在您获得授权时非常有用,并且您正在尝试确定特定身份是否具有Claim您感兴趣的给定身份。

该AuthenticationType物业相当不言自明。在我们以前实际的例子,这可能是字符串Passport或DriversLicense,但在ASP.NET它更可能是Cookies,Bearer或Google等,这是仅仅是被用来验证用户,并确定与身份相关的索赔的方法。

最后,该属性IsAuthenticated指示身份是否经过身份验证。这似乎是多余的 - 如果未经过身份验证,您怎么能拥有声明的身份?一种情况可能是您允许访问您网站的访客用户,例如购物车。您仍然拥有与该用户关联的身份,并且该身份可能仍然具有与其关联的声明,但它们将不会被身份验证。这是一个要记住的重要区别。

作为一个辅助,在ASP.NET Core中,如果你在构造函数中创建ClaimsIdentity并提供一个AuthenticationType,那么IsAuthenticated它将永远是真的。因此,经过身份验证的用户必须始终拥有AuthenticationType,并且相反,您不能拥有具有的未经身份验证的用户AuthenticationType。

多重身份

希望在这一点上,您可以对索赔及其与身份的关系进行概念性处理。我在本节开头说过,User属性HttpContext是a ClaimsPrincipal,而不是a ClaimsIdentity,所以让我们来看看它的简化版本:

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

从这个课程中取得的重点是有一个Identities属性可以返回IEnumerable。所以单个ClaimsPrincipal可以由多个组成Identities。Identity为了实现IPrincipal接口,还有一个属性- 在.NET Core中它只选择第一个标识Identities。

回到我们之前的护照和驾驶执照的例子,多个身份确实有意义 - 这些文件都是身份的形式,每个都包含许多声明。在这种情况下,是委托人,并且您有两种形式的身份。当你拥有这两个身份时,你作为校长继承了你所有身份的所有要求。

考虑另一个实际例子 - 你正在乘飞机。首先,你将在预订台被要求证明您对您的权利要求书FirstName和LastName等幸运的是,你还记得你的护照,这是验证这些说法,因此你收到您的登机牌一个身份,你是在用自己的方式下一步。

在保安时,您需要证明您在航班上预订的说法。这次你需要你携带的其他形式的身份证明,即有FlightNumber索赔的登机牌,这样你就可以继续前进了。

最后,一旦您通过保安,您将前往贵宾休息室,并被要求通过VIP Number索赔证明您的VIP身份。这可以是VIP卡的形式,这将是另一种形式的身份,并将验证所要求的索赔。如果您没有卡,则无法提出请求的索赔,您将被拒绝访问,因此将被要求离开并停止制作场景。

30b06921c7d32115d7b5224340ccb4d5.png

同样,这里的关键点是主体可以具有多个身份,这些身份可以具有多个声明,并且ClaimsPrincipal继承其所有声明Identities。

如前所述,基于角色的授权主要是出于向后兼容性原因,因此IsInRole如果您遵循ASP.NET Core中强调的基于声明的身份验证,则通常不需要该方法。在引擎盖下,这也是使用声明实现的,其中声明类型默认为RoleClaimType,或ClaimType.Role。

再次考虑ASP.NET Core,可以使用多个身份和声明来保护应用程序的不同部分,就像在机场一样。例如,您可以使用用户名和密码登录,并根据与之关联的身份授予一组声明,这样您就可以浏览该站点。但是,假设您的应用中有一个特别敏感的部分,您希望进一步保护。这可能要求您提供其他身份以及其他相关声明,例如使用双因素身份验证或要求您重新输入密码。这将允许当前原则具有多个身份,并承担所有提供的身份的声明。

创建一个新的主体

那么现在我们已经看到了Principor如何在ASP.NET Core中工作,我们将如何实际创建一个呢?一个简单的示例,例如您可能在正常网页登录中看到的可能包含类似于以下内容的代码

public async Task Login(string returnUrl = null){ const string Issuer = "https://gov.uk"; var claims = new List { new Claim(ClaimTypes.Name, "Andrew
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值