一、JWT认证简介
首先,JWT全称为JSON Web Token,是一种轻量级的认证和授权方式,采用JSON格式传递信息,在HTTP请求头中进行传递,通常被用来作为API的安全验证方式。JWT由三部分组成:头部、载荷和签名。头部存储加密算法和令牌类型等信息,载荷包含了需要传递的用户信息以及其他元数据,签名用于验证令牌的合法性。
二、安装NuGet包
在Visual Studio中,我们可以通过NuGet包管理器来安装JWT相关的依赖包。打开NuGet包管理器,搜索安装Microsoft.AspNetCore.Authentication.JwtBearer包,这个包提供了JWT认证相关的操作和中间件。
// 安装NuGet包 Install-Package Microsoft.AspNetCore.Authentication.JwtBearer
三、JWT认证配置
接下来,我们需要在Startup.cs文件中,进行JWT认证的配置。在ConfigureServices方法中,添加JWT认证相关配置。
// 引入命名空间
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
// JWT认证配置
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
// 验证发行人
ValidateIssuer = true,
ValidIssuer = Configuration["Jwt:Issuer"],
// 验证接收人
ValidateAudience = true,
ValidAudience = Configuration["Jwt:Audience"],
// 验证令牌签名
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Secret"]))
};
});
在上面的配置中,我们指定了验证发行人、接收人和验证令牌签名所需的密钥。需要注意的是,在实际应用中,请将密钥保存在安全可靠的地方,避免泄露。
四、JWT令牌生成
在进行JWT认证时,需要先生成JWT令牌。我们可以在AuthenticationController.cs文件中,添加一个GenerateJwtToken方法来生成JWT令牌。
// 引入命名空间
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
// 生成JWT令牌
[AllowAnonymous]
[HttpPost]
[Route("authenticate")]
public ActionResult GenerateJwtToken([FromBody] User userParam)
{
// 验证用户信息
var user = _userService.Authenticate(userParam.Username, userParam.Password);
if (user == null)
return BadRequest(new { message = "账号或密码错误" });
// 生成令牌
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Secret"]);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.Id.ToString())
}),
Expires = DateTime.UtcNow.AddDays(7),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new { Token = tokenString });
}
在上面的代码中,我们首先验证了用户的账号和密码,然后按照JWT认证规范生成JWT令牌,并将令牌返回给客户端。在生成令牌时,我们设置了过期时间和签名规则等信息,以保证令牌的安全性。
五、使用JWT认证
在需要进行身份验证的地方,我们可以使用AuthenticateAttribute来开启JWT认证。
// 引入命名空间
using Microsoft.AspNetCore.Authorization;
// 使用JWT认证
[Authorize]
[HttpGet]
[Route("user")]
public ActionResult GetUser()
{
// 获取当前用户信息
var userId = User.Identity.Name;
var user = _userService.GetById(int.Parse(userId));
return Ok(user);
}
在上面的代码中,我们在需要获取用户信息的地方,使用了AuthorizeAttribute来开启JWT认证。只有在通过身份验证之后,才可以调用该方法获取用户信息。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/270516.html
微信扫一扫
支付宝扫一扫