在ASP.NET Core中轻松使用JwtBeare进行身份验证-天天亮点

2023-05-15 14:32:49 来源:博客园

JwtBearer简介

首先要搞清楚什么是JwtBearer,JwtBearer是ASP.NET Core的OAuth 2.0 JWT Bearer身份验证提供程序。它提供了对JWT令牌进行验证的功能,然后允许将令牌中包含的声明(claims)用于用户身份验证和授权控制。

Json Web Token (JWT)是一种Web标准,用于在不同系统间传输数据。JWT是一种可验证的和安全的方式,用于在各种应用程序之间传递信息。JWT具有一定的安全性,因为它是通过密钥对JWT进行签名的,以确保意味着不能进行篡改或伪造。


(资料图)

JWT由三个部分组成,分别为:“Header”、“Payload”和“Signature” 。其中,“header”表示JWT的元数据(元信息),用于描述加密信息和算法;“payload”表示JWT的指令部分,用于承载用户状态或授权相关的信息;“signature”表示JWT的签名信息,用于验证JWT的有效性。

JwtBearer首先使用“header”中声明的算法对JWT进行身份验证,以确保其未被篡改。然后,它将使用密钥根据“payload”中的信息生成令牌,以在用户请求中将其传递。

JwtBearer提供了配置选项,以允许您使用自定义的密钥和算法生成和验证JWT令牌。它还允许您配置应用程序特定的声明,以在用户的身份验证和授权管理中使用。

在.NET Core中使用

1)、首先新建一个APS.NET Core项目,然后在项目中添加JwtBearer包,可以用nuget包管理器添加,也可以使用nuget命令添加,命令如下:

dotnetaddpackageMicrosoft.AspNetCore.Authentication.JwtBearer

2)新建一个JwtConfig类,用了存储token相关数据。

public class JwtConfig    {        public string Key { get; set; } //key        public int Expres { get; set; } //过期时间(单位秒)        public string Issuer { get; set; }        public string Audience { get; set; }}

3)、在appsettings.json中配置jwt密钥

//配置文件appsettings.json{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft.AspNetCore": "Warning"    }  },  "AllowedHosts": "*",//JWT的配置内容"JWT":{//key必须有足够的长度      "Key": "asfasfdflj134aanjkdsjiio1232sdasdfdfkandsf12","expres":"3","Issuer":"https://localhost:7201",    "Audience": "https://localhost:7201",  }}

4)在program.cs文件注入JwtBearer

//注入配置类builder.Services.Configure(builder.Configuration.GetSection("JWT"));

5)新建一个类,专门创建token

//依赖注入privatereadonlyIOptionsSnapshotjwtconfig;publicDemo3Controller(IOptionsSnapshotjwtconfig){     this.jwtconfig = jwtconfig;}public string CreateToken(){    // 创建声明列表,即 Token 中携带的信息    List claims = new List();    claims.Add(new Claim(ClaimTypes.Name, "admin")); // 添加用户名    claims.Add(new Claim(ClaimTypes.NameIdentifier, "1080")); // 添加用户 ID    // 设置 Token 的过期时间    DateTime expres = DateTime.Now.AddSeconds(jwtconfig.Value.Expres);    Console.WriteLine($"过期时间{expres}");    // 从配置文件中获取 JWT 密钥并转换为字节数组    byte[] secbyse = Encoding.UTF8.GetBytes(jwtconfig.Value.Key);    // 创建 SymmetricSecurityKey 对象并使用 HmacSha256 算法对密钥进行签名    var secKey = new SymmetricSecurityKey(secbyse);    var credetials = new SigningCredentials(secKey, SecurityAlgorithms.HmacSha256);    // 创建 JwtSecurityToken 对象并设置声明、过期时间和签名信息    var tokenDescriptor = new JwtSecurityToken(claims: claims, expires: expres, signingCredentials: credetials);    // 生成 JWT Token 字符串并返回    string jwt = new JwtSecurityTokenHandler().WriteToken(tokenDescriptor);    return jwt;}

6)再在program.cs文件中验证传入的token,代码如下:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>{varJwtOtp=builder.Configuration.GetSection("JWT").Get();byte[]keybase=Encoding.UTF8.GetBytes(JwtOtp.Key);varseckey=newSymmetricSecurityKey(keybase);    opt.TokenValidationParameters = new()    {        ValidateIssuer = false,        ValidateAudience = false,        ValidateLifetime = true,        ValidateIssuerSigningKey = true,        IssuerSigningKey = seckey,    };    opt.Events = new JwtBearerEvents    {        //权限验证失败后执行        OnChallenge = context =>        {            //终止默认的返回结果            context.HandleResponse();stringtoken=context.Request.Headers["Authorization"];            var result = JsonConvert.SerializeObject(new { code = 401, message = "登录过期" });            if (string.IsNullOrEmpty(token))            {                result = JsonConvert.SerializeObject(new { code = 401, message = "token不能为空" });                context.Response.ContentType = "application/json";                //验证失败返回401                context.Response.StatusCode = StatusCodes.Status200OK;                context.Response.WriteAsync(result);                return Task.FromResult(result);}            try            {                JwtSecurityTokenHandler tokenheader = new();                ClaimsPrincipal claimsPrincipal = tokenheader.ValidateToken(token, opt.TokenValidationParameters, out SecurityToken securityToken);            }            catch (SecurityTokenExpiredException)            {                result = JsonConvert.SerializeObject(new { code = 401, message = "登录已过期" });                context.Response.ContentType = "application/json";                //验证失败返回401                context.Response.StatusCode = StatusCodes.Status200OK;                context.Response.WriteAsync(result);                return Task.FromResult(result);            }            catch (Exception ex)            {                Console.WriteLine(ex);                result = JsonConvert.SerializeObject(new { code = 402, message = "token令牌无效" });                context.Response.ContentType = "application/json";                //验证失败返回401context.Response.StatusCode=StatusCodes.Status200OK;                context.Response.WriteAsync(result);                return Task.FromResult(result);}            context.Response.ContentType = "application/json";            //验证失败返回401            context.Response.StatusCode = StatusCodes.Status200OK;            context.Response.WriteAsync(result);            return Task.FromResult(result);        }    };});app.UseAuthentication();//.NETCore验证中间件,必须有。并且在   app.UseAuthorization();之前

7)、在需要权限的方法或控制器上加上特性[Authorize]

[HttpGet(Name = "GetAuthorize")] [Authorize]public IEnumerable Get(){//doing}

这样就完成了JwtBearer验证的代码,具体调用见下文。

调用流程如下:

1)、首先获得Token

可以通过登录验证后生成。如果是接口程序通过接口获得。

效果如下:

2)、获取Token后在请求头添加Authorization验证,并输入获得的Token,需要注意的是Token前面需要加Bearer并添加一个空格。

效果如下:

如果Token为空的效果:

注:在swagger加token需要另外在program.cs配置,代码如下:

builder.Services.AddSwaggerGen(s=>{    //添加安全定义    s.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme    {        Description = "请输入token,格式为 Bearer xxxxxxxx(注意中间必须有空格)",        Name = "Authorization",        In = ParameterLocation.Header,        Type = SecuritySchemeType.ApiKey,        BearerFormat = "JWT",        Scheme = "Bearer"    });    //添加安全要求    s.AddSecurityRequirement(new OpenApiSecurityRequirement {    {        new OpenApiSecurityScheme{            Reference =new OpenApiReference{                Type = ReferenceType.SecurityScheme,                Id ="Bearer"            }        },new string[]{ }    }});});

添加好重启程序后会在swagger的右上方增加如下按钮,打开按钮根据提示即可完成添加。

结语

本文介绍了ASP.NET Core如使用JwtBearer,以及JwtBearer生成token验证的验证过程。希望对你有所收获,欢迎留言或吐槽。

来源公众号:DotNet开发跳槽

标签:

环球热门:铂科新材(300811):股东减持股份数量过半的进展

2022年12月28日公告发布

2022-12-28 15:50:59

世界即时看!博彩公司遭黑客攻击,67000账户被窃,损失超30万!公司称登录信息由第三方泄露

大数据文摘出品作者:Caleb12月19日,卡塔尔世界杯落幕,总决赛可以说是让观众一直紧绷神经。梅西带领的...

2022-12-28 12:23:42

全球快播:保龄宝:公司麦芽糊精产品目前产销正常

每经AI快讯,有投资者在投资者互动平台提问:董秘你好,请问公司的麦芽糊精销量是否有明显提升?谢谢。...

2022-12-28 08:57:26

天天动态:当持有的基金亏损时 应该加仓还是割肉?

当持有的基金亏损时应该加仓还是割肉?

2022-12-27 21:35:47

全球速看:报废面包车在异地上路,武昌交警走访7个村镇“回收”

为方便货运,男子低价购买隐患面包车上路行驶,被交警抓获。12月26日,武汉市公安局武昌区交通大队经过...

2022-12-27 16:48:38

全球热消息:A股异动 | 裕兴股份涨5% 拟定增募资不超7亿元用于产能扩建、补充流资

格隆汇12月27日丨裕兴股份涨5 61%,报13 92元,总市值40亿元。裕兴股份26日披露2022年度向特定对象发...

2022-12-27 13:21:48

快消息!马斯克入选年度最糟科技老板:扎克伯格、贝索斯一同入列

2022年即将结束,在这一年里,世界上发生了很多事,而在科技公司行伍中,更是如同经历了一场噩梦。”,...

2022-12-27 07:52:48

前沿资讯!大悦城: 关于全资子公司收购其控股子公司少数股东权益的公告

大悦城控股集团股份有限公司第十届董事会公告证券代码:000031      证券简称:大悦城     ...

2022-12-26 18:53:48

世界球精选!日本各地暴雪已致17人死亡、百余人受伤

北海道纹别市发生大规模停电(朝日电视台)海外网12月26日电 据日本富士电视台26日报道,12月中旬起,...

2022-12-26 14:29:00

全球热点评!沪陕高速合肥至大顾店段 “四改八”扩建正式通车

沪陕高速合肥至大顾店段“四改八”扩建正式通车

2022-12-26 08:48:10
x 广告
x 广告

Copyright ©  2015-2022 现在经营网版权所有  备案号:粤ICP备18023326号-5   联系邮箱:855 729 8@qq.com