激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - 實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

2022-01-07 22:08JeffckyShareJeffcky ASP.NET教程

MaxAge控制著cookie的生命周期,若cookie過期,瀏覽器將會自動清除,如果沒有設置該值,實質上它的生命周期就是ExpireTimeSpan,那么它到底有何意義呢?

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

首先我們實現Cookie認證,然后再次引入JWT,最后在結合二者使用時聯系其他我們可能需要注意的事項

Cookie認證

在startup中我們添加cookie認證服務,如下:

  1. services.AddAuthentication(options => 
  2.     options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
  3.     options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme; 
  4. }) 
  5. .AddCookie(options => 
  6.     options.ExpireTimeSpan = TimeSpan.FromMinutes(1); 
  7.     options.Cookie.Name = "user-session"
  8.     options.SlidingExpiration = true
  9. }); 

接下來則是使用認證和授權中間件,注意將其置于路由和終結點終結點之間,否則啟動也會有明確異常提示

  1. app.UseRouting(); 
  2.  
  3. app.UseAuthentication(); 
  4.  
  5. app.UseAuthorization(); 
  6.  
  7. app.UseEndpoints(endpoints => 
  8.   ...... 
  9. }); 

我們給出測試視圖頁,并要求認證即控制器添加特性

  1. [Authorize] 
  2. public class HomeController : Controller 
  3.     public IActionResult Index() 
  4.     { 
  5.         return View(); 
  6.     } 

當進入首頁,未認證默認進入account/login,那么接下來創建該視圖

  1. public class AccountController : Controller 
  2.     [AllowAnonymous] 
  3.     public IActionResult Login() 
  4.     { 
  5.       return View(); 
  6.     } 
  7.     ...... 

我們啟動程序先看看效果

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

如上圖,自動跳轉至登錄頁,此時我們點擊模擬登錄按鈕,發起請求去模擬登錄(發起ajax請求代碼就占不用篇幅給出了)

  1. /// <summary> 
  2. /// 模擬登錄 
  3. /// </summary> 
  4. /// <returns></returns
  5. [HttpPost] 
  6. [AllowAnonymous] 
  7. public async Task<IActionResult> TestLogin() 
  8.     var claims = new Claim[] 
  9.     { 
  10.       new Claim(ClaimTypes.Name"Jeffcky"), 
  11.     }; 
  12.  
  13.     var claimsIdentity = new ClaimsIdentity(claims, "Login"); 
  14.  
  15.     await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity)); 
  16.  
  17.     return Ok(); 

上述無非就是構建身份以及該身份下所具有的身份屬性,類似個人身份證唯一標識個人,身份證上各個信息即表示如上聲明

同時呢,肯定要調用上下文去登錄,在整個會話未過期之前,根據認證方案獲取對應處理方式,最后將相關信息進行存儲等等,有興趣的童鞋可以去了解其實現細節哈

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

當我們請求過后,再次訪問首頁,將看到生成當前會話信息,同時我們將會話過期設置為1分鐘,在1分鐘內未進行會話,將自動重定向至登錄頁

注意如上標注并沒有值,那么這個值可以設置嗎?當然可以,在開始配置時我們并未給出,那么這個屬性又代表什么含義呢?

  1. options.Cookie.MaxAge = TimeSpan.FromMinutes(2); 

那么結合ExpireTimeSpan和MaxAge使用,到底代表什么意思呢?我們暫且撇開滑動過期設置

ExpireTimeSpan表示用戶身份認證票據的生命周期,它是認證cookie的有效負載,存儲的cookie值是一段加密字符串,在每次請求時,web應用程序都會根據請求對其進行解密

MaxAge控制著cookie的生命周期,若cookie過期,瀏覽器將會自動清除,如果沒有設置該值,實質上它的生命周期就是ExpireTimeSpan,那么它到底有何意義呢?

上述我們設置票據的生命周期為1分鐘,同時我們控制cookie的生命周期為2分鐘,若在2分鐘內關閉瀏覽器或重啟web應用程序,此時cookie生命周期并未過期,所以仍將處于會話狀態即無需登錄,若未設置MaxAge,關閉瀏覽器或重啟后將自動清除其值即需登錄,當然一切前提是未手動清除瀏覽器cookie

問題又來了,在配置cookie選項中,還有一個也可以設置過期的屬性

  1. options.Cookie.Expiration = TimeSpan.FromMinutes(3); 

當配置ExpireTimeSpan或同時配置MaxAge時,無需設置Expiration,因為會拋出異常

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

JWT認證

上述已經實現Cookie認證,那么在與第三方進行對接時,我們要使用JWT認證,我們又該如何處理呢?

首先我們添加JWT認證服務

  1. .AddJwtBearer(options => 
  2.     options.TokenValidationParameters = new TokenValidationParameters 
  3.     { 
  4.       ValidateIssuerSigningKey = true
  5.       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456")), 
  6.       ValidateIssuer = true
  7.       ValidIssuer = "http://localhost:5000"
  8.       ValidateAudience = true
  9.       ValidAudience = "http://localhost:5001"
  10.       ValidateLifetime = true
  11.       ClockSkew = TimeSpan.FromMinutes(5) 
  12.     }; 
  13. }); 

將JWT Token置于cookie中,此前文章已有講解,這里我們直接給出代碼,先生成Token

  1. private string GenerateToken(Claim[] claims) 
  2.     var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("1234567890123456")); 
  3.  
  4.     var token = new JwtSecurityToken( 
  5.       issuer: "http://localhost:5000"
  6.       audience: "http://localhost:5001"
  7.       claims: claims, 
  8.       notBefore: DateTime.Now, 
  9.       expires: DateTime.Now.AddMinutes(5), 
  10.       signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) 
  11.     ); 
  12.  
  13.     return new JwtSecurityTokenHandler().WriteToken(token); 

在登錄方法中,將其寫入響應cookie中,如下這般

  1. /// <summary> 
  2. /// 模擬登錄 
  3. /// </summary> 
  4. /// <returns></returns
  5. [HttpPost] 
  6. [AllowAnonymous] 
  7. public async Task<IActionResult> TestLogin() 
  8.     var claims = new Claim[] 
  9.     { 
  10.       new Claim(ClaimTypes.Name"Jeffcky"), 
  11.     }; 
  12.  
  13.     var claimsIdentity = new ClaimsIdentity(claims, "Login"); 
  14.  
  15.     Response.Cookies.Append("x-access-token", GenerateToken(claims), 
  16.       new CookieOptions() 
  17.       { 
  18.         Path = "/"
  19.         HttpOnly = true 
  20.       }); 
  21.  
  22.     await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity)); 
  23.  
  24.  return Ok(); 

去取Bearer Token值,若成功取到這賦值給如下context.Token,所以此時我們需要手動從cookie中取出token并賦值

  1. options.Events = new JwtBearerEvents 
  2.     OnMessageReceived = context => 
  3.     { 
  4.         var accessToken = context.Request.Cookies["x-access-token"]; 
  5.  
  6.         if (!string.IsNullOrEmpty(accessToken)) 
  7.         { 
  8.             context.Token = accessToken; 
  9.         } 
  10.  
  11.         return Task.CompletedTask; 
  12.     } 
  13. }; 

一切已就緒,接下來我們寫個api接口測試驗證看看

  1. [Authorize("Bearer")] 
  2. [Route("api/[controller]/[action]")] 
  3. [ApiController] 
  4. public class JwtController : ControllerBase 
  5.     [HttpGet] 
  6.     public IActionResult Test() 
  7.     { 
  8.       return Ok("test jwt"); 
  9.     } 

思考一下,我們通過Postman模擬測試,會返回401嗎?結果會是怎樣的呢?

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

問題不大,主要在于該特性參數為聲明指定策略,但我們需要指定認證方案即scheme,修改成如下:

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

如此在與第三方對接時,請求返回token,后續將token置于請求頭中即可驗證通過,同時上述取cookie中token并手動賦值,對于對接第三方則是多余,不過是為了諸多其他原因而已

  1. [Authorize(AuthenticationSchemes = "Bearer,Cookies")] 

注意混合認證方案設置存在順序,后者將覆蓋前者即如上設置,此時將走cookie認證

實踐剖析.NET Core 如何支持 Cookie 滑動過期和 JWT 混合認證、授權

滑動過期思考擴展

若我們實現基于Cookie滑動過期,同時使用signalr進行數據推送,勢必存在問題,因為會一直刷新會話,那么將導致會話永不過期問題,從安全層面角度考慮,我們該如何處理呢?

我們知道票據生命周期存儲在上下文AuthenticationProperties屬性中,所以在配置Cookie選項事件中我們可以進行自定義處理

  1. public class CookieAuthenticationEventsExetensions : CookieAuthenticationEvents 
  2.     private const string TicketIssuedTicks = nameof(TicketIssuedTicks); 
  3.  
  4.     public override async Task SigningIn(CookieSigningInContext context) 
  5.     { 
  6.         context.Properties.SetString( 
  7.           TicketIssuedTicks, 
  8.           DateTimeOffset.UtcNow.Ticks.ToString()); 
  9.  
  10.         await base.SigningIn(context); 
  11.     } 
  12.  
  13.     public override async Task ValidatePrincipal( 
  14.       CookieValidatePrincipalContext context) 
  15.     { 
  16.         var ticketIssuedTicksValue = context 
  17.           .Properties.GetString(TicketIssuedTicks); 
  18.  
  19.         if (ticketIssuedTicksValue is null || 
  20.           !long.TryParse(ticketIssuedTicksValue, out var ticketIssuedTicks)) 
  21.         { 
  22.           await RejectPrincipalAsync(context); 
  23.           return
  24.         } 
  25.  
  26.         var ticketIssuedUtc = 
  27.           new DateTimeOffset(ticketIssuedTicks, TimeSpan.FromHours(0)); 
  28.  
  29.         if (DateTimeOffset.UtcNow - ticketIssuedUtc > TimeSpan.FromDays(3)) 
  30.         { 
  31.           await RejectPrincipalAsync(context); 
  32.           return
  33.         } 
  34.  
  35.         await base.ValidatePrincipal(context); 
  36.     } 
  37.  
  38.     private static async Task RejectPrincipalAsync( 
  39.       CookieValidatePrincipalContext context) 
  40.     { 
  41.         context.RejectPrincipal(); 
  42.         await context.HttpContext.SignOutAsync(); 
  43.     } 

在添加Cookie服務時,有對應事件選項,使用如下

  1. options.EventsType = typeof(CookieAuthenticationEventsExetensions); 

擴展事件實現表示在第一次會話到當前時間截止超過3天,則自動重定向至登錄頁,最后將上述擴展事件進行注冊即可

原文鏈接:https://mp.weixin.qq.com/s/zff_H_7eG0EaV7dP5xoMhg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色黄网站在线观看 | 久久精品亚洲精品国产欧美kt∨ | 88xx成人永久免费观看 | 免费看性xxx高清视频自由 | 国产一级毛片高清 | 欧洲精品久久久 | 日韩在线播放第一页 | 日本久久综合网 | 一级黄色性感片 | 欧美日韩电影 | 亚洲射情| 国产99精品视频 | 羞羞的小视频 | 九九热视频免费观看 | 亚洲成人午夜精品 | 91香蕉影视 | 精品国产96亚洲一区二区三区 | 欧美激情第一区 | 国产精品成人一区二区三区电影毛片 | 学霸趴下被打肿光屁股小说 | 日日狠狠久久偷偷四色综合免费 | 国产一区二区三区在线观看视频 | 久久久麻豆 | 三级xxxx | japanese末成年free| 久草在线小说 | 国产一区二区视频在线播放 | 欧美一区二区三区四区电影 | 亚洲视频精选 | 精品国产一区二区三区四区阿崩 | 欧美女孩videos | 黄色大片免费网站 | 日韩在线观看电影 | 91九色视频在线播放 | 成人性视频欧美一区二区三区 | 精品中文字幕久久久久四十五十骆 | 精品国产一区二区三区天美传媒 | 爽妇网国产精品 | 亚洲极色| 麻豆91精品91久久久 | 亚洲视频高清 |