Bootstrap

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

;