《Asp.Net Core3 + Vue3入坑教程》 - 5..Net Core 3升級成 .Net 5 & JWT
阿新 • • 發佈:2021-03-07
# 簡介
《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