.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 ...
随机推荐
- spring boot:使用分布式事务seata(druid 1.1.23 / seata 1.3.0 / mybatis / spring boot 2.3.2)
一,什么是seata? Seata:Simpe Extensible Autonomous Transcaction Architecture, 是阿里中间件开源的分布式事务解决方案. 前身是阿里的F ...
- 异常java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value
通过HttpServletResponse的addCookie(Cookie cookie)向客户端写cookie信息,这里使用的tomcat版本是8.5.31,出现如下报错: java.lang.I ...
- 攻防世界-web2
打开题目直接一梭子代码,给我们了个加密的密文,然我们解出flag 审计一波 先时将flag字符串逆序,然后每一个ascii码数值+1,然后base64加密,然后逆序,然后再rot13加密 得到加密的密 ...
- ElasticSearch详细笔记
ElasticSearch详细笔记 什么是ElasticSearch Elasticsearch(简称ES)是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Luce ...
- css自定义字体----使用外部字体文件
css外部自定义字体 给大家分享一个使用的css小技巧!记得收藏呀!相信大家在浏览各种网站会见到各种奇形怪状花里胡哨的文字,还有就是一些浏览器兼容性问题,不会支持一些特殊的字体!给大家分享一个极其简单 ...
- leetcode学习总结
转自https://leetcode-cn.com/ 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以 ...
- uart接口介绍和认识
接口/总线/驱动 UART (Universal Asynchronous Receiver/Transmitter) 通用异步收发器. UART是用于控制计算机与串行设备的芯片.有一点要注意的是,它 ...
- Linux中文件与目录的区别
普通文件:存储普通数据,一般就是字符串. 目录文件:存储了一张表,该表就是该目录文件下,所有文件名和索引(inode)的映射关系. 通常父目录会存储有它目录下文件的索引映射,说白了就是一张对应关系的索 ...
- Vue框架 周期
用Vue框架,熟悉它的生命周期可以让开发更好的进行. 首先先看看官网的图,详细的给出了vue的生命周期: 它可以总共分为8个阶段: beforeCreate(创建前), created(创建后), b ...
- Win32之创建进程
CreateProcess函数介绍 BOOL CreateProcessA( LPCSTR lpApplicationName, //可执行文件的名称完整的路径+程序名字) LPSTR lpComma ...