翼度科技»论坛 编程开发 .net 查看内容

.net8 使用JWT鉴权(附当前源码)

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。
    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。
    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。
结合上一篇文章使用,味道更佳:.net core8 使用Swagger(附当前源码)
有兴趣的朋友,请关注我吧(*^▽^*)。
第一步:安装最新Jwt包
    包名:Microsoft.AspNetCore.Authentication.JwtBearer
第二步:appsettings.json中配置jwt
  1. /*jwt鉴权*/
  2. "JwtSetting": {
  3.    "Issuer": "微信公众号:不只是码农", //发行人
  4.    "Audience": "微信公众号:不只是码农", //订阅人
  5.    "ExpireSeconds": 120, //过期时间,默认分钟
  6.    "ENAlgorithm": "HS256", //秘钥算法
  7.    "SecurityKey": "bzsmn=Start20240913EndOverallAuth-WebApi" //秘钥构成
  8. }
复制代码
第三步:创建jwt解析模型
    在OverallAuth-WebApi项目的目录下创建文件夹【model】,并创建一个类文件JwtSettingModel.cs
    OverallAuth-WebApi结构,见上一篇文章:.net core8 使用Swagger(附当前源码)
  1. /// <summary>
  2. /// jwt配置模型
  3. /// </summary>
  4. public class JwtSettingModel
  5. {
  6.      /// <summary>
  7.      /// 密钥
  8.      /// </summary>
  9.      public string SecurityKey { get; set; }
  10.      /// <summary>
  11.      /// 加密算法
  12.      /// </summary>
  13.      public string ENAlgorithm { get; set; }
  14.      /// <summary>
  15.      /// 颁发者
  16.      /// </summary>
  17.      public string Issuer { get; set; }
  18.      /// <summary>
  19.      /// 接收者
  20.      /// </summary>
  21.      public string Audience { get; set; }
  22.      /// <summary>
  23.      /// 过期时间    单位:秒
  24.      /// </summary>
  25.      public int ExpireSeconds { get; set; }
  26. }
复制代码
目录结构如下:

第四步:创建Jwt、AppSettings插件
目录结构如下:

上图可以看到,我们创建了JwtPlugInUnit和AppSettingsPlugInUnit2个插件,它分别对应jwt和AppSettings配件文件的解析。
那么我们看下,这2个类里面的具体内容。
JwtPlugInUnit如下:
  1. /// <summary>
  2. /// jwt插件
  3. /// </summary>
  4. public static class JwtPlugInUnit
  5. {
  6.     /// <summary>
  7.     /// 初始化JWT
  8.     /// </summary>
  9.     /// <param name="services"></param>
  10.     public static void InitJWT(this IServiceCollection services)
  11.     {
  12.         var jwtsetting = AppSettingsPlugInUnit.GetNode<JwtSettingModel>("JwtSetting");
  13.         services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  14.             .AddJwtBearer(o =>
  15.             {
  16.                 o.TokenValidationParameters = new TokenValidationParameters()
  17.                 {
  18.                     ValidateIssuerSigningKey = true,
  19.                     ValidIssuer = jwtsetting.Issuer,
  20.                     ValidAudience = jwtsetting.Audience,
  21.                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtsetting.SecurityKey)),
  22.                     ValidateIssuer = true,
  23.                     ValidateAudience = true,
  24.                     ValidateLifetime = true,
  25.                     ClockSkew = TimeSpan.Zero
  26.                 };
  27.             });
  28.     }
  29. }
复制代码
AppSettingsPlugInUnit如下:
  1. /// <summary>
  2. /// AppSettings配置文件插件
  3. /// </summary>
  4. public class AppSettingsPlugInUnit
  5. {
  6.      /// <summary>
  7.      /// 声明配置属性
  8.      /// </summary>
  9.      public static IConfiguration Configuration { get; set; }
  10.      /// <summary>
  11.      /// 构造函数
  12.      /// </summary>
  13.      static AppSettingsPlugInUnit()
  14.      {
  15.          Configuration = new ConfigurationBuilder()
  16.               .Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
  17.               .Build();
  18.      }
  19.      /// <summary>
  20.      /// 获得配置文件的对象值
  21.      /// </summary>
  22.      /// <param name="jsonPath">文件路径</param>
  23.      /// <param name="key"></param>
  24.      /// <returns></returns>
  25.      public static string GetJson(string jsonPath, string key)
  26.      {
  27.          if (string.IsNullOrEmpty(jsonPath) || string.IsNullOrEmpty(key)) return null;
  28.          IConfiguration config = new ConfigurationBuilder().AddJsonFile(jsonPath).Build();//json文件地址
  29.          return config.GetSection(key).Value;//json某个对象
  30.      }
  31.      /// <summary>
  32.      /// 获取数据库连接字符串
  33.      /// </summary>
  34.      /// <returns></returns>
  35.      public static string GetMysqlConnection()
  36.      {
  37.          return Configuration.GetConnectionString("MySql").Trim();
  38.      }
  39.      /// <summary>
  40.      /// 根据节点名称获取配置模型
  41.      /// </summary>
  42.      /// <typeparam name="T"></typeparam>
  43.      /// <param name="Node"></param>
  44.      /// <returns></returns>
  45.      public static T GetNode<T>(string Node) where T : new()
  46.      {
  47.          T model = Configuration.GetSection(Node).Get<T>();
  48.          return model;
  49.      }
  50. }
复制代码
第五步:让jwt遵守Swagger协议
因为我们系统使用到了Swagger,所以要让jwt遵守Swagger协议,因此我们要在Swagger中添加如下代码。
  1. /// <summary>
  2. /// 初始化Swagger
  3. /// </summary>
  4. /// <param name="services"></param>
  5. public static void InitSwagger(this IServiceCollection services)
  6. {
  7.     //添加swagger
  8.     services.AddSwaggerGen(optinos =>
  9.     {
  10.         typeof(ModeuleGroupEnum).GetEnumNames().ToList().ForEach(version =>
  11.         {
  12.             optinos.SwaggerDoc(version, new OpenApiInfo()
  13.             {
  14.                 Title = "权限管理系统",
  15.                 Version = "V2.0",
  16.                 Description = "求关注,求一键三连",
  17.                 Contact = new OpenApiContact { Name = "微信公众号作者:不只是码农   b站作者:我不是码农呢", Url = new Uri("http://www.baidu.com") }
  18.             });
  19.         });
  20.         //反射获取接口及方法描述
  21.         var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
  22.         optinos.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFileName), true);
  23.         //使用jwt
  24.         optinos.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
  25.         {
  26.             Description = "请在下方输入框子输入Bearer Token 开启JWT鉴权",
  27.             Name = "Authorization", // 默认名称,不能修改
  28.             In = ParameterLocation.Header,
  29.             Type = SecuritySchemeType.ApiKey,
  30.             Scheme = "Bearer"
  31.         });
  32.         //让swagger遵守jwt协议
  33.         optinos.AddSecurityRequirement(new OpenApiSecurityRequirement
  34.          {
  35.            {
  36.              new OpenApiSecurityScheme
  37.              {
  38.                 Reference = new OpenApiReference
  39.                 {
  40.                      Type = ReferenceType.SecurityScheme,
  41.                     Id = "Bearer"
  42.                 }
  43.              },
  44.             new List<string>()
  45.             }
  46.          });
  47.     });
  48. }
复制代码
说明:InitSwagger方法是初始化Swagger的方法,在上一篇文章:.net core8 使用Swagger(附当前源码)  中有讲到。
 第六步:初始化Jwt
 在Program中添加一下代码,初始化Jwt

第七步:验证Jwt
做好以上步骤,jwt就可以正常使用。
当你看到图中标识时,就表示jwt初始化成功,就可以在系统中使用jwt鉴权等操作。

使用【[Authorize]】、【 [AllowAnonymous]】特性测试鉴权。
以下2个接口一个需要验证、一个不需要验证,我们来测试下。

[Authorize]开启验证测试
CheckJwt接口:开启验证,不传token

可以看到,开启jwt验证的,接口在没有传入token的情况下,访问失败。
UnCheckJwt接口:不开启验证。

以上就是.net core8 使用jwt系统鉴权的配置过程。
感谢你的耐心观看。
如果对你有帮助,请关注我微信公众号吧(*^▽^*)。

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

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

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

来源:https://www.cnblogs.com/cyzf/p/18417965
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具