您好,登錄后才能下訂單哦!
這篇文章主要講解了“ASP.NET Core使用JWT認證授權的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ASP.NET Core使用JWT認證授權的方法”吧!
概述
認證授權是很多系統的基本功能 , 在以前PC的時代 , 通常是基于cookies-session這樣的方式實現認證授權 , 在那個時候通常系統的用戶量都不會很大, 所以這種方式也一直很好運行, 隨著現在都軟件用戶量越來越大, 系統架構也從以前垂直擴展(增加服務器性能) -> 水平擴展(增加服務器數量)
cookies-session 工作方式
客戶端提交用戶信息 -> 服務器識別用戶 -> 服務端保存用戶信息 -> 返回session-id客戶端 -> 客戶端保存session-id -> 每次請求cookies帶上session-id
這種方式也不是不能水平擴展 , 例如 , session復制/第三方保存session(數據庫 , Redis)
名詞解析
認證 : 識別用戶是否合法
授權: 賦予用戶權限 (能訪問哪些資源)
鑒權: 鑒定權限是否合法
Jwt優勢與劣勢
優勢
無狀態
token 存儲身份驗證所有信息 , 服務端不需要保存用戶身份驗證信息, 減少服務端壓力 , 服務端更容易水平擴展, 由于無狀態, 又會導致它最大缺點 , 很難注銷
2、支持跨域訪問
Cookie是不允許垮域訪問的,token支持
3、跨語言
基于標準化的 JSON Web Token (JWT) , 不依賴特定某一個語言 , 例如生成對Token可以對多個語言使用(Net , Java , PHP ...)
劣勢
1、Token有效性問題
后臺很難注銷已經發布的Token , 通常需要借助第三方儲存(數據庫/緩存) 實現注銷, 這樣就會失去JWT最大的優勢
2、占帶寬
Token長度(取決存放內容) 比session_id大 , 每次請求多消耗帶寬 , token只存必要信息 , 避免token過長
3、需要實現續簽
cookies - session 通常是框架已經實現續簽功能, 每次訪問把過期時間更新, JWT需要自己實現, 參考OAuth3刷新Token機制實現刷新Token
4、消耗更多CPU
每次請求需要對內容解密和驗證簽名這兩步操作,典型用時間換空間
只能根據自身使用場景決定使用哪一種身份驗證方案 , 沒有一種方案是通用的,完美的
AspNetCore集成Jwt認證
1、添加包
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2、添加配置
"JwtOptions": { "Issuer": "https://localhost:5001", "Audience": "https://localhost:5001", "SecurityKey": "1G3l0yYGbOINId3A*ioEi4iyxR7$SPzm" }
3、Jwt Bearer 擴展(選項)
public static AuthenticationBuilder AddJwtBearer(this IServiceCollection services, Action<JwtOptions> configureOptions) { if (configureOptions == null) throw new ArgumentNullException(nameof(configureOptions)); var jwtOptions = new JwtOptions() { Issuer = "Jwt Authentication", Audience = "Wilson Pan Web Api", }; // set customs optoins configureOptions(jwtOptions); // update Options services.PostConfigure<JwtOptions>(options => { options.Issuer = jwtOptions.Issuer; options.Audience = jwtOptions.Audience; options.SecurityKey = jwtOptions.SecurityKey; }); return services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters() { ValidIssuer = jwtOptions.Issuer, ValidAudience = jwtOptions.Audience, ValidateIssuer = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = jwtOptions.SymmetricSecurityKey }; }); }
4、ConfigureServices
services.AddJwtBearer(options => { options.Issuer = Configuration.GetValue<string>("JwtOptions:Issuer"); options.Audience = Configuration.GetValue<string>("JwtOptions:Audience"); options.SecurityKey = Configuration.GetValue<string>("JwtOptions:SecurityKey"); });
5、Configure
app.UseAuthentication(); app.UseAuthorization();
6、add AuthorizeController
//define claim var claims = new Claim[] { new Claim(ClaimTypes.Name, username), new Claim(ClaimTypes.Email, $"{username}@github.com"), new Claim(ClaimTypes.Role, username == "WilsonPan" ? "Admin" : "Reader"), new Claim(ClaimTypes.Hash, JwtHashHelper.GetHashString($"{username}:{password}:{System.DateTime.Now.Ticks}")), }; //define JwtSecurityToken var token = new JwtSecurityToken( issuer: _jwtOptions.Issuer, audience: _jwtOptions.Audience, claims: claims, expires: System.DateTime.Now.AddMinutes(5), signingCredentials: _jwtOptions.SigningCredentials ); // generate token var result = new JwtSecurityTokenHandler().WriteToken(token);
7、Contrller/Action 添加認證授權
[ApiController] [Authorize] [Route("[controller]")] public class ApiController : ControllerBase { ... } [HttpPost] [Authorize(Roles = "Admin")] public IActionResult Post() { return Ok(); }
Rest Client
dotnet run
1、認證接口
@host = https://localhost:5001 # @name token POST {{host}}/Authorize HTTP/1.1 Content-Type: application/x-www-form-urlencoded #username=Wilson&password=123456 # admin username=WilsonPan&password=123456
2、需要授權接口
### required authorize GET {{host}}/api HTTP/1.1 Authorization: Bearer {{token.response.body.*}}
3、需要管理員角色接口
### required authorize POST {{host}}/api HTTP/1.1 Authorization: Bearer {{token.response.body.*}}
示例代碼
總結
感謝各位的閱讀,以上就是“ASP.NET Core使用JWT認證授權的方法”的內容了,經過本文的學習后,相信大家對ASP.NET Core使用JWT認證授權的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。