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

相关推荐
清风絮柳28 分钟前
13.音乐管理系统(基于SpringBoot + Vue)
vue.js·spring boot·后端·毕业设计·前后端分离·音乐播放系统
2401_854391081 小时前
安康旅游网站:SpringBoot设计与实现详解
spring boot·后端·旅游
陈序缘1 小时前
Rust实现Kafka - 前言
开发语言·分布式·后端·职场和发展·rust·kafka
陈序缘1 小时前
Rust 力扣 - 48. 旋转图像
开发语言·后端·算法·leetcode·职场和发展·rust
小宇学编程1 小时前
M1 Pro MacBook Pro 上的奇遇:Rust 构建失败,SIGKILL 惊魂记
后端·rust·编译问题·编译失败·cargo build
Elastic 中国社区官方博客2 小时前
GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序
大数据·后端·elasticsearch·搜索引擎·全文检索·graphql·1024程序员节
罗小爬EX2 小时前
GraphQL系列 - 第1讲 GraphQL语法入门
数据库·后端·graphql
灰色孤星A2 小时前
后台管理系统的通用权限解决方案(七)SpringBoot整合SpringEvent实现操作日志记录(基于注解和切面实现)
java·spring boot·后端·切面编程·springevent·操作日志记录
AskHarries4 小时前
Spring Boot集成Milvus和deeplearning4j实现图搜图功能
spring boot·后端·milvus·deeplearning4j·djl
水w6 小时前
docker怎么实现资源隔离的?
运维·开发语言·后端·docker·容器