AI智能
改变未来

jwt-在asp.net core中使用jwt

JWT学习文章:

第一篇:JWT原理

第二篇:JWT原理实现代码

第三篇:在asp.net core中的使用JWT

前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证。如果要看前两篇文章,点击上面的连接就能够链接过去。

第二篇文章实现jwt原理时有同学就说每个成熟的框架中都有相应的jwt实现或集成。说的不错,每个主流的框架中几乎毫无例外的都集成了jwt的实现,但是我们上篇文章的重点是希望大家能够明白原理,和这些框架中实现的基本思路,如无特殊情况也没有必要自己来写。

那么这篇文章我们就来看看asp.net core中jwt如何使用!

注意,本文主要是代码,必要的文字说明我已经都在代码注释中写出来了。文末我会给出源码地址。

新建一个空的asp.net core项目:

新建一个类Const放置一些常量:

public class Const{public const string SecurityKey = \"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSfLGu+kcFDcJUCV46J+SbgR0lNc2NqgCGzojQTWW9xqjuzPF3mpisvTggYZSGfBzN+88YLZYbBLrDTUMJ4nTieElbP6SHkBFu8F+7fFBi7w3UPsaAXDr2E2srQYU5ZlKAcFBoNajNWj3sfSVRoYRPdqDTj4WdJlUPSNGz0wgRrQIDAQAB\";public const string Domain = \"http://localhost:5000\";}

在Startup中向应用添加jwt验证服务:

//添加jwt验证:services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => {options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,//是否验证IssuerValidateAudience = true,//是否验证AudienceValidateLifetime = true,//是否验证失效时间ClockSkew = TimeSpan.FromSeconds(30),ValidateIssuerSigningKey = true,//是否验证SecurityKeyValidAudience = Const.Domain,//AudienceValidIssuer = Const.Domain,//Issuer,这两项和前面签发jwt的设置一致IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey))//拿到SecurityKey};});

管道中添加jwt验证:

//添加jwt验证app.UseAuthentication();

由于管道有执行顺序的特性,因此最好放在管道的开始位置。

添加登录获取token的接口:

[ApiController][Route(\"[controller]\")]public class AuthController : ControllerBase{[AllowAnonymous]//指定此属性应用于的类或方法不需要授权。[HttpGet]public IActionResult Get(string userName, string pwd){if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(pwd)){var claims = new[]{new Claim(JwtRegisteredClaimNames.Nbf,$\"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}\") ,new Claim (JwtRegisteredClaimNames.Exp,$\"{new DateTimeOffset(DateTime.Now.AddMinutes(30)).ToUnixTimeSeconds()}\"),new Claim(ClaimTypes.Name, userName)};var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Const.SecurityKey));var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);var token = new JwtSecurityToken(issuer: Const.Domain,audience: Const.Domain,claims: claims,expires: DateTime.Now.AddMinutes(30),signingCredentials: creds);return Ok(new{token = new JwtSecurityTokenHandler().WriteToken(token)});}else{return BadRequest(new { message = \"username or password is incorrect.\" });}}}

方法中对用户名和密码的验证只是简单的验空,实际应用中会更复杂,也会与数据库中的数据比对。

接下来就是对jwt的应用了。

新建HomeController,用于验证jwt是否成功启用:

[ApiController][Route(\"[controller]\")]public class HomeController : ControllerBase{[HttpGet][Route(\"api/value1\")]public ActionResult<IEnumerable<string>> Get(){return new string[] { \"value1\", \"value1\" };}[HttpGet][Route(\"api/value2\")][Authorize]public ActionResult<IEnumerable<string>> Get2(){return new string[] { \"value2\", \"value2\" };}}

其中Get()方法不需要验证,Get2()需要验证。

测试:

先测试Get()方法(接口名称时api/value1),因为此方法不用验证:

验证成功!!!

接下来测试Get2():

访问Get2()方法的接口名api/value2,粘贴上面获得的token到header中:

验证成功!!!

总结:至此,使用asp.net core 自带的jwt方法就完成了。

源码地址:https://gitee.com/jingboweilanGO/Demo_jwt_core.git

说明:Demo-jwt-core是本篇文章涉及到的源码,是使用asp.net core 自带的jwt方法;

   Demo-jwt-core2是上一篇文章的源码,根据jwt原理实现的代码。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » jwt-在asp.net core中使用jwt