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

  • 时间:
  • 浏览:2

现在,大家知道了一两个 多点

到此,授权过程就现在开始了了英文了,另外一些越多越多 我边边角角的知识点,比如授权前一天 何如操作,你你什儿 不能自己,就不再文中赘述了

另外,机会大家越多越多 我简单的为 Action依据打上[Authorize]标记,那么它的默认行为越多越多 我验证IsAuthenticated否是true,也越多越多 我在认证环节(Authentication 上方件)否是通过了认证

最后一步,更换那么 的Attribute:

在上一篇博客ASP.NET Core Identity 实战(3)认证过程中提到,在Authentication上方件中能不到放置多个Handler,而一两个 多是默认激活的,那么剩下的是被动调用的,现在大家的情况越多越多 我由大家在Authorize底部形态中去选着一两个 多Handler来执行,类事大家在Authentication上方件放入置一两个 多Handler——CookieAuthenticationHandler和JwtAuthenticationHandler,并经CookieAuthenticationHandler指定为默认,那么大家想经由Jwt认证时缘何办?

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

在企业应用中最为常见的越多越多 我基于角色的授权,实现角色授权的依据有三种,三种是直接写在Authorize底部形态上:

指定AuthenticationScheme的代码类事那么 :

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

本文中的示例较为简单,也并那么使用完整的授权底部形态,更完整的使用依据参考资料越多越多 ,本文也就越多做介绍。

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

在前一天 的文章里,大家有提到认证和授权是一两个 多分开的过程,为什么我么我让认证过程不属于Identity。同样授权过程越多越多 我属于Identity,授权过程放入去Identity系列中将的意味和认证过程一样——和成员系统放入去一齐容易理解。

机会指定了scheme,那么重新认证,机会那么,则使用前一天 Authentication上方件的授权结果:

不过你你什儿 依据,不推荐,机会那么 话语大家就将“角色”和“Uri”的绑定“硬编码在代码里了”,在越多越多 场景这显然不相当于,越多越多 接下来大家要介绍的基于策略的授权就允许大家自定义授权逻辑,那么 就灵活多了

为什么我么我让大家来实现RoleRequirement对应的处置守护进程:

这篇文章大家将一齐来学习 Asp.Net Core 中的(注:那么 描述不准确,稍后我能 明白)授权过程

那么 们的 RoleRequirement 主要实现的功能越多越多 我选着要含晒 的角色,机会要含晒 的角色是在构造函数中选着的,那么大家就将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

在弄清的是授权过程在哪里存在的前一天 ,大家先来动手写一写授权的代码,机会了解策略授权,那么我能 快速浏览过这每项

你你什儿 处置器的工作十分简单越多越多 我验证当前用户否是在任意一两个 多由RoleRequirement指定的角色中。在这里context.Succeed(requirement);指示授权成功,而授权失败一般不都要调用 context.Fail();机会对于你你什儿 需求还机会有其它处置器进行处置,而此例中调用 context.Fail();能不到确保授权失败,机会RoleRequirement的处置器只一两个 多,越多越多 那么 做是那么问題的。

这上方和大家在项目中写的代码有关越多越多 我IAuthorizeHandler的实例,在本文中,大家写了一两个 多RoleHandler

这上方值得再次深入探讨的是 context.AuthenticateAsync(scheme),这是在 HttpAbstractions项目中的扩展依据,它的实现是:

还记的HttpContext中一两个 多扩展依据叫AuthenticateAsync,作为HttpContext的扩展依据也就意味,大家能不到在任何前一天 调用它进行认证操作。

这里一两个 多重要问題越多越多 我:当HttpContext流过Authentication上方件后才到Mvc上方件,而Mvc在确认Action指定的AuthenticationHandler时,Authentication过程机会现在开始了了英文了

打开前一天 创建的项目,加在一两个 多名为Demo的控制器,控制器代码如下:

大家为该策略指定了一两个 多名字role-policy,为什么我么我让指定了你你什儿 策略的需求条件,需求条件主越多越多 我为了设置策略的初始值,大家能不到在策略注册时更改需求条件从而灵活控制授权。

很显然,总要 Authorize底部形态拦截了请求,底部形态越多越多 我标记了你你什儿 依据都要被授权可否访问,而真正拦截了请求的是——“Mvc 上方件”。Action是由Mvc执行的,Mvc执行总要确认Action上的Authorize底部形态,来选着否是要进行授权操作(成功授权能不到访问,失败了会被阻止(比如跳转到登陆)),以及何如授权(动物园例子中,第两个门卫根据切实的情况决定),也越多越多 我自定义授权(角色等等)。

机会RoleHandler暂且清楚要求用户有你你什儿 角色,RoleHandler只知道何如去验证用户含晒 你你什儿 角色,而具体要求用户含晒 你你什儿 角色,是由 RoleRequirement 来决定的,这符合关注点分离和单一职责你你什儿 两个 多编程概念。

那这是缘何做到的呢?

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

为什么我么我让退出登录,再次访问/api/demo,那么机会跳转到登陆页面,在你你什儿 过程中Authorize底部形态起到了至关重要的作用,接下来加在Authorize底部形态,重复上一两个 多操作,未登录的结果将是:

通过你你什儿 两个 多小例子,大家很容易就能推断出Authorize底部形态拦截了那么登陆的用户,等等,是Authorize底部形态拦截了请求吗?

大家假设大家的授权规则是要求和上方代码片段实现相同效果,即用户具有角色“admin”机会角色“super-admin”,大家来逐步实现你你什儿 目标:

要注意的是前一天 提到的,大家机会将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

看它的第两个重载,它是指定了 AuthenticationScheme的名字的,越多越多 在Mvc上方件探查到Attribute指定了AuthenticationScheme时,就会重新选着指定的AuthenticationHandler再次对请求进行认证

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

再为什么我么我让,大家要将前一天 写好的RoleHandler注册进Di

接下来大家来编写 RoleRequirement

用前一天 注册的账户登录系统,

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

授权总共分三步

正如你你什儿 节的标题,授权存在在Microsoft.AspNetCore.Mvc.Authorization.AuthorizationFilter中,授权的逻辑类事那么 :