1. 程式人生 > >《Asp.Net Core3 + Vue3入坑教程》 - 5..Net Core 3升級成 .Net 5 & JWT

《Asp.Net Core3 + Vue3入坑教程》 - 5..Net Core 3升級成 .Net 5 & JWT

# 簡介 《Asp.Net Core3 + Vue3入坑教程》 此教程適合新手入門或者前後端分離嘗試者。可以根據圖文一步一步進操作編碼也可以選擇直接檢視原始碼。每一篇文章都有對應的原始碼 > 本文將 .Net Core 3升級成 .Net 5 # 目錄 #### 《Asp.Net Core3 + Vue3入坑教程》系列教程目錄 Asp.Net Core後端專案 1. [後端專案搭建與Swagger配置步驟](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14435589.html) 2. [配置CROS策略解決跨域問題](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14438539.html) 3. [AutoMapper & Restful API & DI](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14438949.html) 4. [EF Core & Postgresql](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14438885.html) 5. [**(本文).Net Core 3升級成 .Net 5 & JWT**](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14444048.html) 6. (暫未發表敬請期待...)[]() Vue3 前端專案 暫未發表敬請期待... # 本文簡介 本文為《Asp.Net Core3 + Vue3入坑教程》系列教程的後端第五篇 - .Net Core 3升級成 .Net 5 & JWT。[上文](https://www.cnblogs.com/Iannnnnnnnnnnnn/p/14438885.html)已經為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 SDK > https://dotnet.microsoft.com/download/visual-studio-sdks?utm_source=getdotnetsdk&utm_medium=referral ![](https://img2020.cnblogs.com/blog/870711/202103/870711-20210307143619135-874292007.png) #### 確保VS版本支援 .net 5 SDK(如果是2019的話,升級成最新的即可) ![](https://img2020.cnblogs.com/blog/870711/202102/870711-20210225103840286-337943825.png) #### 開啟專案,右鍵解決方案,開啟專案屬性 ![](https://img2020.cnblogs.com/blog/870711/202103/870711-20210307144106264-1594668795.png) #### 將目標框架調整成 .NET 5.0 ![](https://img2020.cnblogs.com/blog/870711/202102/870711-20210225104138335-368655216.png) #### 更新Nuget包 ![](https://img2020.cnblogs.com/blog/870711/202102/870711-20210225104648207-1623176990.png) ### 專案應用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(IEn