ASP.NET Core學(xué)習(xí)之使用JWT認(rèn)證授權(quán)詳解
概述
認(rèn)證授權(quán)是很多系統(tǒng)的基本功能 , 在以前PC的時(shí)代 , 通常是基于cookies-session這樣的方式實(shí)現(xiàn)認(rèn)證授權(quán) , 在那個(gè)時(shí)候通常系統(tǒng)的用戶量都不會(huì)很大, 所以這種方式也一直很好運(yùn)行, 隨著現(xiàn)在都軟件用戶量越來越大, 系統(tǒng)架構(gòu)也從以前垂直擴(kuò)展(增加服務(wù)器性能) -> 水平擴(kuò)展(增加服務(wù)器數(shù)量)
cookies-session 工作方式
客戶端提交用戶信息 -> 服務(wù)器識(shí)別用戶 -> 服務(wù)端保存用戶信息 -> 返回session-id客戶端 -> 客戶端保存session-id -> 每次請(qǐng)求cookies帶上session-id
這種方式也不是不能水平擴(kuò)展 , 例如 , session復(fù)制/第三方保存session(數(shù)據(jù)庫 , Redis)
名詞解析
認(rèn)證 : 識(shí)別用戶是否合法
授權(quán): 賦予用戶權(quán)限 (能訪問哪些資源)
鑒權(quán): 鑒定權(quán)限是否合法
Jwt優(yōu)勢與劣勢
優(yōu)勢
無狀態(tài)
token 存儲(chǔ)身份驗(yàn)證所有信息 , 服務(wù)端不需要保存用戶身份驗(yàn)證信息, 減少服務(wù)端壓力 , 服務(wù)端更容易水平擴(kuò)展, 由于無狀態(tài), 又會(huì)導(dǎo)致它最大缺點(diǎn) , 很難注銷
2、支持跨域訪問
Cookie是不允許垮域訪問的,token支持
3、跨語言
基于標(biāo)準(zhǔn)化的 JSON Web Token (JWT) , 不依賴特定某一個(gè)語言 , 例如生成對(duì)Token可以對(duì)多個(gè)語言使用(Net , Java , PHP ...)
劣勢
1、Token有效性問題
后臺(tái)很難注銷已經(jīng)發(fā)布的Token , 通常需要借助第三方儲(chǔ)存(數(shù)據(jù)庫/緩存) 實(shí)現(xiàn)注銷, 這樣就會(huì)失去JWT最大的優(yōu)勢
2、占帶寬
Token長度(取決存放內(nèi)容) 比session_id大 , 每次請(qǐng)求多消耗帶寬 , token只存必要信息 , 避免token過長
3、需要實(shí)現(xiàn)續(xù)簽
cookies - session 通常是框架已經(jīng)實(shí)現(xiàn)續(xù)簽功能, 每次訪問把過期時(shí)間更新, JWT需要自己實(shí)現(xiàn), 參考OAuth2刷新Token機(jī)制實(shí)現(xiàn)刷新Token
4、消耗更多CPU
每次請(qǐng)求需要對(duì)內(nèi)容解密和驗(yàn)證簽名這兩步操作,典型用時(shí)間換空間
只能根據(jù)自身使用場景決定使用哪一種身份驗(yàn)證方案 , 沒有一種方案是通用的,完美的
AspNetCore集成Jwt認(rèn)證
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 擴(kuò)展(選項(xiàng))
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 添加認(rèn)證授權(quán)
[ApiController] [Authorize] [Route("[controller]")] public class ApiController : ControllerBase { ... } [HttpPost] [Authorize(Roles = "Admin")] public IActionResult Post() { return Ok(); }
Rest Client
dotnet run
1、認(rèn)證接口
@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、需要授權(quán)接口
### 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.*}}
總結(jié)
到此這篇關(guān)于ASP.NET Core學(xué)習(xí)之使用JWT認(rèn)證授權(quán)的文章就介紹到這了,更多相關(guān)ASP.NET Core用JWT認(rèn)證授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
.net Core連接MongoDB數(shù)據(jù)庫的步驟詳解
這篇文章主要給大家介紹了關(guān)于.net Core連接MongoDB數(shù)據(jù)庫步驟的相關(guān)資料,文中將實(shí)現(xiàn)的步驟一步步介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02asp.net中顯示1至20相同數(shù)字相乘的結(jié)果,若值比50小就不顯示
感興趣的網(wǎng)友也可以練習(xí)練習(xí)?,F(xiàn)在Insus.NET的作答如下,但老師還沒有看,因此答案是否正確或是最好的,還不能確定,只是供參考2012-05-05ASP.NET對(duì)HTML頁面元素進(jìn)行權(quán)限控制(三)
界面每個(gè)元素的權(quán)限也是需要控制的。比如一個(gè)查詢用戶的界面里面有查詢用戶按鈕,添加用戶按鈕,刪除用戶按鈕,不同的角色我們得分配不同的權(quán)限2013-12-12ASP.NET MVC5網(wǎng)站開發(fā)之展示層架構(gòu)(五)
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC5網(wǎng)站開發(fā)之展示層架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08ASP.NET MVC中SignalR的簡單應(yīng)用
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC中SignalR的簡單應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07asp.net后臺(tái)如何輸出js腳本使用什么方法可以實(shí)現(xiàn)
asp.net后臺(tái)如何輸出js腳本,用page.ClientScript.RegisterStartupScript方式實(shí)現(xiàn),實(shí)現(xiàn)示例如下,感興趣的朋友不要錯(cuò)過2014-01-01ASP.net基礎(chǔ)知識(shí)之常見錯(cuò)誤分析
ASP.net基礎(chǔ)知識(shí)之常見錯(cuò)誤分析...2007-07-07