当前位置: 首页 > news >正文

asp.net core 入口 验证token,但有的接口要跳过验证

asp.net core 入口 验证token,但有的接口要跳过验证

在ASP.NET Core中,你可以使用中间件来验证token,并为特定的接口创建一个属性来标记是否跳过验证。以下是一个简化的例子:

  1. 创建一个自定义属性来标记是否跳过验证:
    public class SkipTokenValidationAttribute : Attribute
    {
        public bool Skip { get; set; } = false;
    }

  2. 创建中间件来验证token:
    public class TokenValidationMiddleware
    {
        private readonly RequestDelegate _next;
     
        public TokenValidationMiddleware(RequestDelegate next)
        {
            _next = next;
        }
     
        public async Task Invoke(HttpContext context)
        {
            var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
            if (endpoint != null)
            {
     var actionMethod = "";//[control]/[action]
     var controllerActionDescriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
     if (controllerActionDescriptor != null)
     {
         actionMethod = controllerActionDescriptor.AttributeRouteInfo?.Template;//.ControllerName;
     }
     if (context.Request.PathBase.Equals("", StringComparison.OrdinalIgnoreCase) && context.Request.Path.Equals("/", StringComparison.OrdinalIgnoreCase))
     {
         //访问域名(不包含其他地址信息),跳转到guest.html
         context.Response.Redirect("Admin/admin/guest.html");
     }
     else
     {

                var skipAttr = endpoint.Metadata.GetMetadata<SkipTokenValidationAttribute>();
                 if (skipAttr?.Skip != null && skipAttr?.Skip != true)
                {
                    var token = "";// context.Request.Query.
     if(context.Request.Query!=null && context.Request.Query.ContainsKey("token"))
     {
         token = context.Request.Query["token"].ToString().Trim();
     }
     if (context.Request.Form!=null && context.Request.Form.ContainsKey("token"))
     {
         token = context.Request.Form["token"].ToString().Trim();
     }
     if(!string.IsNullOrEmpty(token))
     {
         //验证token...
     }
     else
     {
         context.Response.StatusCode = 401;
         return;
     }
     // 验证token的逻辑
     //var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last();
     //if (token != null)
     //{
     //    // 验证token的逻辑
     //    // 如果token无效,返回未授权的错误
     //    context.Response.StatusCode = 401;
     //    return;
     //}
                }
            }
     
            await _next(context);
    }
        }
    }

  3. 注册中间件:在Startup.cs中的Configure方法中添加中间件(注意要写在app.UseRouting()之后):
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 其他中间件配置...
     
        app.UseMiddleware<TokenValidationMiddleware>();
     
        // 其他中间件配置...
         添加自定义中间件用于处理域名跳转
    //    app.Use(async (context, next) =>
    //    {
    //        if (context.Request.PathBase.Equals("", StringComparison.OrdinalIgnoreCase) && context.Request.Path.Equals("/", StringComparison.OrdinalIgnoreCase))
    //        {
    //            //访问域名(不包含其他地址信息),跳转到guest.html
    //            context.Response.Redirect("Admin/admin/guest.html");
    //        }
    //        else
    //        {
    //            await next();
    //        }
    //    });

    }

  4. 使用SkipTokenValidationAttribute属性来标记那些不需要验证token的接口:
    //[ApiController] //有这个,好像接口字符参数都必须填写值
    [Route("[controller]")]
    [SkipTokenValidation]//控制下所有接口都要验证
     //[ApiExplorerSettings(IgnoreApi = true)]//在swagger上隐藏该控制器
    public class SkipTokenController : ControllerBase
    {
        // 这个接口会跳过token验证
        [HttpGet]
        [SkipTokenValidation(Skip = true)]
        public IActionResult SkipValidation()
        {
            return Ok("This endpoint is skipping token validation.");
        }
     
        // 这个接口需要token验证
        [HttpGet("validate")]
        //[ApiExplorerSettings(IgnoreApi = true)]//在swagger上隐藏该接口
        public IActionResult ValidateToken()
        {
            return Ok("This endpoint is requiring token validation.");
        }
    }

    以上代码展示了如何在ASP.NET Core中创建一个中间件来验证token,并根据接口是否需要跳过验证来处理请求。在实际应用中,你需要替换验证token的逻辑以满足你的安全需求

http://www.lryc.cn/news/471238.html

相关文章:

  • [mysql]聚合函数GROUP BY和HAVING的使用和sql查询语句的底层执行逻辑
  • 从数据中台到数据飞轮:实现数据驱动的升级之路
  • 小记:SpringBoot中,@Alisa和@ApiModelProperty的区别
  • 信捷 PLC C语言 定时器在FC中的使用
  • k8s常用对象简介
  • 【Kaggle | Pandas】练习2:索引,选择和分配
  • 【flask】 flask redis的使用
  • 【Unity基础】Unity中的特殊文件夹详解
  • 矩阵蠕虫,陈欣出品
  • python 爬虫 入门 五、抓取图片、视频
  • ubantu 编译安装ceph 18.2.4
  • 哈希封装“unordered_set·map“
  • Bi-LSTM-CRF实现中文命名实体识别工具(TensorFlow)
  • 从JDK 17 到 JDK 21:Java 新特性
  • 【计算机网络 - 基础问题】每日 3 题(五十七)
  • 第十二章 章节练习created的应用
  • Unity 游戏性能优化实践:内存管理与帧率提升技巧
  • C++游戏开发详解
  • 三、大模型(LLMs)微调面
  • Flutter升级与降级
  • 分布式并发场景的核心问题与解决方案
  • D - Many Segments 2(ABC377)
  • 数组指针和指针数组的区别
  • 【VUE点击父组件按钮,跳转到子组件】
  • Java列表排序:方法与实践
  • 哈希及其封装实现unordermap和set
  • 在 AMD GPU 上构建解码器 Transformer 模型
  • Canvas简历编辑器-选中绘制与拖拽多选交互设计
  • 简单工厂(Simple Factory)
  • ffmpeg拉流分段存储到文件-笔记