.net core中使用jwt进行认证
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公用/专用密钥对对JWT进行签名。
传统token
当用登录成功后,服务端会根据用户的信息生成一个token,然后将token保存到redis中。当用户再次访问时会携带这个token访问,这时服务端会先去查一下redis,看有没有这个token或者是查看这个token是否过期,当redis中没有这个token时,登录验证失败,提示用户登录失败,否则直接放行。当然传统的token也有其一定的优势,比如说返回token能屏蔽用户的真实信息,临时且唯一。但当并发数量大的时候,这种模式存在的问题就是,用户一访问就去查redis,会增加redis的压力。
JWT
jwt通常由三部分组成分别是:
- Header
- Payload
- Signature
Header通常由两部分组成,令牌的类型(即JWT)和所使用的签名算法,例如HMAC SHA256或RSA。
{
"alg": "HS256",
"typ": "JWT"
}
Payload 令牌的第二部分是有效负载,其中包含声明。声明是有关实体(通常是用户)和其他数据的声明。有以下三种类型:注册声明,公共声明和私人声明。
标准注册声明
iss:jwt的发行方
sub:jwt声明的主题
aud:jwt所面向的群体
exp:到期时间
nbf:(不早于)声明标识了JWT之前的时间不得接受处理
公共声明
使用JWT的人可以随意定义这些声明。主要包括用户的各种信息但要避免私密的信息
私密声明
私有声明是发布者和面向者所共同定义的声明
{
"phone": "",
"name": "John Doe",
"admin": true
}
Signature
signature是一个签名信息,是对前两部分进行base64加密和secret一起进行组合加密,这里的secret就相当于一个加盐的操作
例如,如果要使用HMAC SHA256算法,则将通过以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
最后生成的token就是下面的这种格式
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoid293byIsInN1YiI6InN1Yk5hbWUiLCJuYmYiOiIxNTk5MzY3NjUwIiwiZXhwIjoxNTk5MzY3OTUwLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQ5OTk5IiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo0OTk5OSJ9.cqn55T-VFKkKuG2hSdQ_WNqjBhYiK9o3LvK-E9a893Y
通过jwt的工作原理,我们会发现jwt与传统的token相比,jwt不用去redis中查询对应的token信息而是通过定义的加密算法去进行校验,这一块算是对token的重大改进吧
.Net Core中使用JWT
1.通过nuget安装 Microsoft.AspNetCore.Authentication.JwtBearer
2.在ConfigureServices中进行相应的注册
//使用jwt进行认证
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true, //是否验证超时 当设置exp和nbf时有效
ValidateIssuerSigningKey = true, ////是否验证密钥
ValidAudience = "http://localhost:49999",//Audience
ValidIssuer = "http://localhost:49998",//Issuer,这两项和登陆时颁发的一致
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("123456888jdijxhelloworldprefect")), //拿到SecurityKey
//缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟 //注意这是缓冲过期时间,总的有效时间等于这个时间加上jwt的过期时间,如果不配置,默认是5分钟
ClockSkew = TimeSpan.FromMinutes() //设置过期时间
};
});
2.在Configure中添加认证授权中间件
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseAuthentication(); //认证
app.UseAuthorization(); //授权
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
3.登录成功后生成token并返回客户端
[HttpPost]
public IActionResult Login(string username,string password)
{
var user = bll.GetUser(username, password);
if (user != null)
{
var claims = new[]
{
new Claim(ClaimTypes.Name,username),
new Claim(JwtRegisteredClaimNames.Sub, "subName"),
new Claim(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(DateTime.Now).ToUnixTimeSeconds()}"), //NotBefore token生效时间
new Claim(JwtRegisteredClaimNames.Exp, $"{new DateTimeOffset(DateTime.Now.AddMilliseconds(1)).ToUnixTimeSeconds()}") //Expiration 到期时间,按秒数计算
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("123456888jdijxhelloworldprefect")); //key的长度要超过16个字符,不然回抛出异常
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: "http://localhost:49999", //颁发token的web应用程序
audience: "http://localhost:49998",
claims: claims,
expires: DateTime.Now.AddMinutes(),
signingCredentials: creds);
return Ok(new
{
token = new JwtSecurityTokenHandler().WriteToken(token),success=true,message="登录成功"
});
}
else
{
return BadRequest(new { success = false, message = "登录失败,请重试" });
}
}
用postman进行测试
1.调用登录接口生成token

2.不加token去访问保护的资源

3.带上生成的token再次访问

.net core中使用jwt进行认证的更多相关文章
- ASP.NET Core系列:JWT身份认证
1. JWT概述 JSON Web Token(JWT)是目前流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io JWT的实现方式是将用户信息存储在客户端,服务端不进行保存. ...
- 如何简单的在 ASP.NET Core 中集成 JWT 认证?
前情提要:ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统 文章超长预警(1万字以上),不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包 自上一 ...
- ASP.NET CORE中使用Cookie身份认证
大家在使用ASP.NET的时候一定都用过FormsAuthentication做登录用户的身份认证,FormsAuthentication的核心就是Cookie,ASP.NET会将用户名存储在Cook ...
- ASP.NET Core WebAPI中使用JWT Bearer认证和授权
目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...
- 在.NET Core中使用Jwt对API进行认证
在.NET Core中想用给API进行安全认证,最简单的无非就是Jwt,悠然记得一年前写的Jwt Demo,现在拿回来改成.NET Core的,但是在编码上的改变并不大,因为Jwt已经足够强大了.在项 ...
- .net core 2.0 jwt身份认证系统
经历了很久,.net core 2.0 终于发布了! 之前一直用的core 1.1,升级了2.0后发现认证的机制(Auth)发生了比较大的变化,在1.1中认证配置是在Configure中完成,而在2. ...
- ASP.NET Core 中jwt授权认证的流程原理
目录 1,快速实现授权验证 1.1 添加 JWT 服务配置 1.2 颁发 Token 1.3 添加 API访问 2,探究授权认证中间件 2.1 实现 Token 解析 2.2 实现校验认证 1,快速实 ...
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api
原文出自Rui Figueiredo的博客,原文链接<Secure a Web Api in ASP.NET Core> 摘要:这边文章阐述了如何使用 Json Web Token (Jw ...
- 关于ASP.Net Core Web及API身份认证的解决方案
6月15日,在端午节前的最后一个工作日,想起有段日子没有写过文章了,倒有些荒疏了.今借夏日蒸蒸之气,偷得浮生半日悠闲.闲话就说到这里吧,提前祝大家端午愉快(屈原听了该不高兴了:))!.NetCore自 ...
随机推荐
- Python10行以内代码能有什么高端操作
Python10行以内代码能有什么高端操作 Python凭借其简洁的代码,赢得了许多开发者的喜爱.因此也就促使了更多开发者用Python开发新的模块,从而形成良性循环,Python可以凭借更加简短的代 ...
- Mixed Precision Training —— caffe-float16
简介 最近有了突如其来的想法,如何把caffe的变得更小更快.后来翻到Nvidia开发caffe-float16,同时也看到它的论文.看完大致了解一番后,就做一下记录. 该工作的目标是,减少网络的所需 ...
- Python实现迪杰斯特拉算法
首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...
- SourceTreet提交时显示remote: Incorrect username or password ( access token )(4种解决办法)
引言 我因为第一次安装Sources Tree的时候进行破解时(跳过安装时的登录),因为操作失误造成了好多bug,导致Sources Tree不论提交,拉取,获取,都会报remote: Incorre ...
- BufferedReader、BufferedWriter读写文件乱码问题:
代码: text4500.txt文档用text打开(不知道格式): 读取会出现乱码,然后用Notepad++打开换成UTF-8格式的.就可以了
- Arraylist的源码学习
@ 目录 ArrayList简介 ArrayList核心源码 ArrayList源码分析 System.arraycopy()和Arrays.copyOf()方法 两者联系与区别 ArrayList ...
- 使用folderLeft函数统计字母出现的次数
实例:统计字符串中字母出现的次数 import scala.collection.mutable object Demo_018{ def main(args: Array[String]): Uni ...
- andriod开发中遇到的错误
1.java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security pol ...
- Jmeter 常用函数(28)- 详解 __FileToString
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 读取整个文件 语法格式 ${__Fil ...
- Project ACRN documentation
Project ACRN documentation https://projectacrn.github.io/latest/index.html Virtio devices high-level ...