ASP.NET Core Web API之Token驗證

来源:https://www.cnblogs.com/hsiang/archive/2023/07/01/17504260.html
-Advertisement-
Play Games

在實際開發中,我們經常需要對外提供介面以便客戶獲取數據,由於數據屬於私密信息,並不能隨意供其他人訪問,所以就需要驗證客戶身份。那麼如何才能驗證客戶的什麼呢?今天以一個簡單的小例子,簡述ASP.NET Core Web API開發過程中,常用的一種JWT身份驗證方式。僅供學習分享使用,如有不足之處,還... ...


在實際開發中,我們經常需要對外提供介面以便客戶獲取數據,由於數據屬於私密信息,並不能隨意供其他人訪問,所以就需要驗證客戶身份。那麼如何才能驗證客戶的什麼呢?今天以一個簡單的小例子,簡述ASP.NET Core Web API開發過程中,常用的一種JWT身份驗證方式。僅供學習分享使用,如有不足之處,還請指正。

 

什麼是JWT?

 

JSON WEB TokenJWT,讀作 [/dʒɒt/]),是一種基於JSON的、用於在網路上聲明某種主張的令牌(token)。

JWT組成

 

JWT通常由三部分組成: 頭信息(header), 消息體(payload)和簽名(signature)。

  1. 頭信息指定了該JWT使用的簽名演算法,HS256 表示使用了 HMAC-SHA256 來生成簽名。
  2. 消息體包含了JWT的意圖
  3. 未簽名的令牌由base64url編碼的頭信息和消息體拼接而成(使用"."分隔),簽名則通過私有的key計算而成。
  4. 最後在未簽名的令牌尾部拼接上base64url編碼的簽名(同樣使用"."分隔)就是JWT了
  5. 典型的JWT的格式:xxxxx.yyyyy.zzzzz

 

JWT應用架構

 

JWT一般應用在分散式部署環境中,下圖展示了Token的獲取和應用訪問介面的相關步驟:

 

應用JWT步驟

 

1. 安裝JWT授權庫

 

採用JWT進行身份驗證,需要安裝【Microsoft.AspNetCore.Authentication.JwtBearer】,可通過Nuget包管理器進行安裝,如下所示:

 

2. 添加JWT身份驗證服務

 

在啟動類Program.cs中,添加JWT身份驗證服務,如下所示:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = TokenParameter.Issuer,
                ValidAudience = TokenParameter.Audience,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(TokenParameter.Secret))
            };
        });

 

3. 應用鑒權授權中間件

 

在啟動類Program.cs中,添加鑒權授權中間件,如下所示:

app.UseAuthentication();

app.UseAuthorization();

 

4. 配置Swagger身份驗證輸入(可選)

 

在啟動類Program.cs中,添加Swagger服務時,配置Swagger可以輸入身份驗證方式,如下所示:

builder.Services.AddSwaggerGen(options =>
{
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "請輸入token,格式為 Bearer xxxxxxxx(註意中間必須有空格)",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "Bearer"
    });
    //添加安全要求
    options.AddSecurityRequirement(new OpenApiSecurityRequirement {
        {
            new OpenApiSecurityScheme{
                Reference =new OpenApiReference{
                    Type = ReferenceType.SecurityScheme,
                    Id ="Bearer"
                }
            },new string[]{ }
        }
    });
});

註意:此處配置主要是方便測試,如果採用Postman或者其他測試工具,此步驟可以省略。

 

5. 創建JWT幫助類

 

創建JWT幫助類,主要用於生成Token,如下所示:

using DemoJWT.Models;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace DemoJWT.Authorization
{
    public class JwtHelper
    {
        public static string GenerateJsonWebToken(User userInfo)
        {
            var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(TokenParameter.Secret));
            var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
            var claimsIdentity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme);
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Sid, userInfo.Id));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Name, userInfo.Name));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, userInfo.Role));
            var token = new JwtSecurityToken(TokenParameter.Issuer,
              TokenParameter.Audience,
              claimsIdentity.Claims,
              expires: DateTime.Now.AddMinutes(120),
              signingCredentials: credentials);

            return new JwtSecurityTokenHandler().WriteToken(token);
        }
    }
}

其中用到的TokenParameter主要用於配置Token驗證的頒發者,接收者,簽名秘鑰等信息,如下所示:

namespace DemoJWT.Authorization
{
    public class TokenParameter
    {
        public const string Issuer = "公子小六";//頒發者        
        public const string Audience = "公子小六";//接收者        
        public const string Secret = "1234567812345678";//簽名秘鑰        
        public const int AccessExpiration = 30;//AccessToken過期時間(分鐘)
    }
}

 

6. 創建Token獲取介面

 

創建對應的AuthController/GetToken方法,用於獲取Token信息,如下所示:

using DemoJWT.Authorization;
using DemoJWT.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IdentityModel.Tokens.Jwt;

namespace DemoJWT.Controllers
{
    [Route("api/[controller]/[Action]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        [HttpPost]
        public ActionResult GetToken(User user)
        {
            string token = JwtHelper.GenerateJsonWebToken(user);
            return Ok(token);
        }
    }
}

 

7. 創建測試介面

 

創建測試介面,用於測試Token身份驗證。如下所示:

using DemoJWT.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Security.Claims;

namespace DemoJWT.Controllers
{
    [Authorize]
    [Route("api/[controller]/[Action]")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpPost]
        public ActionResult GetTestInfo()
        {
            var claimsPrincipal = this.HttpContext.User;
            var name = claimsPrincipal.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Name)?.Value;
            var role = claimsPrincipal.Claims.FirstOrDefault(r => r.Type == ClaimTypes.Role)?.Value;
            var test = new Test()
            {
                Id = 1,
                Name = name,
                Role = role,
                Author = "公子小六",
                Description = "this is a test.",
            };
            return Ok(test);
        }
    }
}

 

介面測試

 

運行程式,看到公開了兩個介面,如下所示:

 

1. 獲取Token

 

運行api/Auth/GetToken介面,輸入用戶信息,點擊Execute,在返回的ResponseBody中,就可以獲取介面返回的Token

 

 

2. 設置Token

 

在Swagger上方,點擊Authorize,彈出身份驗證配置視窗,如下所示:

3. 介面測試

配置好身份認證信息後,調用/api/Test/GetTestInfo介面,獲取信息如下:

 如果清除掉Token配置,再進行訪問/api/Test/GetTestInfo介面,則會返回401未授權信息,如下所示:

 以上就是ASP.NET Core Web API之Token驗證的全部內容。


作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Python中定義一個函數時,就會把變數空間劃分為全局變數(global)與局部變數(local),如果是定義在一個類的成員函數中,那麼就還有額外的成員變數(self)空間。那麼,如果在實際操作中,想把這幾種不同的變數空間做一個分離的話,有沒有辦法呢? ### 1.讀取和修改局部變數 首先來看一下 ...
  • # Python Django全面介紹 Django是一個非常強大的Python Web開發框架,它以"快速開發"和"乾凈、實用的設計"為設計宗旨。本文將從Django的基本概念開始,逐漸引導大家理解如何使用Django構建複雜的web應用程式。 ## Django基本概念與原理 首先,讓我們從Dj ...
  • zip解壓和壓縮 引言 介紹zip文件的概念 涉及到的Java類和包:java.util.zip https://blog.csdn.net/u012998680/article/details/126060855 壓縮文件 準備壓縮的源文件和目標zip文件的路徑 創建FileOutputStrea ...
  • # JavaBean、MVC、Filter和Listener ## JavaBean JavaBean 是一種JAVA語言寫成的可重用組件。 實體類(pojo)。 JavaBean有特殊的寫法: - 必須要有一個無參構造 - 屬性必須私有 - 必須要對應的set/get方法 本質就是一個java類 ...
  • 摘要:解決SimpleDateFormat類在高併發場景下的線程安全問題可以有多種方式,這裡,就列舉幾個常用的方式供參考。 本文分享自華為雲社區《【高併發】更正SimpleDateFormat類線程不安全問題分析的錯誤》,作者: 冰 河 。 解決SimpleDateFormat類在高併發場景下的線程 ...
  • ## 教程簡介 babylon.js是一款強大、漂亮、簡單、開放的游戲和渲染引擎,以 Javascript 框架發佈,用於構建HTML5、WebGL、WebVR和Web Audio的3D游戲和體驗, 除了游戲用來在頁面實現一些3D場景也是沒問題的。 [BabylonJS入門教程](https://w ...
  • ## 教程簡介 Cassandra是一個混合型的非關係的資料庫,類似於Google的BigTable。其主要功能比Dynamo (分散式的Key-Value存儲系統)更豐富,但支持度卻不如文檔存儲MongoDB(介於關係資料庫和非關係資料庫之間的開源產品,是非關係資料庫當中功能最豐富,最像關係資料庫 ...
  • # 你沒見過的分庫分表原理解析和解決方案(二) 高併發三駕馬車:分庫分表、MQ、緩存。今天給大家帶來的就是分庫分表的乾貨解決方案,哪怕你不用我的框架也可以從中聽到不一樣的結局方案和實現。 一款支持自動分表分庫的orm框架[`easy-query`](https://github.com/xuejmn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...