ASP.NET Core Identity 实战(4)授权过程

  • 时间:
  • 浏览:2
  • 来源:彩神大发11选5_神彩大发11选5官方

在上一篇博客ASP.NET Core Identity 实战(3)认证过程中提到,在Authentication后面 件中后能 放置多个Handler,而有一一四个 是默认激活的,很难 剩下的是被动调用的,现在大家的情况汇报全都由大家在Authorize底部形态中去选用一一四个 Handler来执行,例如大家在Authentication后面 件贴到 置一一四个 Handler——CookieAuthenticationHandler和JwtAuthenticationHandler,并经CookieAuthenticationHandler指定为默认,很难 大家想经由Jwt认证时为什么会么会办?

本文中的示例较为简单,也并很难 使用完正的授权底部形态,更完正的使用土办法参考资料全都,本文也就不要 做介绍。

另外让我参考ASP.NET Core中基于策略的授权来学习更过关于策略授权的内容

大家假设大家的授权规则是要求和后面 代码片段实现相同效果,即用户具有角色“admin”不可能 角色“super-admin”,大家来逐步实现这人 目标:

某些退出登录,再次访问/api/demo,很难 不可能 跳转到登陆页面,在这人 过程中Authorize底部形态起到了至关重要的作用,接下来加进Authorize底部形态,重复上一一四个 操作,未登录的结果将是:

再某些,大家要将完后 写好的RoleHandler注册进Di

那这是为什么会么会做到的呢?

另外,不可能 大家全都简单的为 Action土办法打上[Authorize]标记,很难 它的默认行为全都验证IsAuthenticated是是否是true,也全都在认证环节(Authentication 后面 件)是是否是通过了认证

在弄清的是授权过程在哪里占据 的完后 ,大家先来动手写一写授权的代码,不可能 了解策略授权,很难 让我快速浏览过这每项

最后一步,更换从前的Attribute:

这每项代码还是很简单的:

很显然,总要Authorize底部形态拦截了请求,底部形态全都标记了这人 土办法须要被授权后能 访问,而真正拦截了请求的是——“Mvc 后面 件”。Action是由Mvc执行的,Mvc执行总要确认Action上的Authorize底部形态,来选用是是否是要进行授权操作(成功授权后能 访问,失败了会被阻止(比如跳转到登陆)),以及咋样授权(动物园例子中,第一四个门卫根据切实的情况汇报决定),也全都自定义授权(角色等等)。

正如这人 节的标题,授权占据 在Microsoft.AspNetCore.Mvc.Authorization.AuthorizationFilter中,授权的逻辑例如从前:

大家为该策略指定了一一四个 名字role-policy,某些指定了这人 策略的需求条件,需求条件主全都为了设置策略的初始值,大家后能 在策略注册时更改需求条件从而灵活控制授权。

这里有一一四个 重要疑问全都:当HttpContext流过Authentication后面 件后才到Mvc后面 件,而Mvc在确认Action指定的AuthenticationHandler时,Authentication过程不可能 结束英语 了

这后面 和大家在项目中写的代码有关全都IAuthorizeHandler的实例,在本文中,大家写了一一四个 RoleHandler

这篇文章大家将共同来学习 Asp.Net Core 中的(注:从前描述不准确,稍后让我明白)授权过程

这后面 值得再次深入探讨的是 context.AuthenticateAsync(scheme),这是在 HttpAbstractions项目中的扩展土办法,它的实现是:

还记的HttpContext带有一一四个 扩展土办法叫AuthenticateAsync,作为HttpContext的扩展土办法也就原因分析 ,大家后能 在任何完后 调用它进行认证操作。

IAuthenticationService大家在 Authentication后面 件中也见过,Authentication后面 件也是使用了IAuthenticationService,完后 的文章有提到过,这也再次证明了单一原则职责,身份认证后面 件负责在管道中认证,而认证两种好的反义词是和身份认证后面 件捆绑的,上一篇博客ASP.NET Core Identity 实战(3)认证过程的最后有认证的源代码

打开完后 创建的项目,加进一一四个 名为Demo的控制器,控制器代码如下:

不可能 RoleHandler好的反义词清楚要求用户有什么角色,RoleHandler只知道咋样去验证用户带有什么角色,而具体要求用户带有什么角色,是由 RoleRequirement 来决定的,这符合关注点分离和单一职责这人 个编程概念。

不可能 指定了scheme,很难 重新认证,不可能 很难 ,则使用完后 Authentication后面 件的授权结果:

现在,大家知道了一一四个 点

到此,授权过程就结束英语 了,另外某些全都边边角角的知识点,比如授权完后 咋样操作,什么很难,就不再文中赘述了

在完后 的文章里,大家有提到认证和授权是一一四个 分开的过程,某些认证过程不属于Identity。同样授权过程全都属于Identity,授权过程装进Identity系列中将的原因分析 和认证过程一样——和成员系统装进共同容易理解。

从前们的 RoleRequirement 主要实现的功能全都选用要带有的角色,不可能 要带有的角色是在构造函数中选用的,很难 大家就将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

用完后 注册的账户登录系统,

访问/api/demo,你将得到如下结果:

通过这人 个小例子,大家很容易就能推断出Authorize底部形态拦截了很难 登陆的用户,等等,是Authorize底部形态拦截了请求吗?

在企业应用中最为常见的全都基于角色的授权,实现角色授权的土办法有两种,两种是直接写在Authorize底部形态上:

这人 除理器的工作十分简单全都验证当前用户是是否是在任意一一四个 由RoleRequirement指定的角色中。在这里context.Succeed(requirement);指示授权成功,而授权失败一般不须要调用 context.Fail();不可能 对于这人 需求还不可能 有其它除理器进行除理,而此例中调用 context.Fail();后能 确保授权失败,不可能 RoleRequirement的除理器后能 后能 一一四个 ,全都从前做是很难 疑问的。

授权总共分三步

在旧的Asp.Net时代,大家知道MvcFilter这人 东西,现在它仍然在,不可能 你不了解它,我建议你稍作了解,建议参考官方文档

看它的第一四个重载,它是指定了 AuthenticationScheme的名字的,全都在Mvc后面 件探查到Attribute指定了AuthenticationScheme时,就会重新选用指定的AuthenticationHandler再次对请求进行认证

现在,一一四个 最基本的基于策略的授权就完成了。

不过这人 土办法,不推荐,不可能 从前一段话大家就将“角色”和“Uri”的绑定“硬编码在代码里了”,在全都场景这显然不要 花费,全都接下来大家要介绍的基于策略的授权就允许大家自定义授权逻辑,从前就灵活多了

某些大家来实现RoleRequirement对应的除理多线程 :

要注意的是完后 提到的,大家不可能 将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

接下来大家来编写 RoleRequirement

指定AuthenticationScheme的代码例如从前: