最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net Core官方JWT授權(quán)驗(yàn)證的全過(guò)程

 更新時(shí)間:2020年12月01日 11:44:38   作者:以往清泉  
這篇文章主要給大家介紹了關(guān)于.Net Core官方JWT授權(quán)驗(yàn)證的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是JWT?

JSON Web令牌(JWT)是一個(gè)開(kāi)放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間安全地傳輸信息作為JSON對(duì)象。由于此信息是經(jīng)過(guò)數(shù)字簽名的,因此可以被驗(yàn)證和信任??梢允褂妹孛埽ㄊ褂肏MAC算法)或使用RSA或ECDSA的公鑰/私鑰對(duì)對(duì)JWT進(jìn)行簽名。

盡管可以對(duì)JWT進(jìn)行加密以提供雙方之間的保密性,但我們將重點(diǎn)關(guān)注已簽名的令牌。簽名的令牌可以驗(yàn)證其中包含的聲明的完整性,而加密的令牌則將這些聲明隱藏在其他方的面前。當(dāng)使用公鑰/私鑰對(duì)對(duì)令牌進(jìn)行簽名時(shí),簽名還證明只有持有私鑰的一方才是對(duì)其進(jìn)行簽名的一方。由于缺乏安全性,所以不能把如密碼等敏感信息放在令牌中。

什么時(shí)候應(yīng)該使用JWT?

以下是JSON Web令牌有用的一些情況:

  • 授權(quán):這是使用JWT的最常見(jiàn)方案。一旦用戶登錄,每個(gè)后續(xù)請(qǐng)求將包括JWT,從而允許用戶訪問(wèn)該令牌允許的路由,服務(wù)和資源。單一登錄是當(dāng)今廣泛使用JWT的一項(xiàng)功能,因?yàn)樗拈_(kāi)銷很小并且可以在不同的域中輕松使用。
  • 信息交換:JSON Web令牌是在各方之間安全傳輸信息的好方法。因?yàn)榭梢詫?duì)JWT進(jìn)行簽名(例如,使用公鑰/私鑰對(duì)),所以您可以確定發(fā)件人是他們所說(shuō)的人。此外,由于簽名是使用標(biāo)頭和有效負(fù)載計(jì)算的,因此您還可以驗(yàn)證內(nèi)容是否未被篡改。

JWT結(jié)構(gòu)是什么?

JSON Web令牌以緊湊的形式由三部分組成,這些部分由點(diǎn)(.)分隔,分別是:

  • 標(biāo)頭
  • 有效載荷
  • 簽名

因此,JWT通常如下所示。

xxxxx.yyyyy.zzzzz

標(biāo)頭:通常由兩部分組成,令牌類型和使用的簽名算法。

{
 "alg": "HS256",
 "typ": "JWT"
}

有效載荷:有三種說(shuō)明類型,預(yù)定義聲明、公共聲明和私有聲明。聲明名稱僅是三個(gè)字符,因?yàn)镴WT是緊湊的

  • 預(yù)定義聲明:包括iss(發(fā)出者), exp(到期時(shí)間), sub(主題), aud(受眾)等,是推薦的但是不是強(qiáng)制的可以沒(méi)有。
  • 公共聲明:公共聲明,這個(gè)部分可以隨便定義,但是要注意和 IANA JSON Web Token 沖突。
  • 私有聲明:這個(gè)部分是共享被認(rèn)定信息中自定義部分。

簽名:要?jiǎng)?chuàng)建簽名部分,您必須獲取編碼的標(biāo)頭,編碼的有效負(fù)載,機(jī)密,標(biāo)頭中指定的算法,并對(duì)其進(jìn)行簽名。

例如,如果要使用HMAC SHA256算法,則將通過(guò)以下方式創(chuàng)建簽名:

HMACSHA256(
 base64UrlEncode(header) + "." +
 base64UrlEncode(payload),
 secret)

簽名用于驗(yàn)證消息在此過(guò)程中沒(méi)有更改,并且對(duì)于使用私鑰進(jìn)行簽名的令牌,它還可以驗(yàn)證JWT的發(fā)送者是它所說(shuō)的真實(shí)身份。

組合在一起如下為輸出是三個(gè)由點(diǎn)分隔的Base64-URL字符串:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjUyMDAiLCJhdWQiOlsiYXBpIiwiYXBpIl0sIkd1aWQiOiIzM2NhZmJkNS1jZWEyLTRjOWMtYWZlYS01MDYyZjM3YWUyOTAiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOlsic3lzdGVtIiwiYWRtaW4iXSwiZXhwIjoxNjA2NjU2NjI0fQ.
JvDHuowbOnWiyxMIFc9gG5rw1LSSc0xx68L31oRfxS0

如何使用JWT

每當(dāng)用戶想要訪問(wèn)受保護(hù)的路由或資源時(shí),用戶代理都應(yīng)發(fā)送JWT,通常使用承載模式在Authorization標(biāo)頭中發(fā)送JWT 。標(biāo)頭的內(nèi)容應(yīng)如下所示:

Authorization: Bearer <token>

在某些情況下,這可以是無(wú)狀態(tài)授權(quán)機(jī)制。服務(wù)器的受保護(hù)路由將在Authorization標(biāo)頭中檢查有效的JWT ,如果存在,則將允許用戶訪問(wèn)受保護(hù)的資源。如果JWT包含必要的數(shù)據(jù),則可以減少查詢數(shù)據(jù)庫(kù)中某些操作的需求,盡管這種情況并非總是如此。

如果令牌是在Authorization標(biāo)頭中發(fā)送的,則跨域資源共享(CORS)不會(huì)成為問(wèn)題,因?yàn)樗皇褂胏ookie。

下圖顯示了如何獲取JWT并將其用于訪問(wèn)API或資源:

  1. 應(yīng)用程序或客戶端向授權(quán)服務(wù)器請(qǐng)求授權(quán)。這是通過(guò)不同的授權(quán)流程之一執(zhí)行的。例如,典型的符合OpenID Connect的Web應(yīng)用程序?qū)?oauth/authorize使用授權(quán)代碼流通過(guò)端點(diǎn)。
  2. 授予授權(quán)后,授權(quán)服務(wù)器會(huì)將訪問(wèn)令牌返回給應(yīng)用程序。
  3. 該應(yīng)用程序使用訪問(wèn)令牌來(lái)訪問(wèn)受保護(hù)的資源(例如API)。

請(qǐng)注意,使用簽名的令牌,令牌中包含的所有信息都會(huì)暴露給用戶或其他方,即使他們無(wú)法更改它。這意味著您不應(yīng)將機(jī)密信息放入令牌中。

.net core的JWT驗(yàn)證授權(quán)

我們直接新建一個(gè).net core webapi的項(xiàng)目,我這里版本是3.1的

1. 先使用nuget安裝:Microsoft.AspNetCore.Authentication.JwtBearer。注意版本和.net core版本的兼容。net5的支持5.0.0+的版本,否則就用對(duì)應(yīng)可以用的低版本吧。

2. 在appsettings.json配置文件中寫好我們的 JWT 的配置參數(shù)如下:

 "Jwt": {
 "Secret": "your-256-bit-secret",
 "Iss": "https://localhost:44355",
 "Aud": "api"
 }

3. 在Startup.cs的ConfigureServices方法中添加授權(quán)認(rèn)證如下:

var jwtConfig = Configuration.GetSection("Jwt");
//生成密鑰
var symmetricKeyAsBase64 = jwtConfig.GetValue<string>("Secret");
var keyByteArray = Encoding.ASCII.GetBytes(symmetricKeyAsBase64);
var signingKey = new SymmetricSecurityKey(keyByteArray);
//認(rèn)證參數(shù)
services.AddAuthentication("Bearer")
 .AddJwtBearer(o =>
 {
  o.TokenValidationParameters = new TokenValidationParameters
  {
   ValidateIssuerSigningKey = true,//是否驗(yàn)證簽名,不驗(yàn)證的畫可以篡改數(shù)據(jù),不安全
   IssuerSigningKey = signingKey,//解密的密鑰
   ValidateIssuer = true,//是否驗(yàn)證發(fā)行人,就是驗(yàn)證載荷中的Iss是否對(duì)應(yīng)ValidIssuer參數(shù)
   ValidIssuer = jwtConfig.GetValue<string>("Iss"),//發(fā)行人
   ValidateAudience = true,//是否驗(yàn)證訂閱人,就是驗(yàn)證載荷中的Aud是否對(duì)應(yīng)ValidAudience參數(shù)
   ValidAudience = jwtConfig.GetValue<string>("Aud"),//訂閱人
   ValidateLifetime = true,//是否驗(yàn)證過(guò)期時(shí)間,過(guò)期了就拒絕訪問(wèn)
   ClockSkew = TimeSpan.Zero,//這個(gè)是緩沖過(guò)期時(shí)間,也就是說(shuō),即使我們配置了過(guò)期時(shí)間,這里也要考慮進(jìn)去,過(guò)期時(shí)間+緩沖,默認(rèn)好像是7分鐘,你可以直接設(shè)置為0
   RequireExpirationTime = true,
  };
 });

在Configure方法中添加 app.UseAuthentication() 和 app.UseAuthorization() 注意位置需要放置的位置:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
 if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}
 app.UseHttpsRedirection();
 app.UseRouting();
 app.UseAuthentication();
 app.UseAuthorization();
 app.UseEndpoints(endpoints =>{ endpoints.MapControllers();});
}

4. 生成jwt令牌,在默認(rèn)生成的控制器 WeatherForecastController 中添加如下生成令牌的方法:

[HttpPost]
public IActionResult Authenticate()
{
 var jwtConfig = Configuration.GetSection("Jwt");
 //秘鑰,就是標(biāo)頭,這里用Hmacsha256算法,需要256bit的密鑰
 var securityKey = new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(jwtConfig.GetValue<string>("Secret"))), SecurityAlgorithms.HmacSha256);
 //Claim,JwtRegisteredClaimNames中預(yù)定義了好多種默認(rèn)的參數(shù)名,也可以像下面的Guid一樣自己定義鍵名.
 //ClaimTypes也預(yù)定義了好多類型如role、email、name。Role用于賦予權(quán)限,不同的角色可以訪問(wèn)不同的接口
 //相當(dāng)于有效載荷
 var claims = new Claim[] {
    new Claim(JwtRegisteredClaimNames.Iss,jwtConfig.GetValue<string>("Iss")),
    new Claim(JwtRegisteredClaimNames.Aud,jwtConfig.GetValue<string>("Aud")),
    new Claim("Guid",Guid.NewGuid().ToString("D")),
    new Claim(ClaimTypes.Role,"system"),
    new Claim(ClaimTypes.Role,"admin"),
 };
 SecurityToken securityToken = new JwtSecurityToken(
  signingCredentials: securityKey,
  expires: DateTime.Now.AddMinutes(2),//過(guò)期時(shí)間
  claims: claims
 );
 //生成jwt令牌
 return Content(new JwtSecurityTokenHandler().WriteToken(securityToken));
}

5. 使用jwt控制接口的訪問(wèn),我們?cè)谝粋€(gè)接口上添加一個(gè)特性 [Authorize(Roles ="admin")],表示需要有admin這個(gè)角色的jwt令牌才能訪問(wèn),沒(méi)有roles參數(shù)的話表示只要是可用的令牌就可以訪問(wèn),多個(gè)role角色可以疊加多個(gè)特性:

[HttpGet]
[Authorize(Roles = "admin")]
[Authorize(Roles = "system")]
public IEnumerable<WeatherForecast> Get()
{
 var rng = new Random();
 return Enumerable.Range(1, 5).Select(index => new WeatherForecast
 {
  Date = DateTime.Now.AddDays(index),
  TemperatureC = rng.Next(-20, 55),
  Summary = Summaries[rng.Next(Summaries.Length)]
 })
 .ToArray();
}

6.測(cè)試,然后我們用postman就可以測(cè)試了,可以看到非常成功有數(shù)據(jù)。

 

進(jìn)階

認(rèn)證的時(shí)候可以添加事件,如下面的認(rèn)證失敗事件、接收參數(shù)事件可以獲取url上的參數(shù)作為令牌而不是通過(guò)http的請(qǐng)求頭的Authorization。

services.AddAuthentication("Bearer")
 .AddJwtBearer(o =>
 {
  o.Events = new JwtBearerEvents()
  {
   OnMessageReceived = context =>
   {
    context.Token = context.Request.Query["access_token"];
    return Task.CompletedTask;
   },
   OnAuthenticationFailed = context =>
   {
    // 如果過(guò)期,則把<是否過(guò)期>添加到,返回頭信息中
    if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
    {
     context.Response.Headers.Add("Token-Expired", "true");
    }
    return Task.CompletedTask;
   }
  };
 });

總結(jié)

到此這篇關(guān)于.Net Core官方JWT授權(quán)驗(yàn)證的文章就介紹到這了,更多相關(guān).Net Core官方JWT授權(quán)驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .NET  Visual Studio 代碼性能分析工具

    .NET Visual Studio 代碼性能分析工具

    大家都知道性能優(yōu)化對(duì)程序員至關(guān)重要,一個(gè)小問(wèn)題可能導(dǎo)致程序癱瘓,這里我就給大家介紹如何使用工具幫助程序員進(jìn)行代碼性能優(yōu)化,需要的朋友可以參考下
    2015-07-07
  • asp.net 4.0+ webform程序中集成mvc4

    asp.net 4.0+ webform程序中集成mvc4

    這篇文章主要介紹了asp.net 4.0+ webform程序中集成mvc4的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • WPF使用VisualTreeHelper進(jìn)行命中測(cè)試

    WPF使用VisualTreeHelper進(jìn)行命中測(cè)試

    這篇文章介紹了WPF使用VisualTreeHelper進(jìn)行命中測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • asp.net(c#)開(kāi)發(fā)中的文件上傳組件uploadify的使用方法(帶進(jìn)度條)

    asp.net(c#)開(kāi)發(fā)中的文件上傳組件uploadify的使用方法(帶進(jìn)度條)

    在asp.net開(kāi)發(fā)中,有很多可以上傳的組件模塊,利用HTML的File控件(uploadify)的上傳也是一種辦法,這里為大家介紹一下(uploadify)的一些使用方法
    2012-12-12
  • DataGridView使用自定義控件實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能(推薦)

    DataGridView使用自定義控件實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能(推薦)

    這篇文章主要介紹了DataGridView使用自定義控件實(shí)現(xiàn)簡(jiǎn)單分頁(yè)功能,數(shù)據(jù)庫(kù)使用的是sqlserver,本文通過(guò)通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友參考下吧
    2019-11-11
  • Windows Server 2012 R2 或 2016無(wú)法安裝.Net 3.5.1

    Windows Server 2012 R2 或 2016無(wú)法安裝.Net 3.5.1

    這篇文章主要為大家詳細(xì)介紹了Windows Server 2012 R2 或 2016 無(wú)法安裝 .Net 3.5.1,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • asp.net提取多層嵌套json數(shù)據(jù)的方法

    asp.net提取多層嵌套json數(shù)據(jù)的方法

    這篇文章主要介紹了asp.net提取多層嵌套json數(shù)據(jù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了asp.net解析json格式數(shù)據(jù)的步驟與相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • ASP.NET Core跨站登錄重定向的實(shí)現(xiàn)新姿勢(shì)

    ASP.NET Core跨站登錄重定向的實(shí)現(xiàn)新姿勢(shì)

    這篇文章主要給大家介紹了關(guān)于ASP.NET Core實(shí)現(xiàn)跨站登錄重定向的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • asp.net c#采集需要登錄頁(yè)面的實(shí)現(xiàn)原理及代碼

    asp.net c#采集需要登錄頁(yè)面的實(shí)現(xiàn)原理及代碼

    當(dāng)我們采集頁(yè)面的時(shí)候,如果被采集的網(wǎng)站需要登錄才能采集,原理搞清楚了,就好辦了,我們所要做的僅僅是在采集的時(shí)候(或者說(shuō)HttpWebRequest提交數(shù)據(jù)的時(shí)候),將Cookie信息放入Http請(qǐng)求頭里面就可以了,感興趣的朋友可以了解下,或許對(duì)你有所幫助
    2013-02-02
  • 有關(guān)于JSON的一些資料

    有關(guān)于JSON的一些資料

    有關(guān)于JSON的一些資料...
    2007-02-02

最新評(píng)論

凤凰县| 大同县| 凯里市| 云和县| 泾源县| 南靖县| 棋牌| 镇远县| 滦南县| 成武县| 镶黄旗| 岳普湖县| 毕节市| 朝阳区| 佛山市| 社旗县| 北碚区| 中江县| 景泰县| 华蓥市| 镇雄县| 山阴县| 东兴市| 金川县| 平利县| 潢川县| 百色市| 雅安市| 黄平县| 开远市| 克拉玛依市| 合阳县| 金秀| 永定县| 扎赉特旗| 南充市| 集安市| 广饶县| 醴陵市| 明水县| 尚志市|