.NET Core的JWT認證的學習

来源:https://www.cnblogs.com/zhao123/archive/2019/11/11/11837257.html
-Advertisement-
Play Games

今天學習下JWT,遇到了兩個坑爹問題,這裡記錄下。在 ASP.NET Core 中,授權的設置方式有兩種,可以使用角色,也可以使用策略,這裡也將簡單舉例角色、策略的使用。 JWT這裡不做介紹,如果想瞭解更多,請看https://www.jianshu.com/p/a12fc67c9e05,https ...


今天學習下JWT,遇到了兩個坑爹問題,這裡記錄下。在 ASP.NET Core 中,授權的設置方式有兩種,可以使用角色,也可以使用策略,這裡也將簡單舉例角色、策略的使用。

JWT這裡不做介紹,如果想瞭解更多,請看https://www.jianshu.com/p/a12fc67c9e05,https://www.cnblogs.com/CreateMyself/p/11123023.html ,這兩篇都講解的很好,這裡只寫實際的使用和遇到的問題。

1. JWT的SecretKey必須16位以上

jwt中key必須16位以上,否則長度不夠會拋出異常,異常代碼如下

System.ArgumentOutOfRangeException
  HResult=0x80131502
  Message=IDX10603: Decryption failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
Exceptions caught:
 '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]' 
  Source=Microsoft.IdentityModel.Tokens
  StackTrace:
   at Microsoft.IdentityModel.Tokens.SymmetricSignatureProvider..ctor(SecurityKey key, String algorithm, Boolean willCreateSignatures)
....................

2.獲取token之後,一直401Unauthorized

在Startup.cs中的Configure中添加app.UseAuthentication();新創建.net core項目的時候,會自動添加授權app.UseAuthorization();但是JWT其實是一種認證,準確;來說是登錄的過程,需要用戶名和密碼的認證。

例如:你要登陸論壇,輸入用戶名張三,密碼1234,密碼正確,證明你張三確實是張三,這就是 認證authentication;那麼是否有刪除添加等的操作,這就是授權authorization

3.JWTtoken的獲取

//appsettings.json中增加配置信息
"JwtSettings": {
    "Issuer": "https://localhost:44378/",
    "Audience": "https://localhost:44378/",
    "SecretKey": "1234567890123456"
  }
View Code
// Startup.cs中增加JWT的設置           
            services.AddAuthentication(options =>
            {
                //認證middleware配置
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(o =>
            {
                //主要是jwt  token參數設置
                o.TokenValidationParameters = new TokenValidationParameters
                {
                    //Token頒發機構
                    ValidIssuer = jwtSettings.Issuer,
                    //頒發給誰
                    ValidAudience = jwtSettings.Audience,
                    //這裡的key要進行加密,需要引用Microsoft.IdentityModel.Tokens
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.SecretKey)),
                    ValidateIssuerSigningKey = true,
                    //是否驗證Token有效期,使用當前時間與Token的Claims中的NotBefore和Expires對比
                    ValidateLifetime = true,
                    //允許的伺服器時間偏移量
                    ClockSkew = TimeSpan.Zero

                };
            });
View Code
// Controller中獲取token       
        [HttpPost]
        public IActionResult Token(LoginModel login)
        {
            _logger.LogInformation($"獲取Token:User:{login.User}");
            if (string.IsNullOrEmpty(login.User) || string.IsNullOrEmpty(login.Password))//判斷賬號密碼是否正確
            {
                return BadRequest();
            }


            var claim = new List<Claim>{
                    new Claim(ClaimTypes.Name,login.User),
                    new Claim(ClaimTypes.Role,"Test")
                };

            //建立增加策略的授權
            if (login.User == "Test") claim.Add(new Claim("Test", "Test"));
            if (login.User == "Test1") claim.Add(new Claim("Test", "Test1"));
            if (login.User == "Test2") claim.Add(new Claim("Test", "Test2"));
            if (login.User == "Test3") claim.Add(new Claim("Test", "Test3"));

            //對稱秘鑰
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtSettings.SecretKey));
            //簽名證書(秘鑰,加密演算法)
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

            //生成token  [註意]需要nuget添加Microsoft.AspNetCore.Authentication.JwtBearer包,並引用System.IdentityModel.Tokens.Jwt命名空間
            var token = new JwtSecurityToken(_jwtSettings.Issuer, _jwtSettings.Audience, claim, DateTime.Now, DateTime.Now.AddMinutes(30), creds);

            return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
        }
View Code

4.基於角色的授權

        [HttpGet]
        [Authorize(Roles ="Test")]
        public ActionResult<string> AuthValue()
        {
            var name = User.FindFirst(ClaimTypes.Name)?.Value;
            var role = User.FindFirst(ClaimTypes.Role)?.Value;
            _logger.LogInformation($"許可權登錄,用戶名:{name},角色:{role}");

            return $"許可權登錄,用戶名:{name},角色:{role}";
        }
Roles角色如果有多個,可以以逗號隔開。

5.基於策略的授權

//Startup.cs中添加策略
services.AddAuthorization(options => { options.AddPolicy("OnlyTestAccess", policy => policy.RequireClaim("Test", new string[] { "Test1", "Test2" })); options.AddPolicy("DepartmentAccess", policy => policy.RequireClaim("Department")); });
        // 方法上增加策略    
[HttpGet] [Authorize(Policy
= "OnlyTestAccess")] public ActionResult<string> AuthExtensionValue() { var name = User.FindFirst(ClaimTypes.Name)?.Value; var role = User.FindFirst(ClaimTypes.Role)?.Value; _logger.LogInformation($"基於策略的登錄,用戶名:{name},角色:{role}"); return $"基於策略的登錄,用戶名:{name},角色:{role}"; }

6.運行的截圖


7.Github上的源碼

https://github.com/jasonhua95/samll-project/tree/master/JwtApiDemo

 

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

-Advertisement-
Play Games
更多相關文章
  • 一、環境準備 1. jdk1.8.1 做java開發的這個應該能自己找到 2.gradle-4.9 https://services.gradle.org/distributions/ 沒用過gradle的同學可以將其理解為類似於maven的包管理工具,這裡下載gradle-4.9-bin.zip, ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 在公司的日常安排中,通常劃分多個部門,每個部門又會分為不同的小組,部門經理的一項核心工作就是協調部門小組之間的工作,例如開發小組,產品小組,小組的需求統一彙總到經理,經理統一安排和協調。 2、場景圖解 3 ...
  • 什麼是ThreadLocal ThreadLocal有點類似於Map類型的數據變數。ThreadLocal類型的變數每個線程都有自己的一個副本,某個線程對這個變數的修改不會影響其他線程副本的值。需要註意的是一個ThreadLocal變數,其中只能set一個值。 線上程1中初始化了一個ThreadLo ...
  • C/C++文件 C/C++程式文件包括 .h .c .hpp .cpp,其中源文件(.c .cpp)是基本的編譯單元,頭文件(.h .hpp)不會被編譯器編譯。 C/C++項目構建(build)過程,分為以下幾個步驟 預處理 → 編譯 → 鏈接。 預編譯 預編譯的過程可以理解為編譯器(實際上是預處理 ...
  • WinForm程式中表單的列可自定義顯示及隱藏,是一種常見的功能,對於用戶體驗來說是非常好的。筆者經過一段時間的摸索,終於實現了自己想要的功能及效果,現記錄一下過程: 1、新建一個自定義控制項,命名為:PopupMenuControl。 2、在PopupMenuControl.Designet文件中的 ...
  • 最近對我的 NPOI 擴展做了一些改變,一方面提高性能,一方面修複bug,增加一些新的功能來讓它更加好用,前幾天發佈了 1.5.0 版本,下麵來介紹一下最近的更新 ...
  • 大家好,今天給大家說明如何在.NET Core中使用Redis,我們在想要辯論程式的好與壞,都想需要一個可視化工具,我經常使用的是一位國內大牛開發的免費工具,其Github地址為: https://github.com/qishibo/AnotherRedisDesktopManager/relea ...
  • 樹形結構數據存儲方案(簡單介紹) 方案1:繼承關係驅動的Schema設計 優點:直觀 缺點:查詢效率低 方案2:基於左右值編碼的Schema設計 優點:查詢效率高,無需遞規 "使用參考" 在方案1的基礎上計算左右值 /// /// 計算樹節點左右值 /// /// 樹節點集合 /// 父節點 /// ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...