• 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的逻辑以满足你的安全需求

  • 相关阅读:
    neo4j
    HTML和CSS如何记忆
    基于人工蜂群算法的无人机航迹规划-附代码
    【Mac】增加 safari 体验的插件笔记
    千峰商城-springboot项目搭建-82-订单提交及支付-支付回调
    系统移植 串口输入ECHO点灯
    2022/6/28学习总结
    JavaWeb—HTTP状态 405 - 方法不允许【BUG已解决】
    UE5自定义插件创建UserWidget蓝图
    springboot整合kettle和xxljob
  • 原文地址:https://blog.csdn.net/wysdong/article/details/143250019