Asp.Net Core中的帐户角色框架(4)

前几篇总结了Identity和Authentication这两块,最终结果是可以获得当前用户的身份证信息,匿名也算一种。

但系统里哪些地方允许匿名访问,哪些需要一定的权限,则是在Authorization这一块实现。

权限控制,基本上可以分为:

  1. 完全不需要任何权限,匿名即可访问
  2. 需要是系统用户,有身份证即可
  3. 是系统用户,有身份证,但还需要其他因素才可以访问

这个其他因素,可以是Role(基于角色)、身份证上一些关键因素(基于声明)、相关规则组合(基于策略)、临时审批。

在Program.cs中启用UseAuthorization的时候,它将开始执行:

1、AuthorizationMiddleware类中的Invoke方法

在这个方法中,会先获取如下三块数据:

  1. IAuthorizeData,这个对应的实现就有AuthorizeAttribute,当我们在一个Controller上加上[Authorize],就表示为其加上控制权限。它包括了Scheme、Policy、Roles三部分,三部分都是String类型。
  2. AuthorizationPolicy,定义验证策略,它包括了Schemes、IAuthorizationRequirement,它有一个Combin方法,这个很重要。
  3. IAuthorizationPolicyProvider,其默认实现是DefaultAuthorizationPolicyProvider类。

2、计算出AuthorizationPolicy

AuthorizationPolicy.CombineAsync处理上述三块数据,最终形成完整的AuthorizationPolicy。
这个Combine过程,用到了AuthorizationPolicyBuilder、DefaultAuthorizationPolicyProvider两个类。

AuthorizationPolicyBuilder,包括了AuthenticationSchemes、IAuthorizationRequirement List,这个IAuthorizationRequirement的实现如下,也是系统支持的权限认证方案。

3、通过IPolicyEvaluator(实现类PolicyEvaluator)判断帐户和权限

PolicyEvaluator类有两个方法:

1、AuthenticateAsync,认证身份
2、AuthorizeAsync,判断权限

判断权限过程中,会调用IAuthorizationService(实现类DefaultAuthorizationService)来判断是否满足权限要求。

在DefaultAuthorizationService中会继续调用 IAuthorizationHandlerProvider(实现类DefaultAuthorizationHandlerProvider)获得AuthorizationHandler。

AuthorizationHandler类中的HandleAsync,将会遍历所有Requirement,执行HandleRequirementAsync,判断权限是否满足要求。

4、判断IAllowAnonymous

这里是判断是否允许匿名访问,允许的话,无需判断权限