首页 > 其他分享 >JWT

JWT

时间:2023-08-27 20:45:32浏览次数:23  
标签:apiResult JWT item token var new

一.JWT的作用

 把JSON对象加密成为一个秘钥字符串,JWT的令牌由三个部分组成  JWT头,JWTToken   签名

 二.验证令牌的流程

首先由用户登录后将信息传到后台接口中生成JWT令牌,然后后台将JWT令牌返回给前端,前端可以保存到localStorage或sessionStoeage中

前端每次访问请求时会带着令牌传到后端,然后接口验证令牌的正确性,有效性,验证通过就会执行要执行的操作并返回响应的结果,否则就返回没有授权

三.如何配置JWT

首先安装Nuget包

然后在在appsettings.json配置

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

然后创建一个TokenHelper类

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;
        }
    }

然后在Program.cs中配置

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)

    };
});

在控制器将TokenHelper注入进去

public UserInfoController( TokenHelper tokenHelper)
        {
            _tokenHelper = tokenHelper;
        }

然后编写一个登录接口 在登录接口上一定要加上[AllowAnonymous] 这个是无需验证身份操作

/// <summary>
        /// 登录
        /// </summary>
        /// <param name="userInfoDto"></param>
        /// <returns></returns>
        [HttpPost]
        //允许所有人访问
        [AllowAnonymous]
        public IActionResult Login(UserInfoDto userInfoDto)
        { 
            ApiResult apiResult = new ApiResult();  
       
            var userInfo = _mapper.Map<UserInfoDto, UserInfo>(userInfoDto);

            var result = _userInfoRespority.Login(userInfo);
            if (result==null)
            {
                apiResult.Code = StausCode.ERROR;
                apiResult.Data = StatusMsg.LOGINERRORMSG;
                return Ok(apiResult);
            }
            //将实体转回dto
            UserDto? user = _mapper.Map<UserInfo, UserDto>(result);

            apiResult.Code = StausCode.SUCCESS;
            apiResult.Msg = StatusMsg.LOGINSUCCESSMSG;
            apiResult.Data = user;

            var token = _tokenHelper.CreateJwtToken(user);
            //将token 放到响应头当中
            Response.Headers["token"] = token;
            Response.Headers["Access-Control-Expose-Headers"] = "token";

            return  Ok(apiResult);
        }

这样一个JWT就写好了

标签:apiResult,JWT,item,token,var,new
From: https://www.cnblogs.com/iamlcw/p/17660778.html

相关文章

  • gRPC with JWT
    在gRPC中使用JWT(JSONWebTokens)进行身份验证是一种常见的做法,它可以帮助你确保请求方的身份和权限。下面是一种使用gRPC和JWT进行身份验证的步骤:生成和签发JWT:在用户登录成功后,你需要生成一个JWT并将其签发给用户。JWT中可以包含一些有关用户身份、角色、权限等的......
  • 如何在.Net6.0中使用JWT
    JWT全名JSONWebToken用来进行我们的Api进口保护,那么这个JWT该怎么使用:首先我们需要下载NuGet包: 然后下载这两个NuGet包第一个是JWT的官方包用来进行和核心操作,第二个是用来进行鉴权用。那麽现在我么就要开始配置JWT了首先我们需要创建一个类:定义注册存入TokenHelper类,方......
  • JWT
    .Net6WebAPI使用JWT进行授权认证1、安装组件(Nuget)Microsoft.AspNetCore.Authentication.JwtBearer 2、Program.cs 配置//授权认证(使用JWT)builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o=>{//私钥varsec......
  • .NET6 设置JWT
    一、Net6环境下的.netcore项目里如何使用JWT。第一步,在Nuget引入JWT、Microsoft.AspNetCore.Authentication.JwtBearer这两个NuGet包 第二步,在appsettings.json配置相关配置 第三步,在Program.cs中注册 第四步,定义注册存入TokenHelper类,方便对J......
  • .NET 6 JWT验证
    一、下载JWT包二、配置文件appsettings.json"Auth":{"SecretKey": "al45jgioasdjgoije8343050945049jg3409jgfoksdjfglaskdjfaiosdjfasdfsd",//私钥长度16位以上"Issuer":"www.aaabb.com",//发行人"Aud......
  • 深入探讨安全验证:OAuth2.0、Cookie与Session、JWT令牌、SSO与开放授权平台设计
    什么是认证和授权?如何设计一个权限认证框架?认证和授权是安全验证中的两个重要概念。认证是确认身份的过程,用于建立双方之间的信任关系。只有在认证成功的情况下,双方才可以进行后续的授权操作。授权则是在认证的基础上,确定用户或系统对资源的访问权限。在设计一个权限认证框架时,......
  • JSON Web Tokens(JWT)
    JSONWebTokens(JWT)是一种用于身份验证和授权的开放标准。它可以在客户端和服务器之间安全地传输信息,并且非常适合以下场景:身份验证:JWT可以用于验证用户的身份。当用户登录后,服务器可以生成一个JWT并将其返回给客户端。客户端可以在后续的请求中将JWT作为身份验证凭证发送给服务器......
  • token和jwt
    1. 简介  105使用Token存储用户信息,认证用户。 Token是一个访问系统的令牌(字符串)。Token 是在服务端产生的。前端可以使用用户名/密码向服务端请求认证(登录),服务端认证成功,服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的身份。服务器端在处理......
  • C#利用Refit实现JWT自动续期
    前言笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权。遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到登录界面,是不是一件很无语的事。当然笔者也曾想过:为何不把JWT的有效期尽量设长些(假设24......
  • 基于 JWT + Refresh Token 的用户认证实践(转载)
    HTTP是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个IP不代表同一个用户),在Web应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案,并且各有千秋。 基于Session的会话管理在Web应用发展的初期,大部分采用基于Session......