《Asp.Net Core3 + Vue3入坑教程》 此教程适合新手入门或者前后端分离尝试者。可以根据图文一步一步进操作编码也可以选择直接查看源码。每一篇文章都有对应的源码
本文将 .Net Core 3升级成 .Net 5
目录 《Asp.Net Core3 + Vue3入坑教程》系列教程目录Asp.Net Core后端项目
后端项目搭建与Swagger配置步骤
配置CROS策略解决跨域问题
AutoMapper & Restful API & DI
EF Core & Postgresql
(本文).Net Core 3升级成 .Net 5 & JWT
(暂未发表敬请期待...)
Vue3 前端项目
暂未发表敬请期待...
本文简介本文为《Asp.Net Core3 + Vue3入坑教程》系列教程的后端第五篇 - .Net Core 3升级成 .Net 5 & JWT。上文已经为Simple项目增加了EF Core与Postgresql数据库的连接,本文继续为Simple项目增加JWT(JSON Web Token)的应用,目标是让除了用户请求认证接口之外的其余请求都需要带着JWT!在使用之前先将SKD的版本升级成 .Net 5。
JWT详解参考 https://jwt.io/introduction
把Simple项目从 .Net Core 3升级成 .Net 5 & 使用JWT .Net Core 3升级成 .Net 5 上官网下载 .Net 5 SDKhttps://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral
确保VS版本支持 .net 5 SDK(如果是2019的话,升级成最新的即可) 打开项目,右键解决方案,打开项目属性 将目标框架调整成 .NET 5.0 更新Nuget包 项目应用JWT 在ServiceProvider文件夹下新建JWT扩展类代码如下:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Simple_Asp.Net_Core.ServiceProvider { public static class JWT { public static void AddJWT(this IServiceCollection services) { services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(o => { o.RequireHttpsMetadata = false; o.Events = new JwtBearerEvents() { OnAuthenticationFailed = context => { //Token expired if (context.Exception.GetType() == typeof(SecurityTokenExpiredException)) context.Response.Headers.Add("Token-Expired", "true"); return Task.CompletedTask; }, }; o.TokenValidationParameters = new TokenValidationParameters { // 是否验证失效时间 ValidateLifetime = true, ClockSkew = TimeSpan.FromSeconds(30), ValidateAudience = true, // 这里采用动态验证的方式,在重新登陆时,刷新token,旧token就强制失效了 AudienceValidator = AudienceValidator, // 是否验证Issuer ValidateIssuer = false, // 是否验证SecurityKey ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(Const.SecurityKey)) }; }); } private static bool AudienceValidator(IEnumerable<string> audiences, SecurityToken securityToken, TokenValidationParameters validationParameters) { return Audiences.IsNewestAudience(audiences.FirstOrDefault()); } } } 在ServiceProvider文件夹下新建新建类Audiences.cs和Const.cs代码如下:
using System; using System.Collections.Generic; namespace Simple_Asp.Net_Core.ServiceProvider { public static class Audiences { private static IDictionary<string, string> _audiences = new Dictionary<string, string>(); public static string UpdateAudience(string userNo) { if (string.IsNullOrWhiteSpace(userNo)) return string.Empty; var audience = $"{userNo}_{DateTime.Now}"; _audiences[userNo] = audience; return audience; } public static bool IsNewestAudience(string audience) { if (string.IsNullOrWhiteSpace(audience)) return false; var userName = audience.Split('_')[0]; if (!_audiences.ContainsKey(userName)) return false; else return _audiences[userName] == audience; } } } namespace Simple_Asp.Net_Core.ServiceProvider { internal class Const { public const string Domain = "http://localhost:81"; public const string SecurityKey = "Simple_Asp.Net_Core"; } } 在类中直接引入nuget包,或者使用Nuget包管理工具引入Microsoft.AspNetCore.Authentication.JwtBearer