首页 > 其他分享 >NET Core WebAPI 认证授权之JWT

NET Core WebAPI 认证授权之JWT

时间:2023-06-02 18:44:05浏览次数:43  
标签:WebAPI Core 验证 JWT Token NET

@@.net core token 非对称加密   --Google

  -->@@wepapi 认证授权之jwt

 

NET Core WebAPI 认证授权之JWT(二):HMAC算法实操

 

 

一、前言
在上一篇 《.NET Core WebAPI 认证授权之JWT(一):JWT介绍》中讲到了JWT的组成,分为三部分,其中标头(header)和载荷(payload)都只是简单的将json内容进行base64编码,而签名部分就要复杂一点,通常会使用HmacSha256或RsaSha256算法进行签名。关于两种算法在上一篇中也有简单的介绍,本文就不多做介绍,直接进行实操落地。本文先介绍使用HmacSHA256算法签名的JWT。开发环境:

VisualStudio 2019 16.8.3

ASP.NET Core 5.0  

二、生成Token
生成签名的算法虽然复杂,但好在.NET有内置的API来生成相应算法的JWT。

1.创建一个用于颁发Token项目,当然也可以将颁发Token步骤合并到API项目中。


2.引入Nuget包Microsoft.AspNetCore.Authentication.JwtBearer(APS.NET Core 5.0 WebAPI项目模板如果勾选Enable OpenAPI会自带这个包),生成Token主要用到了这个包关联的Microsoft.IdentityModel.Tokens和System.IdentityModel.Tokens.Jwt两个t程序集。


3.在AuthenticationController中创建一个登录接口,验证用户的账号密码。
public string Login([FromForm] string userName, [FromForm] string password){ //验证账号密码 if (userName == password) { //返回JWT return ""; } else { //返回账号密码错误 return ""; }}
1.
4.验证账号密码正确后,生成JWT。
if (userName == password) //验证账号密码{ #region 生成Token var claims = new[] { new Claim(ClaimTypes.Name, userName) }; //密钥 网上随便生成的 建议写配置文件中 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB")); //定义签名的密钥、算法 var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); //创建Token var token = new JwtSecurityToken(issuer: "leo96.com", //发布者 随便写 可用于验证 建议写配置文件中 audience: "leo96.com", //受众 随便写 可用于验证 建议写配置文件中 claims: claims, //声明 存储其他信息 expires: DateTime.Now.AddMinutes(5), //过期时间 可写配置文件中 signingCredentials: creds); //凭证 //写入Token string returnToken = new JwtSecurityTokenHandler().WriteToken(token); #endregion return returnToken;}
1.
这是.NET自带的生成JWT的API,此处使用的是HmacSha256算法,其中需要的Key是从网上找的,貌似随便填什么也可以,但是好像不能小于32个字节?(此处不太清楚)
三、Token认证和授权
1.创建API项目,引入Nuget包Microsoft.AspNetCore.Authentication.JwtBearer(APS.NET Core 5.0 WebAPI项目模板如果勾选Enable OpenAPI会自带这个包)。
2.添加JWT认证服务和中间件。
#region 添加JWT认证服务services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, //是否验证Issuer ValidateAudience = true, //是否验证Audience ValidateLifetime = true, //是否验证有效时间 ValidateIssuerSigningKey = true, //是否验证key ValidIssuer = "leo96.com", //建议配置文件读取 ValidAudience = "leo96.com", //建议配置文件读取 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI2a2EJ7m872v0afyoSDJT2o1+SitIeJSWtLJU8/Wz2m7gStexajkeD+Lka6DSTy8gt9UwfgVQo6uKjVLG5Ex7PiGOODVqAEghBuS7JzIYU5RvI543nNDAPfnJsas96mSA7L/mD7RTE2drj6hf3oZjJpMPZUQI/B1Qjb5H3K3PNwIDAQAB")) //建议配置文件读取 }; });#endregion
1.
#region 认证中间件app.UseAuthentication();#endregion
1.
注意:开启了这些验证后,这里的Issuer、Audience、SecurityKey等需要和之前生成Token时候所使用的相关信息一致。

3.添加授权中间件
#region 授权中间件app.UseAuthorization();#endregion
1.
PS:WebAPI项目模板默认自带授权中间件。

4.权限拦截


使用Authorize特性标注在Controllor或Action上后,访问相应接口就需要JWT验证,验证不通过,就会返回401状态码。

四、使用
同时运行两个程序,我们先请求Login接口,拿到Token,然后请求API带保护的资源时,在请求标头中带上Token,即可。(详见上篇 《.NET Core WebAPI 认证授权之JWT(一):JWT介绍》)
-----------------------------------
©著作权归作者所有:来自51CTO博客作者mob604756f953bb的原创作品,请联系作者获取转载授权,否则将追究法律责任
.NET Core WebAPI 认证授权之JWT(二):HMAC算法实操
https://blog.51cto.com/u_15127615/2755486

标签:WebAPI,Core,验证,JWT,Token,NET
From: https://www.cnblogs.com/wl-blog/p/17452691.html

相关文章

  • net core 读取enum上的描述信息
    https://github.com/xin9le/FastEnum简单使用:enumCompany{[EnumMember(Value="Apple,Inc.")]Apple=0,}varvalue=Company.Apple.GetEnumMemberValue();//Apple,Inc.dotnetaddpackageFastEnumPM>Install-PackageFastEnum测试......
  • net core-jwt
    namespaceJWTWebApi.JWT;publicclassJwtOptions{///<summary>///签发者///</summary>publicstringIssuer{get;set;}///<summary>///接收者///</summary>publi......
  • 基于shiro+jwt的真正rest url权限管理,前后端分离
    bootshiro&usthebootshiro是基于springboot+shiro+jwt的真正restfulURL资源无状态认证权限管理系统的后端usthe是restfulURL资源无状态认证权限管理系统的前端,基于angular+typeScript+adminLte区别于一般,提供页面可配置式的,动态的restfulapi安全管理支持数据传输动态......
  • .net core 及 pgsql 在 Docker 中部署运行
     .netcore及pgsql在Docker中部署运行当前运行linux系统为: CentOSStreamrelease8.netsdk7.0、pgsql12.0、nginx1.14.1、docker 24.0.1在安装前,建议更新系统中依赖包:sudoyumupdate本次所用到的工具主要有:1、docker:学习;2、postg......
  • .net core Abp定时任务实现
     publicclassUseTimeJob:Job//重点是继承Job {publicreadonlyIUserCourseJobTimeService_userCourseJobTimeService;publicreadonlyIOrganizationAppService_organizationAppService;privatereadonlyIOfflineCourseLiveRecordServic......
  • 使用ef core进行一对多映射
    1.创建数据库关系图2.创建主外键关系3.编写代码4.输出结果 ......
  • 开源.NetCore通用工具库Xmtool使用连载 - 发送短信篇
    【Github源码】《上一篇》介绍了Xmtool工具库中的发送邮件类库,今天我们继续为大家介绍其中的发送短信类库。发送短信就像发送邮件一样,在软件系统中使用非常普遍,甚至比发送邮件还要常见,有些甚至是软件标配功能;例如现在的短信验证码登录、通过短信找回密码等等。发送短信需要......
  • JWT oss登录
    可参考:https://juejin.cn/post/7106702145520402468流程组成部分1.Header(头)作用:记录令牌类型、签名算法等例如:{“alg":"HS256","type","JWT}2.Payload(有效载荷)作用:携带一些用户信息例如{"userId":"1","username":"mayikt"}3.Sign......
  • JWT
    jwt优点使用cookie的话,不支持跨域,使用jwt的话放置到请求头里面支持跨域支持移动端jwt的认证流程第一步:通过用户名和密码进行验证的Post请求,https类型第二步:验证通过后将用户的基本信息,作为jwt的载体,和jwt的头部分别进行base64编码,形成一个JWTToken字符串第三步:将JWTToke......
  • 前端 React + vite + Typescript 后端 java + springmvc + jwt 跨域 解决方案
    首先后端配置跨域:web.xml文件: <!--配置跨域--><filter><filter-name>header</filter-name><filter-class>org.zhiyi.config.Cross</filter-class></filter><filter-mapping><......