一文让你彻底搞懂C# .NET 通过注册消息中间件,实现验证用户权限问题

325 阅读2分钟

一:声明中间件类

简单步骤介绍:

1.声明一个中间件验证权限的辅助类

2.声明一个 RequestDelegate http协议委托

3.声明该类的有参(RequestDelegate)构造函数

4.声明权限验证方法Invoke(HttpContext)

代码演示如下:

using ReadJson_.Net6._0.Model;
using System.IdentityModel.Tokens.Jwt;
namespace ReadJson_.Net6._0.Utils
{
    /// <summary>
    /// 中间件辅助类
    /// </summary>
    public class MiddleWareUtil
    {
        /// <summary>
        /// 前端接口访问路由 Http协议
        /// </summary>
        private readonly RequestDelegate _next;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="next"></param>
        public MiddleWareUtil(RequestDelegate next)
        {
            _next = next;
        }

        /// <summary>
        /// 验证前端访问接口,用户状态是否是 在线
        /// 是: 继续访问接口
        /// 不是: 提示前端去登录
        /// </summary>
        /// <param name="context"></param>
        public async Task Invoke(HttpContext context)
        {
            //获取上传token,可自定义扩展
            string token = context.Request.Headers["Authorization"].ToString();
            if (!string.IsNullOrEmpty(token))
            {
                //在此处写验证逻辑
                
                //我的代码是前端传过来的参数token是经过jwt加密的,所以需要解密
                //大家可以根据自己的需求,进行相应的更改
                //解析jwt加密的 token
                TokenModelJwt tmj = JwtUtil.SerializeJwt(token);
                //取出token中的用户id
                string userId = tmj.Uid;
                //根据id查询学生信息
                //此处先创建一个假数据  代表查询出来的数据
                Student student = new Student()
                {
                    Id = userId,
                    state = "在线"
                };

                if (student.state == "在线")
                {//验证成功 继续访问需要访问的接口
                    await _next(context);
                    return;
                }
            }
            //验证失败 返回报错
            await _next(null);
        }
    }

}

二: 注册消息中间件

注意:

.Net6.0以上项目请在Program.cs中写注册代码: app.UseMiddleware<自己定义的中间件实体类名称>();

.Net6.0以下项目请在Startup.cs中写注册代码: app.UseMiddleware<自己定义的中间件实体类名称>();

具体代码如下 image.png

三:简单使用

如下两图: 首先我是没有传递token信息的,他会报错,不会访问成功 image.png image.png

如下两图:我是传递了token信息的,所以他会访问成功,就能正常访问接口并且能拿到数据

image.png

image.png 以上就是我自己会的一些简单的中间件相关的技术了解,大家有更加丰富的想法,欢迎到评论区留言讨论!!!