一、简介
我们做微服务开发,或者说做分布式开发,有一项技术我们是避不开的,那就是WebAPI,在 Net6.0中,有两类 WebAPI,一类是极简 WebAPI,它砍掉了很多冗余的东西,更纯粹的是做 API的,也更适合做微服务的开发。另外一类就是我们通常使用的正常 API,这个没得说,也是我们使用最多的。
我们开发的API必须做鉴权和授权操作,否则,就成了裸跑了,那对于系统来说是很危险的。总体来说,一般的WebAPI和MinimalAPI鉴权的过程都是差不多的,但是也有微小的差异。今天我们就来详细说一下,内容很简单,大家有了基础可以随意去扩展。
开发环境详情:
操作系统:Windows 10 Professional
开发工具:Visual Studio 2022
开发语言:C#
开发平台:Asp.Net Core 6.0 WebAPI
测试工具:PostMan
二、具体步骤
我们在做具体的开发前,也要做一些准备工作,我们要做鉴权和授权,尤其是要使用 JWT 做鉴权和授权,这里面包含两个项目,一个是鉴权服务器,用于提供 JWTToken,另外一个项目是需要做鉴权和授权的具体 WebAPI 项目。有了准备,我们就可以开始了。
1、第一个项目:PatrickLiu.Net6API.AuthenticationCenter,用于提供获取 Token 接口。
(1)、Program.cs 源码如下,红色是重要代码:
1 using PatrickLiu.Net6API.Extensions; 2 3 var builder = WebApplication.CreateBuilder(args); 4 5 builder.Services.AddControllers(); 6 builder.Services.AddEndpointsApiExplorer(); 7 builder.Services.AddSwaggerGen(); 8 9 builder.Services.Configure<JWTTokenOption>(builder.Configuration.GetSection("JWTTokenOption")); 10 builder.Services.AddTransient<IJWTService, JWTService>(); 11 12 var app = builder.Build(); 13 14 app.UseSwagger(); 15 app.UseSwaggerUI(); 16 17 app.MapControllers(); 18 19 app.Run();
(2)、AuthenticationController 源码如下:
1 using Microsoft.AspNetCore.Mvc; 2 using Newtonsoft.Json; 3 using PatrickLiu.Net6API.Extensions; 4 5 namespace PatrickLiu.Net6API.AuthenticationCenter.Controllers 6 { 7 [ApiController] 8 [Route("api/[controller]/[action]")] 9 public class AuthenticationController : ControllerBase 10 { 11 private readonly IJWTService _jWTService; 12 13 /// <summary> 14 /// 实例化。 15 /// </summary> 16 /// <param name="jWTService">注入服务。</param> 17 public AuthenticationController(IJWTService jWTService) 18 { 19 _jWTService = jWTService; 20 } 21 22 /// <summary> 23 /// 根据用户名和密码获取 Token。 24 /// </summary> 25 /// <param name="userName">用户名。</param> 26 /// <param name="password">密码。</param> 27 /// <returns></returns> 28 [HttpPost] 29 public string Login(string userName, string password) 30 { 31 if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) 32 { 33 if (string.Compare(userName, "PatrickLiu", true) == 0 && string.Compare(password, "liulei123456", true) == 0) 34 { 35 string token = _jWTService.GetToken(userName, password); 36 return JsonConvert.Serial