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

news/2024/10/28 5:16:25/

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;
     }
                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]//控制下所有接口都要验证
    public class SkipTokenController : ControllerBase
    {
        // 这个接口会跳过token验证
        [HttpGet]
        [SkipTokenValidation(Skip = true)]
        public IActionResult SkipValidation()
        {
            return Ok("This endpoint is skipping token validation.");
        }
     
        // 这个接口需要token验证
        [HttpGet("validate")]
        public IActionResult ValidateToken()
        {
            return Ok("This endpoint is requiring token validation.");
        }
    }

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


http://www.ppmy.cn/news/1542528.html

相关文章

论当前的云计算

随着技术的不断进步和数字化转型的加速&#xff0c;云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算&#xff0c;作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…

HTML作业

作业 复现下面的图片 复现结果 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><form action"#"method"get"enctype"text/plain"><…

Rust初踩坑

一、下载 到官网https://www.rust-lang.org/zh-CN/tools/install下载你需要的版本 二、安装 执行rustup-init 文件&#xff0c;选择1 按提示直到安装完成 可以通过以下命令测试&#xff1a; rustc -V # 注意的大写的 V cargo -V # 注意的大写的 V三、在VScode中…

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析

作者简介&#xff1a;徐一丁&#xff0c;北京小西牛等保软件有限公司解决方案部总监&#xff0c;网络安全高级顾问。2000年开始从事网络安全工作&#xff0c;主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…

Windows 操作系统中事件驱动架构与注册表

在 Windows 操作系统中&#xff0c;事件驱动架构与注册表的结合非常关键。Windows 的图形用户界面&#xff08;GUI&#xff09;使用事件驱动架构来处理用户的输入和交互&#xff0c;而注册表则起到配置、管理和存储系统设置的作用。结合两者&#xff0c;可以深入理解 Windows 是…

Python中的pip命令安装与使用

Python中的pip命令简介 pip 是 Python 的包管理工具&#xff0c;用于安装和管理 Python 包。它允许你从 Python 包索引&#xff08;Python Package Index&#xff0c;简称 PyPI&#xff09;下载并安装第三方库和工具。pip 是 Python 官方推荐的包管理工具&#xff0c;并且从 P…

渗透测试-SQL注入基础知识

介绍几个常用函数&#xff1a; 1. version()——MySQL 版本 2. user()——数据库用户名 3. database()——数据库名 4. datadir——数据库路径 5. version_compile_os——操作系统版本 字符串连接函数 1. concat(str1,str2,...)——没有分隔符地连接字符串 2. concat_ws…

算法笔记/USACO Guide GOLD金组DP 4. Longest Increasing Subsequence

Has Not Appeared. * 理解最长递增子序列&#xff08;LIS&#xff09;问题是一个经典的DP问题。在给定的数组中&#xff0c;目标是找到最长的严格递增的子序列。 子序列 子序列是通过删除一些或不删除元素&#xff0c;从原数组中得到的序列&#xff0c;且保留原顺序。例如&a…