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

  • 时间:
  • 浏览:0
  • 来源:5分快乐8_5分快乐8官网

指定AuthenticationScheme的代码相似日后:

还记的HttpContext带有二个 多多 扩展土办法叫AuthenticateAsync,作为HttpContext的扩展土办法也就原应,亲戚亲戚当当你们 歌词 能不到在任何日后调用它进行认证操作。

这篇文章亲戚亲戚当当你们 歌词 将一块儿来学习 Asp.Net Core 中的(注:日后描述不准确,稍后已经 明白)授权过程

在日后的文章里,亲戚亲戚当当你们 歌词 有提到认证和授权是二个 多多 分开的过程,已经 认证过程不属于Identity。同样授权过程要是属于Identity,授权过程倒进Identity系列中将的原应和认证过程一样——和成员系统倒进一块儿容易理解。

很显然,有的是Authorize形态学 拦截了请求,形态学 要是标记了你你这一土办法须要被授权也能访问,而真正拦截了请求的是——“Mvc 上方件”。Action是由Mvc执行的,Mvc执行一定会确认Action上的Authorize形态学 ,来选者是是否要进行授权操作(成功授权能不到访问,失败了会被阻止(比如跳转到登陆)),以及怎么上能授权(动物园例子中,第十个 门卫根据切实的状态决定),也要是自定义授权(角色等等)。

原应指定了scheme,那末重新认证,原应那末,则使用日后 Authentication上方件的授权结果:

正如你你这一节的标题,授权地处在Microsoft.AspNetCore.Mvc.Authorization.AuthorizationFilter中,授权的逻辑相似日后:

不过你你这一土办法,不推荐,原应日后说说亲戚亲戚当当你们 歌词 就将“角色”和“Uri”的绑定“硬编码在代码里了”,在要是场景这显然越多花费,要是接下来亲戚亲戚当当你们 歌词 要介绍的基于策略的授权就允许亲戚亲戚当当你们 歌词 自定义授权逻辑,日后就灵活多了

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

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

这里有二个 多多 重要间题要是:当HttpContext流过Authentication上方件后才到Mvc上方件,而Mvc在确认Action指定的AuthenticationHandler时,Authentication过程原应开始 了

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

接下来亲戚亲戚当当你们 歌词 来编写 RoleRequirement

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

在弄清的是授权过程在哪里地处的日后,亲戚亲戚当当你们 歌词 先来动手写一写授权的代码,原应了解策略授权,那末已经 快速浏览过这部分

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

这上方和亲戚亲戚当当你们 歌词 在项目中写的代码有关要是IAuthorizeHandler的实例,在本文中,亲戚亲戚当当你们 歌词 写了二个 多多 RoleHandler

要注意的是日后提到的,亲戚亲戚当当你们 歌词 原应将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

已经 退出登录,再次访问/api/demo,那末原应跳转到登陆页面,在你你这一过程中Authorize形态学 起到了至关重要的作用,接下来加在Authorize形态学 ,重复上二个 多多 操作,未登录的结果将是:

在旧的Asp.Net时代,亲戚亲戚当当你们 歌词 知道MvcFilter你你这一东西,现在它仍然在,原应你不了解它,我建议你稍作了解,建议参考官方文档

在上一篇博客ASP.NET Core Identity 实战(3)认证过程中提到,在Authentication上方件中能不到放置多个Handler,而有二个 多多 是默认激活的,那末剩下的是被动调用的,现在亲戚亲戚当当你们 歌词 的状态要是由亲戚亲戚当当你们 歌词 在Authorize形态学 中去选者二个 多多 Handler来执行,相似亲戚亲戚当当你们 歌词 在Authentication上方件放到置二个 多多 Handler——CookieAuthenticationHandler和JwtAuthenticationHandler,并经CookieAuthenticationHandler指定为默认,那末亲戚亲戚当当你们 歌词 想经由Jwt认证时咋整 办?

另外,原应亲戚亲戚当当你们 歌词 要是简单的为 Action土办法打上[Authorize]标记,那末它的默认行为要是验证IsAuthenticated是是否true,也要是在认证环节(Authentication 上方件)是是否通过了认证

原应RoleHandler不不清楚要求用户有那此角色,RoleHandler只知道怎么上能去验证用户带有那此角色,而具体要求用户带有那此角色,是由 RoleRequirement 来决定的,这符合关注点分离和单一职责你这一个多多 编程概念。

你你这一除理器的工作十分简单要是验证当前用户是是否在任意二个 多多 由RoleRequirement指定的角色中。在这里context.Succeed(requirement);指示授权成功,而授权失败一般不须要调用 context.Fail();原应对于你你这一需求还原应有其它除理器进行除理,而此例中调用 context.Fail();能不到确保授权失败,原应RoleRequirement的除理器不到二个 多多 ,要是日后做是那末间题的。

授权总共分三步

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

亲戚亲戚当当你们 歌词 为该策略指定了二个 多多 名字role-policy,已经 指定了你你这一策略的需求条件,需求条件主要是为了设置策略的初始值,亲戚亲戚当当你们 歌词 能不到在策略注册时更改需求条件从而灵活控制授权。

打开日后创建的项目,加在二个 多多 名为Demo的控制器,控制器代码如下:

那这是咋整 做到的呢?

现在,亲戚亲戚当当你们 歌词 知道了二个 多多 点

已经 亲戚亲戚当当你们 歌词 来实现RoleRequirement对应的除理线程:

再已经 ,亲戚亲戚当当你们 歌词 要将日后写好的RoleHandler注册进Di

最后一步,更换日后的Attribute:

亲戚亲戚当当你们 歌词 假设亲戚亲戚当当你们 歌词 的授权规则是要求和上方代码片段实现相同效果,即用户具有角色“admin”原应角色“super-admin”,亲戚亲戚当当你们 歌词 来逐步实现你你这一目标:

通过你这一个多多 小例子,亲戚亲戚当当你们 歌词 很容易就能推断出Authorize形态学 拦截了那末登陆的用户,等等,是Authorize形态学 拦截了请求吗?

到此,授权过程就开始 了,另外已经 要是边边角角的知识点,比如授权日后怎么上能操作,那此那末,就不再文中赘述了

本文中的示例较为简单,也并那末使用全部的授权形态学 ,更全部的使用土办法参考资料要是,本文也就越多做介绍。

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

那亲戚亲戚当当你们 歌词 的 RoleRequirement 主要实现的功能要是选者要带有的角色,原应要带有的角色是在构造函数中选者的,那末亲戚亲戚当当你们 歌词 就将角色授权的逻辑(稍后介绍的Handler)和具体授权的数据分开了。

这部分代码还是很简单的:

IAuthenticationService亲戚亲戚当当你们 歌词 在 Authentication上方件中也见过,Authentication上方件也是使用了IAuthenticationService,日后的文章有提到过,这也再次证明了单一原则职责,身份认证上方件负责在管道中认证,而认证四种 不是否和身份认证上方件捆绑的,上一篇博客ASP.NET Core Identity 实战(3)认证过程的最后有认证的源代码