.net core集成JWT(基础)
关于JWT的基本概念,如果有不清晰的同学,请点击这里,就不在这里赘述了。接下来聊聊JWT是怎么发挥作用的。
第一,安装nuget包
Microsoft.AspNetCore.Authentication.JwtBearer
第二,配置【Startup】
首先是【ConfigureServices】方法,下面要写一大堆进去
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(x =>
{
x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters()
{
ValidateLifetime = true,
LifetimeValidator = (notBefore, expires, securityToken, validationParameters) =>
{
bool t = DateTime.UtcNow < expires;
return t;
}, ValidateAudience = false, ValidateIssuer = true,
ValidIssuer = jwtConfig.Issuer, ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtConfig.Key)),
};
});
虽然看起来多,实际上逻辑很清晰,我在这里简单解释一下:
RequireHttpsMetadata:获取或设置元数据地址或权限是否需要HTTPS,默认为true
SaveToken:是否将信息存储在token中
TokenValidationParameters:这部分网上有很多版本,其中大部分都是写满的,但这对新手不太友好;而且也不是必须写满。先解释一些代码里的验证开关(设置true、false的我称为验证开关)
ValidateLifetime——是否验证过期时间
ValidateAudience——是否验证被发布者
ValidateIssuer——是否验证发布者
ValidateIssuerSigningKey——是否验证签名
查看框架代码你会发现更多的验证开关,这里就不一一解释了:
然后在【Configure】添加引用:
app.UseAuthentication();
app.UseAuthorization();
这里的顺序不能颠倒。第一行是开启身份验证,第二行是开启授权。
第三,配置
JWT需要进行一些简单的配置来确保安全,至于配置写在哪里都可以,我是放在appsettings内:
"JWT": {
"Issuer": "发布者,一般是一个域名",
"Key": "一个新的guid",
"Expires": 600(秒)
}
第四,生成JWT
为了方便大家理解,我这边直接上代码:
public static string GetToken(IOptions<JwtConfig> _options, dynamic customer)
{
var claims = new[] {
new Claim(ClaimTypes.Name,"JWT"),
new Claim("ID",customer.ID),
new Claim("WxOpenID",customer.WxOpenID),
new Claim("Father",customer.Father)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.Value.Key)); var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken(
issuer: _options.Value.Issuer,
claims: claims,
expires: DateTime.UtcNow.AddMinutes(_options.Value.Expires),
signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(token);
}
如果在token中想要携带某些参数,可以使用Claim进行封装。
接下来还有3个小步骤:
1、对配置文件中的key进行加密,得到对称加密key。
2、使用上一步得到的结果生成数字证书。
3、配置token的内容。
最后,就可以生成jwt并且返回了。
第五,获取JWT内容
正常情况下,JWT除了做验证以外,还要有一些参数做辅助。上面说了参数传递是通过定义claim实现的,那么怎么合法的解析呢?还是直接上代码:
public static JwtInfo GetInfoFromToken(string token = null)
{
if (token is null)
return null; string tokenStr = token.Replace("Bearer ", ""); var handler = new JwtSecurityTokenHandler(); var payload = handler.ReadJwtToken(tokenStr).Payload; var claims = payload.Claims; JwtInfo info = new JwtInfo()
{
ID = claims.First(claim => claim.Type == "ID")?.Value,
WxOpenID = claims.First(claim => claim.Type == "WxOpenID")?.Value,
Father = claims.First(claim => claim.Type == "Father")?.Value
}; return info;
}
这一段没什么好讲的,对应的名字拿到对应的参数。不过如果参数不存在这里会报错,所以尽量规范一点,首位呼应。
第六,代码应用
JWT也生成了,同时也可以反向解析传递的参数了,该如何应用到代码中去呢?这里要用到特性。
为需要进行验证的控制器添加【Authorize】特性,这个控制器下的所有方法在外部调用时就都需要JWT认证才可顺利调用,否则返回401(未授权)。如果不是全部方法都需要认证,那么可以为方法添加【AllowAnonymous】特性来忽略认证限制,如图:
最后
基于JWT可以延伸出更多玩法,同学们有好的想法欢迎讨论。
.net core集成JWT(基础)的更多相关文章
- asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
[前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...
- asp.net core 集成JWT(一)
[什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...
- 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用
什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...
- 如何简单的在 ASP.NET Core 中集成 JWT 认证?
前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...
- ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...
- ABP官方文档翻译 6.2.1 ASP.NET Core集成
ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...
- ASP.NET Core 基于JWT的认证(二)
ASP.NET Core 基于JWT的认证(二) 上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍,这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用 ...
- ASP.NET Core 基于JWT的认证(一)
ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...
- asp.net core集成MongoDB
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...
随机推荐
- Python+Appium自动化测试(6)-元素等待方法与重新封装元素定位方法
在appium自动化测试脚本运行的过程中,因为网络不稳定.测试机或模拟器卡顿等原因,有时候会出现页面元素加载超时元素定位失败的情况,但实际这又不是bug,只是元素加载较慢,这个时候我们就会使用元素等待 ...
- day34 Pyhton 网络编程
一今日内容 # 函数 # 面向对象 # 进阶 # 网络编程 4 # 并发编程 6-7 # 概念 # 网络基础 # 局域网的概念 # 交换机和路由器的工作流程 # ip地址 # mac地址 # 子网掩码 ...
- day23 Pyhton学习 昨日回顾.re模块.序列化模块
一.昨日回顾 #__file__查看当前文件所在的绝对路径 #time 时间模块 time.time 获取当前时间戳时间 字符串->time.strptime->结构化->mktim ...
- 震惊!OI居然还考天体运动
看图说话 看这里: 标签: 标签竟然还是模拟,简直活到爆,物理老师狂喜
- golang 爬取百度贴吧绝地求生页面
package main import ( "github.com/antchfx/htmlquery" "io" "net/http" & ...
- centos8平台使用mpstat监控cpu
一,mpstat的用途 mpstat是 Multiprocessor Statistics的缩写,是实时cpu监控工具. 在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU ...
- IDEA 半天卡住buid(编译)不动——解决办法(适用于maven及gradle)及定位思路
[号外号外!] 最终解决办法并不复杂,关键在于"遇见问题,怎么样层层分析,多条路径试错,最终解决问题的思路或者能力"--资深码农的核心竞争力之一 背景 今天结束完最近2个月的一个项 ...
- MySQL历史
MySQL历史 马云生气了 去IOE活动 1979年 研发一个引擎 1996年 发布MySQL1.0 1999年 瑞典注册AB公司 2003年 MySQL 5.0版本 提供试图.存储过程 具有了一些企 ...
- update不能直接使用select的返回结果
update不能直接使用select的返回结果,这是会报错的,这是SQL的语法规定的,若想在update中与select结合使用,sql需要这样写: 1.其中field1,field2为表中的字段名 ...
- OpenCV(c++)-1 安装和配置OpenCV4.4(Windows+visual studio 2019)
@ 目录 安装OpenCV4 在Windows系统安装OpenCV4 配置visual studio 2019 配置包含路径 验证配置结果 安装OpenCV4 OpenCV是一个基于BSD许可(开源) ...