什么是 JWT – JSON WEB TOKEN
JWT官网
下面我们来具体实现
先为服务创建一个jwt
1.先给项目安装相应的包 如图:
提醒一下,这玩意要和你.net core框架版本一致。我用的3.1稳定版
接下来我们来在服务端使用JWT创建Token代码如下:
[AllowAnonymous]//允许所有人访问
[HttpPost("login")]
public IActionResult login([FromBody] LoginDto loginDto)
{
//1.进行信息认证(省略)
//2.创建JWT Token
//header singningAlgorithm储存编码算法
var singningAlgorithm = SecurityAlgorithms.HmacSha256;
//payload 需要用到的数据
var claims = new[] {
// sub ==jwt的ID
//等同于 Sub:fake_user_id
new Claim(JwtRegisteredClaimNames.Sub,"fake_user_id")
};
//signature 数字签名 需要用到私钥
//私钥一般放在配置文件中 私钥是自定义的 想写什么写什么
//使用utf进行编码
var secretByte = Encoding.UTF8.GetBytes(_configuration["Authentication:SecretKey"]);
//使用非对称算法 对私钥加密
var signingkey = new SymmetricSecurityKey(secretByte);
//通过256验证非对称加密的私钥
var signingCredentials = new SigningCredentials(signingkey, singningAlgorithm);
//创建token
var token = new JwtSecurityToken(
issuer:_configuration ["Authentication:Issuer"],//谁发布的TOken
audience:_configuration["Authentication:Audience"],//token发布给谁
claims,//payload数据
notBefore:DateTime.UtcNow,//发布时间
expires:DateTime.UtcNow.AddDays(1),//有效时间
signingCredentials//数字签名
);
//以字符串形式 输出Token
var tokenStr = new JwtSecurityTokenHandler().WriteToken(token);
//3.返回jwt字符串
return Ok(tokenStr);
}
接着 我们来访问一下这个API 看看返回结果。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5e4cb586b08746de9dd409ec1892f1bc.jpeg
可以看到返回200成功,并且把JWT字符串返回。
我们来去官网看下JWT创建的信息。
可以看到解析的结果和你创建的信息一致。这样就简单的实现了Token的创建。
接下来我们来使用Token访问受保护资源。
先注入JWT的认证服务。
代码如下:
//注入JWT验证依赖服务 AddAuthentication注册身份认证服务 参数为认证类型
//AddJwtBearer 配置jwt认证 参数为委托
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options => {
//获取密钥
var secretByte = Encoding.UTF8.GetBytes(Configuration["Authentication:SecretKey"]);
options.TokenValidationParameters = new TokenValidationParameters
{
//验证token发布者 只有后端Issuer发出的Token才被接受
ValidateIssuer = true,
ValidIssuer = Configuration["Authentication:Issuer"],
//token持有者
ValidateAudience = true ,
ValidAudience=Configuration["Authentication:Audience"],
//验证token是否过期
ValidateLifetime=true ,
//传如私钥并加密
IssuerSigningKey=new SymmetricSecurityKey(secretByte)
};
});
此代码写在Startup.cs的ConfigureServices中。
接着我们来启动服务框架。
在Startup.cs类的Configure函数添加如下代码 切记 启动顺序不能错。
添加红色框框的代码。注意顺序不能错。
接着我们在受保护资源上加上对应的属性
[Authorize] 表示只有登录过的用户,拥有token的客户端才可以访问。用这个特性需要引入对应的命名空间
using Microsoft.AspNetCore.Authorization;
接下来我们来测试一下
后台给我们返回401 说明我们还没有登录,此时是访问不了的。
接着我们来使用上面获得的token来进行一次模拟登录。
这次我们可以看到 请求成功了。
请求时候一定要带上参数,Authorization:bearer+空格+JWT字符串
接着我们来试着给不同的用户添加不同的角色与权限
我们只需要在相应的Claim里面添加对应的角色在JWT字符串就行了。添加如下代码
在对应的方法中加入特性就行。
此时只有角色为Admin的才可以访问此方法。
好了暂时更新这么多。。。。