序言本文将分别介绍 Authentication(认证) 和 Authorization(授权) 。
并以简单的例子在 ASP.NET Core 6.0 的 WebAPI 中分别实现这两个功能 。
相关名词Authentication 和 Authorization 长得很像,傻傻分不清楚 。
Authentication(认证):标识用户的身份,一般发生在登录的时候 。
Authorization(授权):授予用户权限,指定用户能访问哪些资源;授权的前提是知道这个用户是谁,所以授权必须在认证之后 。
认证(Authentication)基本步骤
- 安装相关 Nuget 包:Microsoft.AspNetCore.Authentication.JwtBearer
- 准备配置信息(密钥等)
- 添加服务
- 调用中间件
- 实现一个 JwtHelper,用于生成 Token
- 控制器限制访问(添加 Authorize 标签)
在程序包管理器控制台中:
Install-Package Microsoft.AspNetCore.Authentication.JwtBearer -Version 6.0.1
2 准备配置信息在 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";}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何在树莓派4开发板上使用Windows 10 IoT Core?
- 在.NET和.NET Core应用程序中优雅的实现后台任务——Hangfire
- 在linux系统下运行 .net core 程序
- 常见加密算法 「asp.net core 系列」12 数据加密算法
- 微软正改进Windows Core OS对Chromium的支持
- 主板|瑞萨全球首发PCIe 6.0计时方案!3×3毫米
- 皮卡|值得推荐的工具皮卡:长安凯程F300正式上市 6.09万元起售
- 荣耀|不限量升级!荣耀Magic3系列Magic UI 6.0正式版来了
- ASP.NET Core和Https
- ASP.NET Core跨平台技术内幕