ASP.NET Core 6.0 添加 JWT 认证和授权

序言本文将分别介绍 Authentication(认证) 和 Authorization(授权) 。
并以简单的例子在 ASP.NET Core 6.0 的 WebAPI 中分别实现这两个功能 。
 
相关名词Authentication 和 Authorization 长得很像,傻傻分不清楚 。
Authentication(认证):标识用户的身份,一般发生在登录的时候 。
Authorization(授权):授予用户权限,指定用户能访问哪些资源;授权的前提是知道这个用户是谁,所以授权必须在认证之后 。
 
认证(Authentication)基本步骤

  1. 安装相关 Nuget 包:Microsoft.AspNetCore.Authentication.JwtBearer
  2. 准备配置信息(密钥等)
  3. 添加服务
  4. 调用中间件
  5. 实现一个 JwtHelper,用于生成 Token
  6. 控制器限制访问(添加 Authorize 标签)
1 安装 Nuget 包安装 Microsoft.AspNetCore.Authentication.JwtBearer
在程序包管理器控制台中:
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 6.0.12 准备配置信息在 Appsetting.json 中,添加一个 Jwt 节点
"Jwt": {"SecretKey": "lisheng741@qq.com","Issuer": "WebAppIssuer","Audience": "WebAppAudience"}3 添加服务在 Program.cs 文件中注册服务 。
// 引入所需的命名空间using Microsoft.AspNetCore.Authentication.JwtBearer;using Microsoft.IdentityModel.Tokens;using System.Text;// ……var configuration = builder.Configuration;// 注册服务builder.Services.AddAuthentication(options =>{options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters(){ValidateIssuer = true, //是否验证IssuerValidIssuer = configuration["Jwt:Issuer"], //发行人IssuerValidateAudience = true, //是否验证AudienceValidAudience = configuration["Jwt:Audience"], //订阅人AudienceValidateIssuerSigningKey = true, //是否验证SecurityKeyIssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["Jwt:SecretKey"])), //SecurityKeyValidateLifetime = true, //是否验证失效时间ClockSkew = TimeSpan.FromSeconds(30), //过期时间容错值,解决服务器端时间不同步问题(秒)RequireExpirationTime = true,};});4 调用中间件调用 UseAuthentication(认证),必须在所有需要身份认证的中间件前调用,比如 UseAuthorization(授权) 。
// ……app.UseAuthentication();app.UseAuthorization();// ……5 JwtHelper 类实现主要是用于生成 JWT 的 Token 。
using Microsoft.IdentityModel.Tokens;using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;using System.Text;namespace TestWebApi;public class JwtHelper{private readonly IConfiguration _configuration;public JwtHelper(IConfiguration configuration){_configuration = configuration;}public string CreateToken(){// 1. 定义需要使用到的Claimsvar claims = new[]{new Claim(ClaimTypes.Name, "u_admin"), //HttpContext.User.Identity.Namenew Claim(ClaimTypes.Role, "r_admin"), //HttpContext.User.IsInRole("r_admin")new Claim(JwtRegisteredClaimNames.Jti, "admin"),new Claim("Username", "Admin"),new Claim("Name", "超级管理员")};// 2. 从 appsettings.json 中读取SecretKeyvar secretKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:SecretKey"]));// 3. 选择加密算法var algorithm = SecurityAlgorithms.HmacSha256;// 4. 生成Credentialsvar signingCredentials = new SigningCredentials(secretKey, algorithm);// 5. 根据以上,生成tokenvar jwtSecurityToken = new JwtSecurityToken(_configuration["Jwt:Issuer"],//Issuer_configuration["Jwt:Audience"],//Audienceclaims,//Claims,DateTime.Now,//notBeforeDateTime.Now.AddSeconds(30),//expiressigningCredentials//Credentials);// 6. 将token变为stringvar token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);return token;}}该 JwtHelper 依赖于 IConfiguration(为了读取配置文件),将 JwtHelper 的创建交由 DI 容器,在 Program.cs 中添加服务:
var configuration = builder.Configuration;builder.Services.AddSingleton(new JwtHelper(configuration));将 JwtHelper 注册为单例模式 。
6 控制器配置新建一个 AccountController,以构造函数方式注入 JwtHelper,添加两个 Action:GetToken 用于获取 Token,GetTest 打上 [Authorize] 标签用于验证认证 。
using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Mvc;namespace TestWebApi.Controllers;[Route("api/[controller]/[action]")][ApiController]public class AccountController : ControllerBase{private readonly JwtHelper _jwtHelper;public AccountController(JwtHelper jwtHelper){_jwtHelper = jwtHelper;}[HttpGet]public ActionResult<string> GetToken(){return _jwtHelper.CreateToken();}[Authorize][HttpGet]public ActionResult<string> GetTest(){return "Test Authorize";}}


推荐阅读