1. 程式人生 > 其它 >.NET7之MiniAPI(特別篇) :Preview5優化了JWT驗證(上)

.NET7之MiniAPI(特別篇) :Preview5優化了JWT驗證(上)

  在.NET7的Preview5中,優化了asp.net core中的JWT驗證,不用像以前繁瑣了,更重要的是帶來了一組生成Token的工具,可以讓開發人員或測試人員不需登入獲取Token,而達到測試的目的。

  建立專案

  現在來看一下怎麼使用,首選建立專案,/是無驗證,/myhome是有驗證

var builder = WebApplication.CreateBuilder(args);
builder.Authentication.AddJwtBearer();
app.MapGet("/", () => "無驗證");
app.MapGet("/myhome", (ClaimsPrincipal user) => $"
你好 {user.Identity?.Name},歡迎來到你的主頁") .RequireAuthorization(); app.Run();

  用工具生成Token

  本次共引入了兩個工具user-secrets和user-jwts,通過名稱,大家也能瞭解到一個是和加密相關,一個和JWT的token相關,它們分別擁有的命令如下圖:

 1、如果在專案中第一次使用user-secrets工具,首先要初始化,可以在右擊專案,用“在終端開啟”,來執行命令列。

dotnet user-secrets init

命令的返回結果是:Set UserSecretsId to 'c2450184-8525-4ed7-9a82-d54c349dd4b8' for MSBuild project 'C:\myfile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\MiniAPI\MiniAPI7_NewJWT\MiniAPI7_NewJWT.csproj'.

同時,這個命令會在專案檔案中生成UserSecretsID節點,值正是上面返回的UUID

<PropertyGroup>
  <TargetFramework>net7.0</TargetFramework>
  <Nullable>enable</Nullable>
  <ImplicitUsings>enable</ImplicitUsings>
  <LangVersion>preview</LangVersion>
  <UserSecretsId>c2450184-8525
-4ed7-9a82-d54c349dd4b8</UserSecretsId> </PropertyGroup>

2、這時看一下secrets,結果是沒有配置

dotnet user-secrets list

No secrets configured for this application.

3、如果看一下jwts,返回值如下,有Secrets,但沒有jwts

dotnet user-jwts list

Project: C:\myfile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\MiniAPI\MiniAPI7_NewJWT\MiniAPI7_NewJWT.csproj

User Secrets ID: c2450184-8525-4ed7-9a82-d54c349dd4b8

No JWTs created yet!

4、這個時候建立一個jwt

dotnet user-jwts create

New JWT saved with ID 'd7dabed0'.

"Authentication": {
    "Schemes": {
      "Bearer": {
        "Audiences": [
          "http://localhost:5274"
        ],
        "ClaimsIssuer": "dotnet-user-jwts"
      }
    }
  }

同時,會在C:\Users\axzxs\AppData\Roaming\Microsoft\UserSecrets生成一個secrets資料夾,裡面有兩個檔案secrets.json和user-jwts.json,裡面分別放著生成的secret資訊和jwt資訊。

5、這時secrets再顯示一下,就會有值了

dotnet user-secrets list

返回結果:

dotnet-user-jwts:KeyMaterial = l4ynAWIVR5JKSKo5Yyr0XvOXgZ+dlBUwe3jI1st3DsY=

6、jwts list,就會有列表了

dotnet user-jwts list

 

7、可以用jwts的print命令,顯示一下token,以方便我們在測試中使用

dotnet user-jwts print d7dabed0 --show-full

  執行結果

  執行專案,用postman測試,這個沒有什麼問題,返回無驗證

  複製生成的Token,放在header中,請求myhome,這時會返回驗證通過的資訊,並且帶有name,這個name就是當前windows使用者

 

 上面只是驗證,那如果增加角色呢?先在專案中新增程式碼:

app.MapGet("/order", (ClaimsPrincipal user) => $"使用者:{user.Identity?.Name},您是:{user.Claims?.Where(s => s.Type == ClaimTypes.Role).First().Value}角色,這是你的專屬頁").RequireAuthorization(builder =>
{
    builder.RequireRole("admin");
});

那帶角色的token怎麼生成呢?先看一下user-jwts create命令的幫助,是可以在create時加name和role的。

dotnet user-jwts create --help

dotnet user-jwts create --name=桂素偉 --role=admin

建立一個名字叫桂素偉,角色是admin的token。

這時,再次測試結果如下,這次name和role都是自己設定的了。

 通過上面的兩個例子,可以看到,通過這兩組工具,可以幫我們生成token,可以直接用來測試,而不需要提前把獲取tokne和許可權相關的東西搞定,雖然只是一小步,也說明了.net7在進步中。

  想要更快更方便的瞭解相關知識,可以關注微信公眾號