首页 > 其他分享 >从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用Av

从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用Av

时间:2024-09-23 14:03:11浏览次数:9  
标签:string JWT token Token Av var new public

说明

该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

结合上一篇文章使用,味道更佳:从0到1搭建权限管理系统系列二 .net8 使用JWT鉴权(附当前源码)

有兴趣的朋友,请关注我吧(**)。

关注我,学不会你来打我

创建Token

创建token的因素(条件)有很多,在该篇文章中,采用jwt配置和用户基本信息作为生成token的基本因素(读者可根据系统,自由改变生成token因素)。

在JwtPlugInUnit.CS中创建2个方法(JwtPlugInUnit.CS在上一篇文章中有写到)

方法一:PropValuesType方法
/// 
/// 反射获取字段
/// 
/// 
/// 
public static IEnumerable<(string Name, object Value, string Type)> PropValuesType(this object obj)
{
    List<(string a, object b, string c)> result = new List<(string a, object b, string c)>();

    var type = obj.GetType();
    var props = type.GetProperties();
    foreach (var item in props)
    {
        result.Add((item.Name, item.GetValue(obj), item.PropertyType.Name));
    }
    return result;
}
上述方法:PropValuesType是通过反射获取模型字段和属性。在本文章中,是为了提取登录人员信息,编写成List,组成生成token的因素之一。方法二:BuildToken方法
/// 
/// 生成Token
/// 
/// 登陆返回信息
/// 
public static LoginOutPut BuildToken(LoginInput loginResult)
{
    LoginOutPut result = new LoginOutPut();
    //获取配置
    var jwtsetting = AppSettingsPlugInUnit.GetNode("JwtSetting");

    //准备calims,记录登录信息
    var calims = loginResult.PropValuesType().Select(x => new Claim(x.Name, x.Value.ToString(), x.Type)).ToList();

    //创建header
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtsetting.SecurityKey));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var header = new JwtHeader(creds);

    //创建payload
    var payload = new JwtPayload(jwtsetting.Issuer, jwtsetting.Audience, calims, DateTime.Now, DateTime.Now.AddMinutes(jwtsetting.ExpireSeconds));

    //创建令牌 
    var token = new JwtSecurityToken(header, payload);
    var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
    result.ExpiresDate = token.ValidTo.AddHours(8).ToString();
    result.Token = tokenStr;
    result.UserName = loginResult.UserName;

    return result;
}

上述方法:BuildToken是创建token的核心代码,它通过用户信息+jwt配置信息生成token,并返回token、用户名、token过期时间等信息(读者可以添加更多返回信息)。

BuildToken中有2个模型,具体结构和位置如下:

创建Model类,用于存放系统中模型。

LoginInput模型结构如下:

/// 
/// 登录输入模型
/// 
public class LoginInput
{
    /// 
    /// 用户名
    /// 
    public string? UserName { get; set; }

    /// 
    /// 密码
    /// 
    public string? Password { get; set; }

}

LoginOutPut模型结构如下:

   /// 
   /// 登录输入模型
   /// 
   public class LoginOutPut
   {
       /// 
       /// 用户名
       /// 
       public string? UserName { get; set; }

       /// 
       /// 密码
       /// 
       public string? Password { get; set; }

       /// 
       /// Token
       /// 
       public string? Token { get; set; }

       /// 
       /// Token过期时间
       /// 
       public string? ExpiresDate { get; set; }

   }

做完以上操作,用户就可以生成Token,但要把token运用到系统中,还需做以下操作。

创建模块分组

  在ModeuleGroupEnum.cs中创建2个枚举,具体如下

  说明:ModeuleGroupEnum.cs在从0到1搭建权限管理系统系列一 .net8 使用Swagger(附当前源码):樱花宇宙官网 文章中有说明(或者关注我的微信公众号)。

 /// 
 /// 模块分组
 /// 
 public enum ModeuleGroupEnum
 {
     /// 
     /// 系统菜单
     /// 
     SysMenu = 1,

     /// 
     /// 系统用户
     /// 
     SysUser = 2,

     /// 
     /// 基础
     /// 
     Base = 3,
 }

  新增【系统用户】、【基础】2个枚举。

创建新控制器

创建2个控制器:BaseController和SysUserController,结构如下

创建BaseController基础控制器,它存在的作用,就是承担系统中需要重写方法和获取用户基本信息的桥梁。

代码如下:

/// 
/// 系统基础模块
/// 
[ApiController]
[Route("api/[controller]/[action]")]
[ApiExplorerSettings(GroupName = nameof(ModeuleGroupEnum.Base))]
[Authorize]
public class BaseController : ControllerBase
{
    /// 
    /// 获取登陆人员信息
    /// 
    /// 
    [HttpGet]
    public LoginOutPut GetLoginUserMsg()
    {
        StringValues s = new StringValues();
        var auth = Request.Headers.TryGetValue("Authorization", out s);
        if (string.IsNullOrWhiteSpace(s))
            throw new Exception("登录信息失效");
        var token = new JwtSecurityTokenHandler().ReadJwtToken(s.ToString().Replace($"{JwtBearerDefaults.AuthenticationScheme} ", ""));
        LoginOutPut loginResult = new()
        {
            UserName = token.Claims.FirstOrDefault(f => f.Type == "UserName").Value,
            Password = Convert.ToString(token.Claims.FirstOrDefault(f => f.Type == "Password").Value),
        };
        return loginResult;

    }
}

解读下该方法:通过获取Headers中的Token,然后使用jwt反解析token获取在BuildToken方法中记录的用户基本信息。

说明:控制器上方存在[Authorize],只要有控制器继承基础控制【BaseController】,那么该控制器下的所有方法,都需要经过jwt验证。如果某一个接口不需要token验证,就在该接口上方添加 [AllowAnonymous]

  创建SysUserController控制器,并继承BaseController控制器,它的作用就是承担系统用户的所有接口,具体代码如下:

 /// 
 /// 用户模块
 /// 
 [ApiController]
 [Route("api/[controller]/[action]")]
 [ApiExplorerSettings(GroupName = nameof(ModeuleGroupEnum.SysUser))]
 public class SysUserController : BaseController
 {
     /// 
     /// 获取Token
     /// 
     /// 用户名
     /// 密码
     [HttpGet]
     [AllowAnonymous]
     public string GetToken(string userName, string password)
     {
         var loginResult = JwtPlugInUnit.BuildToken(new LoginInput { UserName = userName, Password = password });

         return loginResult.Token ?? string.Empty;
     }
 }

可以看到,该控制器下有2个接口,一个为获取token接口(可同时作为登录接口),一个为获取登录人员信息的接口(继承BaseController下的GetLoginUserMsg()方法)。

做完以上操作,jwt中token验证就完成啦,看一下成果。

不使用token访问接口,不会成功

先获取token

在添加使用token

点击Authorize确定使用

再次访问GetLoginUserMsg()接口,看下效果

回复评论

上一篇文章:从0到1搭建权限管理系统系列二 .net8 使用JWT鉴权(附当前源码)得到了较多评论,有指正的、有疑问的。

首先感谢大家的阅读,感谢大家的指正,也感谢大家的提问。

在这里我针对些问题,回复如下:

回复一:

确实,在.net core 刚发布的时候,所有人在微软的引导下都对这一门的开源的框架,大家都叫它.net core ,它的出现也让c#在生死的边缘,获得一线生机。但在.net core 3.1(应该)之后,就改名叫.net5 .net8等。

回复二:

jwt它是轻量级的库,所有它在这方面的处理,并不是很好。所以建议新增中间件验证过期token或者把Token存到数据库或缓存中,以此来操作复杂的鉴权验证。

回复三:

艾特这2位朋友,你要的来了,顺便求关注博客园、关注微信公众号,不错过每次更新。

感谢你的耐心观看。

如果对你有帮助,请关注我微信公众号吧(**)。

源代码地址:https://gitee.com/yangguangchenjie/overall-auth2.0-web-api

帮我Star,谢谢。

有兴趣的朋友,请关注我微信公众号吧(**)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

标签:string,JWT,token,Token,Av,var,new,public
From: https://www.cnblogs.com/westworldss/p/18426959

相关文章

  • idea运行java项目main方法报build failure错误的解决方法BR
    当在使用IntelliJIDEA运行Java项目的main方法时遇到"BuildFailure"错误,这通常意味着在项目的构建过程中遇到了问题。解决这类问题通常需要系统地检查和调整项目设置、代码、依赖项等多个方面。以下是一些详细的解决步骤,以及一个简单的代码示例,用于展示如何确保Java程......
  • 从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
    说明  该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。   该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。   说明:OverallAuth2.0是一个简单、易懂、功能强大的权限+可视化流程管理系统。结合上一篇文章使用,味道更......
  • ECMAScript与JavaScript的区别:深入解析与代码实践
    ECMAScript与JavaScript的区别:深入解析与代码实践在Web开发领域,ECMAScript(通常缩写为ES)和JavaScript是两个密不可分但又有所区别的概念。尽管它们之间有着紧密的联系,理解它们之间的区别对于开发者来说至关重要。本文将深入探讨ECMAScript与JavaScript的区别,并通过代码示例......
  • idea缺失右侧maven窗口
     通过idea的打开项目后,缺失了右侧的maven窗口。idea是有安装到maven(默认就按照了的)打开的项目也是maven项目的网上搜了一下情况,两种可能:可能1:项目导入的时候,没有被识别为maven项目(也就是说你没有通过maven的方式导入)可能2:就是你的idea默认不显示maven窗口无论哪个情况,只......
  • 基于SSM的高校毕业设计(选题)管理系统。Javaee项目。
    演示视频:基于SSM的高校毕业设计(选题)管理系统。Javaee项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Bootstrap来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。系统设计思想一个成功的......
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的医院在线挂号系统设计
    基于javaEE+SSH+mysql的医院在线挂号系统设计与实现(毕业论文+程序源码)大家好,今天给大家介绍基于javaEE+SSH+mysql的医院在线挂号系统设计与实现,更多精选毕业设计项目实例见文末哦。文章目录:基于javaEE+SSH+mysql的医院在线挂号系统设计与实现(毕业论文+程序源码)1、项......
  • java毕业设计下载(全套源码+配套论文)——基于javaEE+SSH+mysql的百货中心供应链管理系
    基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现(全套源码+配套论文)大家好,今天给大家介绍基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现,更多精选毕业设计项目实例见文末哦。文章目录:基于javaEE+SSH+mysql的百货中心供应链管理系统设计与实现(全套......
  • 03 Java流程控制
    一、顺序结构前面学的就是顺序结构二、分支结构1.if分支根据条件(真或假)来决定执行某段代码if(条件){},()后不能跟“;”,否则{}中的代码将不受if的控制如果if语句的{}中只有一行代码的情况,{}可以省略不写(但是不推荐省略)1.1 if分支的三种形式①if(条i按表达式){   代......
  • 提升 Laravel 开发效率:5 个鲜为人知的 Artisan 命令
    Laravel以其优雅的语法和开发者友好的特性而闻名,而其强大的命令行工具Artisan更是锦上添花。尽管许多开发者熟悉常用的Artisan命令,但有一些鲜为人知的命令可以显著提升开发效率。本文将探讨五个这样的命令,以及它们如何优化你的开发工作流。1.phpartisanevent:gene......
  • 【华为OD机试真题E卷】545、预订酒店 | 机试真题+思路参考+代码解析(E卷复用)(C++、Java
    文章目录一、题目......