.Net Core官方JWT要如何授权验证,一起看看吧

今天主要介绍关于.Net Core官方JWT要如何授权验证,文中经过示例代码介绍的非常详细,对我们的学习或许作业具有一定的参考学习价值,有需求的朋友们下面跟着小编来看看

目录

什么是JWT?

什么时候应该运用JWT?

JWT结构是什么?

如何运用JWT

.net core的JWT验证授权

进阶

总结

什么是JWT?

JSON Web令牌(JWT)是一个敞开标准(RFC 7519),它界说了一种紧凑且自包括的办法,用于在各方之间安全地传输信息作为JSON目标。由于此信息是经过数字签名的,因而能够被验证和信赖。能够运用隐秘(运用HMAC算法)或运用RSA或ECDSA的公钥/私钥对对JWT进行签名。

虽然能够对JWT进行加密以供给双方之间的保密性,但我们将重点重视已签名的令牌。签名的令牌能够验证其中包括的声明的完整性,而加密的令牌则将这些声明隐藏在其他方的面前。当运用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。由于缺乏安全性,所以不能把如暗码等敏感信息放在令牌中。

什么时候应该运用JWT?

以下是JSON Web令牌有用的一些状况:

授权:这是运用JWT的最常见计划。一旦用户登录,每个后续恳求将包括JWT,然后允许用户拜访该令牌允许的路由,服务和资源。单一登录是当今广泛运用JWT的一项功能,由于它的开支很小而且能够在不同的域中轻松运用。

信息交换:JSON Web令牌是在各方之间安全传输信息的好办法。由于能够对JWT进行签名(例如,运用公钥/私钥对),所以您能够确定发件人是他们所说的人。此外,由于签名是运用标头和有效负载计算的,因而您还能够验证内容是否未被篡改。

JWT结构是什么?

JSON Web令牌以紧凑的办法由三部分组成,这些部分由点(.)分隔,分别是:

标头

有效载荷

签名

因而,JWT一般如下所示。

xxxxx.yyyyy.zzzzz

标头:一般由两部分组成,令牌类型和运用的签名算法。

{

“alg”: “HS256”,

“typ”: “JWT”

}

有效载荷:有三种阐明类型,预界说声明、公共声明和私有声明。声明名称仅是三个字符,由于JWT是紧凑的

预界说声明:包括iss(宣布者), exp(到期时刻), sub(主题), aud(受众)等,是引荐的可是不是强制的能够没有。

公共声明:公共声明,这个部分能够随意界说,可是要注意和 IANA JSON Web Token 抵触。

私有声明:这个部分是同享被确定信息中自界说部分。

签名:要创立签名部分,您有必要获取编码的标头,编码的有效负载,秘要,标头中指定的算法,并对其进行签名。

例如,假如要运用HMAC SHA256算法,则将经过以下办法创立签名:

HMACSHA256(

base64UrlEncode(header) + “.” +

base64UrlEncode(payload),

secret)

签名用于验证消息在此过程中没有更改,而且对于运用私钥进行签名的令牌,它还能够验证JWT的发送者是它所说的实在身份。

组合在一同如下为输出是三个由点分隔的Base64-URL字符串:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUyMDAiLCJhdWQiOlsiYXBpIiwiYXBpIl0sIkd1aWQiOiIzM2NhZmJkNS1jZWEyLTRjOWMtYWZlYS01MDYyZjM3YWUyOTAiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsic3lzdGVtIiwiYWRtaW4iXSwiZXhwIjoxNjA2NjU2NjI0fQ.

JvDHuowbOnWiyxMIFc9gG5rw1LSSc0xx68L31oRfxS0

如何运用JWT

每当用户想要拜访受保护的路由或资源时,用户署理都应发送JWT,一般运用承载形式在Authorization标头中发送JWT 。标头的内容应如下所示:

Authorization: Bearer

在某些状况下,这能够是无状况授权机制。服务器的受保护路由将在Authorization标头中检查有效的JWT ,假如存在,则将允许用户拜访受保护的资源。假如JWT包括必要的数据,则能够减少查询数据库中某些操作的需求,虽然这种状况并非总是如此。

假如令牌是在Authorization标头中发送的,则跨域资源同享(CORS)不会成为问题,由于它不运用cookie。

下图显现了如何获取JWT并将其用于拜访API或资源:

应用程序或客户端向授权服务器恳求授权。这是经过不同的授权流程之一履行的。例如,典型的契合OpenID Connect的Web应用程序将/oauth/authorize运用授权代码流经过端点。

颁发授权后,授权服务器会将拜访令牌返回给应用程序。

该应用程序运用拜访令牌来拜访受保护的资源(例如API)。

请注意,运用签名的令牌,令牌中包括的一切信息都会暴露给用户或其他方,即使他们无法更改它。这意味着您不应将秘要信息放入令牌中。

.net core的JWT验证授权

我们直接新建一个.net core webapi的项目,我这儿版别是3.1的

  1. 先运用nuget装置:Microsoft.AspNetCore.Authentication.JwtBearer。注意版别和.net core版别的兼容。net5的支撑5.0.0+的版别,不然就用对应能够用的低版别吧。

  2. 在appsettings.json装备文件中写好我们的 JWT 的装备参数如下:

“Jwt”: {

“Secret”: “your-256-bit-secret”,

“Iss”: “https://localhost:44355”,

“Aud”: “api”

  1. 在Startup.cs的ConfigureServices办法中增加授权认证如下:

var jwtConfig = Configuration.GetSection(“Jwt”);

//生成密钥

var symmetricKeyAsBase64 = jwtConfig.GetValue(“Secret”);

var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);

var signingKey = new SymmetricSecurityKey(keyByteArray);

//认证参数

services.AddAuthentication(“Bearer”)

.AddJwtBearer(o =>

{

o.TokenValidationParameters = new TokenValidationParameters

{

ValidateIssuerSigningKey = true,//是否验证签名,不验证的画能够篡改数据,不安全

IssuerSigningKey = signingKey,//解密的密钥

ValidateIssuer = true,//是否验证发行人,便是验证载荷中的Iss是否对应ValidIssuer参数

ValidIssuer = jwtConfig.GetValue(“Iss”),//发行人

ValidateAudience = true,//是否验证订阅人,便是验证载荷中的Aud是否对应ValidAudience参数

ValidAudience = jwtConfig.GetValue(“Aud”),//订阅人

ValidateLifetime = true,//是否验证过期时刻,过期了就拒绝拜访

ClockSkew = TimeSpan.Zero,//这个是缓冲过期时刻,也便是说,即使我们装备了过期时刻,这儿也要考虑进去,过期时刻+缓冲,默许好像是7分钟,你能够直接设置为0

RequireExpirationTime = true,

};

});

在Configure办法中增加 app.UseAuthentication() 和 app.UseAuthorization() 注意方位需求放置的方位:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

{

if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthentication();

app.UseAuthorization();

app.UseEndpoints(endpoints =>{ endpoints.MapControllers();});

  1. 生成jwt令牌,在默许生成的控制器 WeatherForecastController 中增加如下生成令牌的办法:

[HttpPost]

public IActionResult Authenticate()

{

var jwtConfig = Configuration.GetSection(“Jwt”);

//秘钥,便是标头,这儿用Hmacsha256算法,需求256bit的密钥

var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.GetValue(“Secret”))), SecurityAlgorithms.HmacSha256);

//Claim,JwtRegisteredClaimNames中预界说了很多种默许的参数名,也能够像下面的Guid一样自己界说键名.

//ClaimTypes也预界说了很多类型如role、email、name。Role用于赋予权限,不同的人物能够拜访不同的接口

//相当于有效载荷

var claims = new Claim[] {

new Claim(JwtRegisteredClaimNames.Iss,jwtConfig.GetValue(“Iss”)),

new Claim(JwtRegisteredClaimNames.Aud,jwtConfig.GetValue(“Aud”)),

new Claim(“Guid”,Guid.NewGuid().ToString(“D”)),

new Claim(ClaimTypes.Role,“system”),

new Claim(ClaimTypes.Role,“admin”),

};

SecurityToken securityToken = new JwtSecurityToken(

signingCredentials: securityKey,

expires: DateTime.Now.AddMinutes(2),//过期时刻

claims: claims

);

//生成jwt令牌

return Content(new JwtSecurityTokenHandler(www.cartier1314.com).WriteToken(securityToken));

}

  1. 运用jwt控制接口的拜访,我们在一个接口上增加一个特性 [Authorize(Roles =“admin”)],表明需求有admin这个人物的jwt令牌才能拜访,没有roles参数的话表明只要是可用的令牌就能够拜访,多个role人物能够叠加多个特性:

[HttpGet]

[Authorize(Roles = “admin”)]

[Authorize(Roles = “system”)]

public IEnumerableGet()

{

var rng = new Random();

return Enumerable.Range(1, 5).Select(index => new WeatherForecast

{

Date = DateTime.Now.AddDays(index),

TemperatureC = rng.Next(-20, 55),

Summary = Summaries[rng.Next(Summaries.Length)]

})

.ToArray();

}

6.测试,然后我们用postman就能够测试了,能够看到非常成功有数据。

进阶

认证的时候能够增加事情,如下面的认证失利事情、接纳参数事情能够获取url上的参数作为令牌而不是经过http的恳求头的Authorization。

services.AddAuthentication(“Bearer”)

.AddJwtBearer(o =>

{

o.Events = new JwtBearerEvents()

{

OnMessageReceived = context =>

{

context.Token = context.Request.Query[“access_token”];

return Task.CompletedTask;

},

OnAuthenticationFailed = context =>

{

// 假如过期,则把<是否过期>增加到,返回头信息中

if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))

{

context.Response.Headers.Add(“Token-Expired”, “true”);

}

return Task.CompletedTask;

}

};

});

总结到此这篇关于.Net Core官方JWT授权验证的文章就介绍到这了,更多相关.Net Core官方JWT授权验证内容请搜索脚本之家以前的文章或持续阅读下面的相关文章希望我们今后多多支撑脚本之家!

来源:脚本之家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值