asp.net core 多个授权策略选择单个策略

news/发布时间2024/5/13 21:48:10

首先假设我们依据官方示例有这样一个自定义的授权handler

    public class FunAuthorizeAttribute : AuthorizeAttribute, IAuthorizationRequirement,IAuthorizationRequirementData{public FunAuthorizeAttribute() : this(null, true) { }public FunAuthorizeAttribute(string funcCodes):this(funcCodes,true){}public FunAuthorizeAttribute(bool isMinimumAge) : this(null, isMinimumAge){}public FunAuthorizeAttribute(string? funcCodes,bool isMinimumAge){FuncCodes = funcCodes;IsMinimumAge = isMinimumAge;}public string? FuncCodes { get; }/// <summary>/// 是否要有18岁要求/// </summary>public bool IsMinimumAge { get; set; } = true;public IEnumerable<IAuthorizationRequirement> GetRequirements(){yield return this;}}public class FunAuthorizationHandler(ILogger<FunAuthorizationHandler> logger) : AuthorizationHandler<FunAuthorizeAttribute>{protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, FunAuthorizeAttribute requirement){logger.LogInformation(requirement.FuncCodes);var user = context.User;if (requirement.IsMinimumAge){var age = user.Claims.FirstOrDefault(a => a.Type == "Age");if (age != null){int ageNumber = int.Parse(age.Value);if (ageNumber<18){context.Fail();return Task.CompletedTask;}}}if (requirement.FuncCodes == null){context.Succeed(requirement);return Task.CompletedTask;}else{var funcCodes = requirement.FuncCodes.Split(',');var claim = user.Claims.FirstOrDefault(a => a.Type == "Funs");if (claim != null){string[] list = claim.Value.Split(',');if (list != null && funcCodes.Any(a => list.Contains(a))){context.Succeed(requirement);return Task.CompletedTask;}}}context.Fail();return Task.CompletedTask;}}
View Code

 

FunAuthorizeAttribute 可以设置功能权限和18岁成人要求,我们一般默认是所有接口通用为需要满足18岁的,所以我们可能会自定义一个contoller 父类

[FunAuthorizeAttribute]
public class ApiController : ControllerBase{}

所有Controller都继承通用这个父类;
到这一步,很多人稍微研究过授权的可能都会处理了;

但是asp.net core 的默认是需要满足所有策略的,也就是说当你在某些特定方法上加了一个[FunAuthorizeAttribute(false)],可是依旧返回是403,你的数据依旧需要满足 age>=18,因为父类有要求 IsMinimumAge=true;

此时我们更多时候想要的是我只需要验证最后一个策略,也就是[FunAuthorizeAttribute(false)],这个时候要如何处理?

    public class FunAuthorizationHandler(ILogger<FunAuthorizationHandler> logger) : IAuthorizationHandler{public async Task HandleAsync(AuthorizationHandlerContext context){// 只处理最后一个的授权var list = context.Requirements.OfType<FunAuthorizeAttribute>();var count = list.Count();int i = 1;foreach (var req in list){if (i == count){await HandleRequirementAsync(context, req).ConfigureAwait(false);}else{context.Succeed(req);}i++;}}protected Task HandleRequirementAsync(AuthorizationHandlerContext context, FunAuthorizeAttribute requirement){logger.LogInformation(requirement.FuncCodes);var user = context.User;if (requirement.IsMinimumAge){var age = user.Claims.FirstOrDefault(a => a.Type == "Age");if (age != null){int ageNumber = int.Parse(age.Value);if (ageNumber < 18){context.Fail();return Task.CompletedTask;}}}if (requirement.FuncCodes == null){context.Succeed(requirement);return Task.CompletedTask;}else{var funcCodes = requirement.FuncCodes.Split(',');var claim = user.Claims.FirstOrDefault(a => a.Type == "Funs");if (claim != null){string[] list = claim.Value.Split(',');if (list != null && funcCodes.Any(a => list.Contains(a))){context.Succeed(requirement);return Task.CompletedTask;}}}context.Fail();return Task.CompletedTask;}}
View Code

首先基础类由AuthorizationHandler<T>改为IAuthorizationHandler,在HandleAsync 方法里就可以重写自己需要的策略,我们只正常处理最后一个策略要求,其他的全部设置成功。

代码丑陋见笑了;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/36200272.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

揭秘JavaScript数据世界:一文通晓基本类型和引用类型的精髓!

在编程的世界里,数据是构建一切的基础。就像建筑师需要了解不同材料的强度和特性一样,程序员也必须熟悉各种数据类型。 今天,我们就来深入探讨JavaScript中的数据类型,看看它们如何塑造我们的代码世界。 一、JavaScript数据类型简介 数据类型是计算机语言的基础知识,数据类…

如何将本地项目第一次同步到gitee远程

一,Gitee账号的注册/登录 在gitee登录入口输入相关信息进行注册登录https://gitee.com/signup#lang=zh-CN 二,本地安装git客户端并配置用户信息 1.Git - 安装 Git (git-scm.com)根据提示点击下一步,安装完成后,在本地文件夹右键单击出现git相关指令,表示安装成功2.点击git…

faiss简单测试方法

先把仓库克隆到本地,我这边还需要改cmake环境,在project上面加 set(CMAKE_CUDA_COMPILER /usr/local/cuda-11.8/bin/nvcc) 构建 mkdir buildcmake -B build . 编译,只需要编译faiss这部分就可以,(主目录下有很多测试代码,编译很慢,只编译faiss会快很多) cd build make …

一个库帮你轻松的创建漂亮的.NET控制台应用程序

前言 做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试。今天大姚给大家分享一个.NET开源且免费的类库帮你轻松的创建漂亮、美观的.NET控制台应用…

华为NPU开发流程点滴

华为NPU开发流程点滴 NPU/CPU集成操作流程图介绍了App使用HUAWEI HiAI DDK的集成流程。IR在线模型构建 IR在线模型构建通过IR单算子根据原始模型中的关系级联,配置权重数据,构建IR模型网络。 离线模型转换 离线模型转换需要将Caffe、TensorFlow、ONNX、MindSpore模型转换为HU…

拉格朗日(Lagrange)中值定理

preamble罗尔中值定理是理解拉格朗日中值定理的基础罗尔中值定理是拉格朗日中值定理的1个特殊情况泰勒中值定理是拉格朗日中值定理的推广cite: 罗尔定理: https://www.cnblogs.com/Preparing/p/18156702definition 若函数\(f(x)\)满足下列条件:\(f(x)\) 在闭区间\([a,b]\)上连…