淺談ASP.NET Core 中jwt授權認證的流程原理_實用技巧

來源:腳本之家  責任編輯:小易  

www.13333515.buzz防采集請勿采集本網。

1,快速實現授權驗證

登陸之后將登錄信息存儲到session、或者票證里。 保存時提取session或票證里的登錄數據

什么是 JWT ?為什么要用 JWT ?JWT 的組成?

嚴格來說html是沒有控件的,有的只是html標簽對。 表面上的區別是是否加上runat屬性 本質上是看,控件到底是由服務器解析處理編譯成html發回客戶端,還是直接以html標簽對

這些百度可以直接找到,這里不再贅述。

實際上,只需要知道 JWT 認證模式是使用一段 Token 作為認證依據的手段。

1、客戶端處理方式<script type="javascript-text"> function getArgs() {     var args = new Object( );     var query = docu

我們看一下 Postman 設置 Token 的位置。

是的,asp.net vb.ne c#都是.net框架下的語言. XP和windows2000 都是微軟的系統,都是基于NT核心的操作系統,區別在于XP是2000的升級版.XP版本中沒有SERVER版的系統

那么,如何使用 C# 的 HttpClient 訪問一個 JWT 認證的 WebAPI 呢?

CSDN.那里面全是神一般的人物,你的任何問題都能解決。還可以分享他們的學習經驗,

下面來創建一個 ASP.NET Core 項目,嘗試添加 JWT 驗證功能。

各有千秋,DataSet性能略高,LTE有不少語法糖,開發方便。

1.1 添加 JWT 服務配置

Dim conn As New System.Data.SQLite.SQLiteConnection("data source=D:\辦公系統\bin\data") conn.Open() Dim cmd As New System.Data.SQL

在 Startup.cs 的 ConfigureServices 方法中,添加一個服務

你classid字段是什么類型? 如果是數字類型,那就把 Sql = "Select id,title,pic,Keywords,content From product where classid='" &cid& "' Order by d

// 設置驗證方式為 Bearer Token // 你也可以添加 using Microsoft.AspNetCore.Authentication.JwtBearer; // 使用 JwtBearerDefaults.AuthenticationScheme 代替 字符串 "Brearer" services.AddAuthentication("Bearer") .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdABCD1234abcdABCD1234")), // 加密解密Token的密鑰 // 是否驗證發布者 ValidateIssuer = true, // 發布者名稱 ValidIssuer = "server", // 是否驗證訂閱者 // 訂閱者名稱 ValidateAudience = true, ValidAudience = "client007", // 是否驗證令牌有效期 ValidateLifetime = true, // 每次頒發令牌,令牌有效時間 ClockSkew = TimeSpan.FromMinutes(120) }; });

樓主已發,請注意查收

修改 Configure 中的中間件

這個跟國內還是國外沒有關系。 ------------------------------------------------- 語言是國際化的標準。你可能服務器沒有配置好(跨國域名問題),但是JS是客戶端的,如果是新加坡那邊看國

app.UseHttpsRedirection();app.UseRouting();app.UseAuthentication(); // 注意這里app.UseAuthorization();

dataconn.eccom("insert into tb_StuResult " + "(stu_id,which_lesson,taotiid,taotiname,res_single,res_more) " + "values('" + lblStuID.Te

就是這么簡單,通過以上設置,要求驗證請求是否有權限。

用Js 寫或在后臺控制都可以實現!用if()else{} 來判斷<Input type="radio" disabled="disabled">

1.2 頒發 Token

加一個模版列,綁定數據按 ((double)投票數/(double)總人數*100).tostring().substring(0,4)+"%";

頒發的 Token ,ASP.NET Core 不會保存。

substr(string,start,length) 正數 - 從 start 參數所在的位置返回 負數 - 從字符串末端返回

ASP.NET Core 啟用了 Token 認證,你隨便將生成 Token 的代碼放到不同程序的控制臺,只要密鑰和 Issuer 和 Audience 一致,生成的 Token 就可以登錄這個 ASP.NET Core。

也就是說,可以隨意創建控制臺程序生成 Token,生成的 Token 完全可以登錄 ASP.NET Core 程序。

至于原因,我們后面再說,

在 Program.cs 中,添加一個這樣的方法

static void ConsoleToke() { // 定義用戶信息 var claims = new Claim[] { new Claim(ClaimTypes.Name, "癡者工良"), new Claim(JwtRegisteredClaimNames.Email, "[email protected]"), }; // 和 Startup 中的配置一致 SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdABCD1234abcdABCD1234")); JwtSecurityToken token = new JwtSecurityToken( issuer: "server", audience: "client007", claims: claims, notBefore: DateTime.Now, expires: DateTime.Now.AddMinutes(30), signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) ); string jwtToken = new JwtSecurityTokenHandler().WriteToken(token); Console.WriteLine(jwtToken); }

Main() 中,調用此方法

public static void Main(string[] args) { ConsoleToke(); CreateHostBuilder(args).Build().Run(); }

1.3 添加 API訪問

我們添加一個 API。

[Authorize] 特性用于標識此 Controller 或 Action 需要使用合規的 Token 才能登錄。

[Authorize] [Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { public string Get() { Console.WriteLine(User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Name)); return "訪問成功"; } }

然后啟動 ASP.NET Core,在 Postman 測試 訪問 https://localhost/api/home。

發現報 401 (無權限)狀態碼,這是因為請求時不攜帶令牌,會導致不能訪問 API。

從控制臺終端復制生成的 Token 碼,復制到 Postman 中,再次訪問,發現響應狀態碼為 200,響應成功。

ASP.NET Core 自帶 jwt 認證大概就是這樣。

那么,ASP.NET Core 內部是如何實現的呢?又有哪些特性哪些坑呢?請往下看~

2,探究授權認證中間件

在上面的操作中,我們在管道配置了兩個中間件。

app.UseAuthentication();app.UseAuthorization();

app.UseAuthentication(); 的作用是通過 ASP.NET Core 中配置的授權認證,讀取客戶端中的身份標識(Cookie,Token等)并解析出來,存儲到 context.User 中。

app.UseAuthorization(); 的作用是判斷當前訪問 Endpoint (Controller或Action)是否使用了 [Authorize]以及配置角色或策略,然后校驗 Cookie 或 Token 是否有效。

使用特性設置相應通過認證才能訪問,一般有以下情況。

// 不適用特性,可以直接訪問 public class AController : ControllerBase { public string Get() { return "666"; } } /// <summary> /// 整個控制器都需要授權才能訪問 /// </summary> [Authorize] public class BController : ControllerBase { public string Get() { return "666"; } } public class CController : ControllerBase { // 只有 Get 需要授權 [Authorize] public string Get() { return "666"; } public string GetB() { return "666"; } } /// <summary> /// 整個控制器都需要授權,但 Get 不需要 /// </summary> [Authorize] public class DController : ControllerBase { [AllowAnonymous] public string Get() { return "666"; } }

2.1 實現 Token 解析

至于 ASP.NET Core 中,app.UseAuthentication();app.UseAuthorization(); 的源代碼各種使用了一個項目來寫,代碼比較多。要理解這兩個中間件的作用,我們不妨來手動實現他們的功能。

解析出的 Token 是一個 ClaimsPrincipal 對象,將此對象給 context.User 賦值,然后在 API 中可以使用 User 實例來獲取用戶的信息。

在中間件中,使用下面的代碼可以獲取客戶端請求的 Token 解析。

context.RequestServices.GetRequiredService<IAuthenticationService>().AuthenticateAsync(context, JwtBearerDefaults.AuthenticationScheme);

那么,我們如何手工從原生的 Http 請求中,解析出來呢?且看我慢慢來分解步驟。

首先創建一個 TestMiddleware 文件,作為中間件使用。

public class TestMiddleware { private readonly RequestDelegate _next; jwtSecurityTokenHandler = new JwtSecurityTokenHandler(); public TestMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } // 我們寫代碼的區域 // 我們寫代碼的區域 await _next(context); } }

2.1.1 從 Http 中獲取 Token

下面代碼可以中 http 請求中,取得頭部的 Token 。

當然,客戶端可能沒有攜帶 Token,可能獲取結果為 null ,自己加個判斷。

貼到代碼區域。

string tokenStr = context.Request.Headers["Authorization"].ToString();

Header 的 Authorization 鍵,是由 Breaer {Token}組成的字符串。

2.1.2 判斷是否為有效令牌

拿到 Token 后,還需要判斷這個 Token 是否有效。

因為 Authorization 是由 Breaer {Token}組成,所以我們需要去掉前面的 Brear 才能獲取 Token。

/// <summary> /// Token是否是符合要求的標準 Json Web 令牌 /// </summary> /// <param name="tokenStr"></param> /// <returns></returns> public bool IsCanReadToken(ref string tokenStr) { if (string.IsNullOrWhiteSpace(tokenStr) || tokenStr.Length < 7) return false; if (!tokenStr.Substring(0, 6).Equals(Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme)) return false; tokenStr = tokenStr.Substring(7); bool isCan = jwtSecurityTokenHandler.CanReadToken(tokenStr); return isCan; }

獲得 Token 后,通過 JwtSecurityTokenHandler.CanReadToken(tokenStr); 來判斷 Token 是否符合協議規范。

將下面判斷貼到代碼區域。

if (!IsCanReadToken(ref tokenStr)) return ;

2.1.3 解析 Token

下面代碼可以將 Header 的 Authorization 內容轉為 JwtSecurityToken 對象。

(截取字符串的方式很多種,喜歡哪個就哪個。。。)

/// <summary> /// 從Token解密出JwtSecurityToken,JwtSecurityToken : SecurityToken /// </summary> /// <param name="tokenStr"></param> /// <returns></returns> public JwtSecurityToken GetJwtSecurityToken(string tokenStr) { var jwt = jwtSecurityTokenHandler.ReadJwtToken(tokenStr); return jwt; }

不過這個 GetJwtSecurityToken 不是我們關注的內容,我們是要獲取 Claim。

JwtSecurityToken.Claims

將下面代碼貼到代碼區域

JwtSecurityToken jst = GetJwtSecurityToken(tokenStr);IEnumerable<Claim> claims = jst.Claims;

2.1.4 生成 context.User

context.User 是一個 ClaimsPrincipal 類型,我們通過解析出的 Claim,生成 ClaimsPrincipal。

JwtSecurityToken jst = GetJwtSecurityToken(tokenStr);IEnumerable<Claim> claims = jst.Claims;List<ClaimsIdentity> ci = new List<ClaimsIdentity>() { new ClaimsIdentity(claims) };context.User = new ClaimsPrincipal(ci);

最終的代碼塊是這樣的

// 我們寫代碼的區域 string tokenStr = context.Request.Headers["Authorization"].ToString(); string requestUrl = context.Request.Path.Value; if (!IsCanReadToken(ref tokenStr)) return; JwtSecurityToken jst = GetJwtSecurityToken(tokenStr); IEnumerable<Claim> claims = jst.Claims; List<ClaimsIdentity> ci = new List<ClaimsIdentity>() { new ClaimsIdentity(claims) }; context.User = new ClaimsPrincipal(ci); var x = new ClaimsPrincipal(ci); // 我們寫代碼的區域

2.2 實現校驗認證

app.UseAuthentication(); 的大概實現過程已經做出了說明,現在我們來繼續實現 app.UseAuthorization(); 中的功能。

繼續使用上面的中間件,在原代碼塊區域添加新的區域。

// 我們寫代碼的區域// 我們寫的代碼塊

 22.2.1 Endpoint

Endpoint 標識了一個 http 請求所訪問的路由信息和 Controller 、Action 及其特性等信息。

[Authorize] 特性繼承了 IAuthorizeData[AllowAnonymous] 特性繼承了 IAllowAnonymous

以下代碼可以獲取所訪問的節點信息。

var endpoint = context.GetEndpoint();

那么如何判斷所訪問的 Controller 和 Action 是否使用了認證相關的特性?

var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();

Metadata 是一個 ASP.NET Core 實現的集合對象,GetOrderedMetadata<T> 可以找出需要的特性信息。

這個集合不會區分是 Contrller 還是 Action 的 [Authorize] 特性。

那么判斷 是否有 [AllowAnonymous] 特性,可以這樣使用。

if (endpoint?.Metadata.GetMetadata<IAllowAnonymous>() != null) { await _next(context); return; }

到此這篇關于淺談ASP.NET Core 中jwt授權認證的流程原理的文章就介紹到這了,更多相關ASP.NET Core jwt授權認證內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

應該是ASP。NET吧這個不錯啊內容來自www.13333515.buzz請勿采集。


  • 本文相關:
  • asp.net core3.0中使用jwt認證的實現
  • asp.net core集成jwt的步驟記錄
  • asp.net core基于jwt認證的數據接口網關實例代碼
  • c#實現pdf導出 .net導出pdf文件
  • c# 添加文字水印類代碼
  • 詳解在asp.net core 中使用cookie中間件
  • .net core簡單使用mvc內置的ioc
  • asp.net將文件寫到另一服務器(圖文教程)及注意事項
  • asp.net中命名空間namespace淺析和使用例子
  • asp.net mvc 中實現基于角色的權限控制的處理方法
  • mvc下,3種窗口彈出設置的方法
  • could not load file or assembly "app_licenses.dll"
  • 去除html標簽刪除html示例代碼
  • ASP.NE與PHP比較
  • ASP.ne問題t
  • asp.ne與ACCESS數據庫相對路徑
  • asp.ne怎么把查詢結果顯示到table里面
  • 在asp.ne用C#編寫一個簡單留言板程序,怎樣提取用戶登錄的用...
  • asp.ne服務器t控件和html控件的區別
  • 求asp.ne高級視頻教程?
  • ASP.NE框架頁取框架主頁地址欄的值?
  • asp.net vb.ne c#都是.net框架下可以使用的編程語言嗎
  • 在哪學習asp.ne比較好,或者哪有好的asp.net教程?
  • 強類型數據集DataSet 在ASP.NE中適用嗎?
  • 請在vs2008中用vb.net寫asp.ne代碼t幫助我:收QQ郵件讀正文內...
  • asp.ne應用程序 能夠存取的數據類型和對應的存取技術
  • 求asp.ne3.5 揭秘中文版以及新人學習基于asp.net的web開發 書...
  • asp.ne做的項目,頁面上有JS菜單,在國內可以測試使用?大神們...
  • ASP.ne問題t
  • 在asp.ne前臺中,怎么將bype類型的0和1轉換為“已禁用”和“...
  • asp.ne和數據庫連接做出這樣一個頁面這么做關鍵是后面百分比
  • 如何將這個PHP函數換成asp.ne(C#)t函數
  • C#asp.nexception 的命名空間是什么呀?大家幫幫忙,在線等
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全基礎應用實用技巧自學過程首頁asp.netasp.net core3.0中使用jwt認證的實現asp.net core集成jwt的步驟記錄asp.net core基于jwt認證的數據接口網關實例代碼c#實現pdf導出 .net導出pdf文件c# 添加文字水印類代碼詳解在asp.net core 中使用cookie中間件.net core簡單使用mvc內置的iocasp.net將文件寫到另一服務器(圖文教程)及注意事項asp.net中命名空間namespace淺析和使用例子asp.net mvc 中實現基于角色的權限控制的處理方法mvc下,3種窗口彈出設置的方法could not load file or assembly "app_licenses.dll"去除html標簽刪除html示例代碼java正則表達式 pattern和matche未將對象引用設置到對象的實例 (asp.net(c#)網頁跳轉七種方法小結未能加載文件或程序集“xxx”或它asp.net“服務器應用程序不可用”asp.net中的幾種彈出框提示基本實asp.net gridview 72般絕技asp.net生成excel并導出下載五種asp.net對路徑"xxxxx"asp.net漢字轉拼音和獲取漢字首字淺談asp.net mvc之action如何傳多個參數的updatepanel用法之triggers使用示例c#默認以管理員身份運行程序實現代碼asp.net下對cookies的操作實現代碼asp.net中的datagridview綁定數據和選中行repeater 分列顯示以及布局的實例代碼asp.net 仿騰訊微薄提示 還能輸入*個字符asp.net mvc4+ef5+easyui+unity2.x注入的asp.net core中服務的生命周期選項區別與asp.net(文章截取前幾行作為列表摘要)無
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.13333515.buzz All Rights Reserved
    3排列五开奖结果