前几篇总结了Identity和Authentication这两块,最终结果是可以获得当前用户的身份证信息,匿名也算一种。
但系统里哪些地方允许匿名访问,哪些需要一定的权限,则是在Authorization这一块实现。
权限控制,基本上可以分为:
- 完全不需要任何权限,匿名即可访问
- 需要是系统用户,有身份证即可
- 是系统用户,有身份证,但还需要其他因素才可以访问
这个其他因素,可以是Role(基于角色)、身份证上一些关键因素(基于声明)、相关规则组合(基于策略)、临时审批。
在Program.cs中启用UseAuthorization的时候,它将开始执行:
1、AuthorizationMiddleware类中的Invoke方法
在这个方法中,会先获取如下三块数据:
- IAuthorizeData,这个对应的实现就有AuthorizeAttribute,当我们在一个Controller上加上[Authorize],就表示为其加上控制权限。它包括了Scheme、Policy、Roles三部分,三部分都是String类型。
- AuthorizationPolicy,定义验证策略,它包括了Schemes、IAuthorizationRequirement,它有一个Combin方法,这个很重要。
- 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
这里是判断是否允许匿名访问,允许的话,无需判断权限