• 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()?.Endpoint;
              if (endpoint != null)
              {
       var actionMethod = "";//[control]/[action]
       var controllerActionDescriptor = endpoint.Metadata.GetMetadata();
       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();
                   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();
       
          // 其他中间件配置...
           添加自定义中间件用于处理域名跳转
      //    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的逻辑以满足你的安全需求

  • 相关阅读:
    云原生应用安全
    02.MySQL函数及约束、多表笔记
    【IBIS 模型与仿真 - IBISWriter and Write_IBIS】
    大数据-玩转数据-Flink状态编程(上)
    GBJ810-ASEMI大芯片整流桥GBJ810
    OAK PoE设备独立模式详细介绍
    C++ 入门基础(收尾) 内联函数
    网络编程之流量接入层设计:基于性能怪兽从零构建日均亿级吞吐量的网关架构!
    Echarts地图实现:2013-2019电商动态排名
    java计算机毕业设计网上花店源码+系统+数据库+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/wysdong/article/details/143250019