栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Cocos2d-x

.Net6 实现 JWT

Cocos2d-x 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.Net6 实现 JWT

.Net6 实现 JWT (需了解知识)依赖注入

首先安装 Nuget 包 Microsoft.AspNetCore.Authentication.JwtBearer

Program.cs 里添加Jwt

//添加jwt验证:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidIssuer = builder.Configuration["JWT:Issuer"],
        ValidateAudience = true,
        ValidAudience = builder.Configuration["JWT:Audience"],
        ValidateLifetime = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["JWT:SecretKey"]))
    };
});

//下面的app添加这个  和这个长得很像  app.UseAuthorization();
app.UseAuthentication();//在前
app.UseAuthorization();//在后

在IOC容器里注入 JWT header类和我自己写的 TokenHelper类

//用于Jwt的各种操作
     builder.RegisterType().InstancePerLifetimeScope();
//自己写的支持泛型存入Jwt 便于扩展
     builder.RegisterType().InstancePerLifetimeScope();

我的TokenHelper类 模型也放在这里 比如我放了一个实体进去拿token的时候也会拿出一个实体

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Reflection;
using System.Security.Claims;
using System.Text;

namespace Quartz_Crawler.Tools
{
    public class TokenHelper
    {
        private readonly IConfiguration _configuration;
        private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        public TokenHelper(IConfiguration configuration, JwtSecurityTokenHandler jwtSecurityTokenHandler)
        {
            _configuration = configuration;
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
        }
        /// 
        /// 创建加密JwtToken
        /// 
        /// 
        /// 
        public string CreateJwtToken(T user)
        {
            var claimList = this.CreateClaimList(user);
            //  从 appsettings.json 中读取SecretKey
            var secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT:SecretKey"]));
            // 从 appsettings.json 中读取Expires
            var expires = Convert.ToDouble(_configuration["JWT:Expires"]);
            //  选择加密算法
            var algorithm = SecurityAlgorithms.HmacSha256;
            // 生成Credentials
            var signingCredentials = new SigningCredentials(secretKey, algorithm);
            JwtSecurityToken jwtSecurityToken = new JwtSecurityToken(
              _configuration["JWT:Issuer"],     //Issuer
               _configuration["JWT:Audience"],   //Audience
               claims: claimList,
               DateTime.Now,                    //notBefore
               DateTime.Now.AddDays(expires),   //expires
               signingCredentials               //Credentials
               );
            string jwtToken = _jwtSecurityTokenHandler.WriteToken(jwtSecurityToken);
            return jwtToken;
        }

        public T GetToken(string Token)
         {
            Type t = typeof(T);

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


        /// 
        /// 创建包含用户信息的CalimList
        /// 
        /// 
        /// 
        private List CreateClaimList(T authUser)
        {
            var Class = typeof(User);
            List claimList = new List();
            foreach (var item in Class.GetProperties())
            {
                claimList.Add(new Claim(item.Name, Convert.ToString(item.GetValue(authUser))));
            }
            return claimList;
        }

      


    }
    /// 
    /// 登录用户信息
    /// 
    public class User
    {
        public int UserID { get; set; }
        public string Email { get; set; }

        public string Name { get; set; }
        public string Role { get; set; }


        public User(int userID=default, string name=default, string email=default, string role=default)
        {
            this.UserID = userID;
            this.Name = name;
            this.Email = email;
            this.Role = role;
        }
    }
    public class UserModel
    {
        public string UserID { get; set; }
        public string Email { get; set; }

        public string Name { get; set; }
        public string Role { get; set; }


        public UserModel()
        {
            
        }
    }
}

我这里是重新自定义了 认证标签 继承这个接口IAuthorizationFilter来实现
从header中获取 Authorization 来验证是否具有权限 以及用户信息 把用户信息存到类里 注入到容器就可以随时随地的拿到用户信息,而无需再从数据库里拿到信息

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Filters;
using Quartz_Crawler.Service;
using Quartz_Crawler.Tools;
using System.IdentityModel.Tokens.Jwt;

namespace Quartz_Crawler.Filter
{
    public class LoginAttrbuteFilter : IAuthorizationFilter
    {
        private readonly IServiceFactory _serviceFactory;
        public JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        private readonly TokenHelper _tokenHelper;
        public LoginAttrbuteFilter(IServiceFactory serviceFactory, JwtSecurityTokenHandler jwtSecurityTokenHandler, TokenHelper tokenHelper)
        {
            _serviceFactory = serviceFactory;
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
            _tokenHelper = tokenHelper;
        }

        public void OnAuthorization(AuthorizationFilterContext context)
        {
            var heads = context.HttpContext.Request.Headers["Authorization"];

            var a= _tokenHelper.GetToken(header);
                        
            _serviceFactory.Get();
            throw new NotImplementedException();
        }
    }
}

最后是我的 Controller 里面的代码

using Microsoft.AspNetCore.Mvc;
using Quartz_Crawler.Filter;
using Quartz_Crawler.Tools;
using System.IdentityModel.Tokens.Jwt;

namespace Quartz_Crawler.Controller
{
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ILogger _logger;
        private readonly IConfiguration _configuration;
        private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler;
        private readonly TokenHelper _tokenHelper;
        public HomeController(ILogger logger, IConfiguration configuration, JwtSecurityTokenHandler jwtSecurityTokenHandler, TokenHelper tokenHelper)
        {
            _logger = logger;
            _configuration = configuration;
            _jwtSecurityTokenHandler = jwtSecurityTokenHandler;
            _tokenHelper = tokenHelper;
        }
        [HttpGet]
        [Route("Login")]
        public object Login()
        {
            var aaa = _tokenHelper.CreateJwtToken(new Tools.User(1, "22", "33", "44"));
            return aaa;

        }
        [HttpGet]
        [Route("Get")]
        public object Get()
        {
            return null;
        }
        [HttpGet]
        [Route("Post")]
        [TypeFilter(typeof(LoginAttrbuteFilter))]
        public object post()
        {
            return null;
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951758.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号