首页 > 其他分享 >.NET 6 JWT验证

.NET 6 JWT验证

时间:2023-08-24 21:36:44浏览次数:36  
标签:验证 JWT Token item token TokenHelper var new NET

一、下载JWT包

image

二、配置文件appsettings.json

"Auth": {
    "SecretKey":      		"al45jgioasdjgoije8343050945049jg3409jgfoksdjfglaskdjfaiosdjfasdfsd", 
    //私钥长度 16位以上
    "Issuer": "www.aaabb.com", //发行人
    "Audience": "www.ccdd.com" //访问人
  }

三、Program.cs中配置JWT

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    //返回的是 字符的数组
    var sercrtByte = Encoding.UTF8.GetBytes(builder.Configuration["Auth:SecretKey"]);
    //配置token验证
    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidIssuer = builder.Configuration["Auth:Issuer"],
        ValidateAudience = true,
        ValidAudience = builder.Configuration["Auth:Audience"],
        //验证是否过期
        ValidateLifetime = true,
        //验证私钥
        IssuerSigningKey = new SymmetricSecurityKey(sercrtByte)

    };
});

开启Swagger认证

image

builder.Services.AddSwaggerGen(a =>
{
    #region 开启Swagger认证
    a.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
    {

        Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });

    a.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
    #endregion
});

必须开启以下中间件

//鉴权
app.UseAuthentication();
//授权
app.UseAuthorization();
//RequireAuthorization() 所有的控制器必须授权才能访问
app.MapControllers().RequireAuthorization();

四、创建TokenHelper.cs类生成令牌

  public class TokenHelper
    {
        private readonly IConfiguration _configuration;
        private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        public TokenHelper(IConfiguration configuration, JwtSecurityTokenHandler jwtSecurityTokenHandler)
        {
            _configuration = configuration;
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
        }
        /// <summary>
        /// 创建加密JwtToken
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public string CreateJwtToken<T>(T user)
        {
            var signingAlogorithm = SecurityAlgorithms.HmacSha256;
            //CreateClaimList  将用户信息 加载到 载荷 当中
            var claimList = this.CreateClaimList(user);
            //Signature
            //取出私钥并以utf8编码字节输出
            var secretByte = Encoding.UTF8.GetBytes(_configuration["Auth:SecretKey"]);
            //使用非对称算法对私钥进行加密
            var signingKey = new SymmetricSecurityKey(secretByte);
            //使用HmacSha256来验证加密后的私钥生成数字签名
            var signingCredentials = new SigningCredentials(signingKey, signingAlogorithm);
            //生成Token
            var Token = new JwtSecurityToken(
          issuer: _configuration["Auth:Issuer"], //发布者
            audience: _configuration["Auth:Audience"], //接收者
            claims: claimList, //存放的用户信息
            notBefore: DateTime.UtcNow, //发布时间
            expires: DateTime.UtcNow.AddDays(1), //有效期设置为1天
            signingCredentials //数字签名
            );
            //生成字符串token
            var TokenStr = new JwtSecurityTokenHandler().WriteToken(Token);
            return TokenStr;
        }

        public T GetToken<T>(string Token)
        {
            Type t = typeof(T);
            //Activator.CreateInstance  根据 t(你传过来的泛型) 用反射的方式 new 当前对象 
            object objA = Activator.CreateInstance(t);
            var b = _jwtSecurityTokenHandler.ReadJwtToken(Token);
            foreach (var item in b.Claims)
            {
                PropertyInfo _Property = t.GetProperty(item.Type);
                if (_Property != null && _Property.CanRead)
                {
                    _Property.SetValue(objA, item.Value, null);
                }

            }
            return (T)objA;
        }
        /// <summary>
        /// 创建包含用户信息的CalimList
        /// </summary>
        /// <param name="authUser"></param>
        /// <returns></returns>
        private List<Claim> CreateClaimList<T>(T authUser)
        {
            var Class = typeof(T);
            //Claim 载荷的类 List
            List<Claim> claimList = new List<Claim>();
            //GetProperties 获取类型下所有的属性
            foreach (var item in Class.GetProperties())
            {
                //if (item.Name == "UPass")
                //{
                //    continue;
                //}
                claimList.Add(new Claim(item.Name, Convert.ToString(item.GetValue(authUser))));
            }
            return claimList;
        }
    }

五、登录时令牌在Headers里

image

  public UserController(TokenHelper tokenHelper)
  {
	TokenHelper = tokenHelper;
  }
  public TokenHelper TokenHelper { get; }
 	    /// <summary>
        /// 用户登录
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        [HttpPost]
        [AllowAnonymous]
        public IActionResult Login(UserLoginDto dto)
        {
            var list = Users.Login(dto);
            Response.Headers["token"] = TokenHelper.CreateJwtToken(list);
            Response.Headers["Access-Control-Expose-Headers"] = "token";
            return Ok(list);
        }

前端vue code中

//登录方法  登录成功
//获取headers令牌存到sessionStorage
let token = res.headers["token"];
sessionStorage.setItem("token", token);
---------------------------------------------------
src/main.js中
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  let token = sessionStorage.getItem('token');
  if (token != null) {
    //将token 放到你的请求头上
    config.headers.Authorization = 'Bearer ' + token;
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});
------------------------------------------------------
外加路由守卫在src/router/index.js
router.beforeEach((to, from, next) => {
  //业务逻辑在这里执行
  //to.path 你要访问的这个地址是 登录页面
  if (to.path == '/') next();
  else {
    //获取token
    let token = sessionStorage.getItem('token');
    //如何存在  你也继续执行
    if (token != null) { next() }
    else { next({ path: '/' }) }    //不存在,跳转到登录页面
  }
})

标签:验证,JWT,Token,item,token,TokenHelper,var,new,NET
From: https://www.cnblogs.com/zsanyue/p/17655186.html

相关文章

  • .NET6中使用Autofac组件
      Autofac是.NETIoC容器.它管理类之间的依赖关系,从而使应用在规模及复杂性增长的情况下依然可以轻易地修改.它的实现方式是将常规的.net类当做组件处理.1.安装Nuget包2.在Api中创建一个AutofacModule的类usingAutofac;usingSystem.Reflection;namespace......
  • centos7安装telnet-server并升级安装Openssh9.0p1
     发布时间:2022/12/1114:42:50需求更新至OpenSSH_9.0p1更新OpenSSH前先安装telnet-server服务,防止意外发生1、安装telnet-server服务查看本机是否安装telnet客户端及服务端[root@sre ~]# rpm -qa | grep telnet[root@sre ~]# rpm -qa telnet-server[r......
  • Bisenet系列
    一、BiSeNet1.1背景作者对比了当前用于三种用于加速模型的实时语义分割算法:图(a)左侧所示,通过裁剪图片降低尺寸和计算量,但是会丢失大量边界信息和可视化精度。图(a)右侧所示,通过修建/减少卷积过程中的通道数目,提高推理速度。其中的红色方框部分,是作者提及的ENet建议放弃模型的......
  • Microsoft.AspNetCore.Identity
    前言用户模块几乎是每个系统必备的基础功能,如果每次开发一个新项目时都要做个用户模块,确实非常无聊。好在asp.netcore给我们提供了Identity,使用起来也是比较方便,如果对用户这块需求不是非常个性化的话,identity是一个不错的选择。ASP.NETCoreIdentity:是一个API,它支持用......
  • Unet网络概述
    图像分割概念B站视频参考语义分割实例分割分割的目的判断标准判断标准即IOU,交集除以并集。MIOU则是所有类别的平均值。Unet模型网络结构比较简单,现在统称为编解码。在unet网络一开始为特征图相加,目前是先拼接再卷积下采样。模型目前在医院领域应用比较广泛。代码......
  • Basic Authentication in ASP.NET Web API
    BasicAuthenticationinASP.NETWebAPI原始资料:BasicAuthenticationinASP.NETWebAPI|MicrosoftLearn演示了如何实现basic身份验证。 注意:在WebAPI2中,您应该考虑编写身份验证过滤器或OWIN中间件,而不是HTTP模块。InWebAPI2,youshouldconsiderwrit......
  • Blocked net
    https://admin.fedoraproject.org/mirrormanager/https://fedoraproject.org/server/download/https://mirror.tuna.tsinghua.edu.cn/help/fedora/changesourcesudosed-e's|^metalink=|#metalink=|g'\-e's|^#baseurl=http://download.exa......
  • element表单验证~提交
    ......
  • net6 使用ef core 映射mysql数据库(方法一)
    1.安装下载nuget包Pomelo.EntityFrameworkCore.MySql和Microsoft.EntityFrameworkCore.Design如下图 2.创建一个模型类,之后映射到数据库里面的表、字段和这个类是一致的。publicclassMovies{///<summary>///id///</summary>......
  • .Net Core使用miniExcel实现导入导出
    .NetCore使用miniExcel实现导入导出首先,引入NuGet包:MiniExcel第三方插件一、导入    publicintUpLoadExecl()   {      //获取文件数据,[0]代表只能上传一个文件,如果要传递多个文件注意:文件名不能重复      varformInfor=HttpCo......