.net core使用jwt自動續期

来源:https://www.cnblogs.com/MrHanBlog/archive/2019/10/24/11732145.html
-Advertisement-
Play Games

小弟不C才,最近看了下網上的jwt方案,於是自己寫了一個簡單的jwt方案和大家分享下,希望大家給點意見! 假如有一個讀書網站,可以不用登陸就訪問,當需要自己寫文章的時候就必須登錄,並且登錄之後如果一段時間內沒有訪問,則過期了需要重新登錄。有效期內有登錄則自動續期,所以我想使用中間件來負責token的 ...


           小弟不C才,最近看了下網上的jwt方案,於是自己寫了一個簡單的jwt方案和大家分享下,希望大家給點意見!

           假如有一個讀書網站,可以不用登陸就訪問,當需要自己寫文章的時候就必須登錄,並且登錄之後如果一段時間內沒有訪問,則過期了需要重新登錄。有效期內有登錄則自動續期,所以我想使用中間件來負責token的更新以及刪除。如下部分代碼:

     

      public async Task InvokeAsync(HttpContext context)
        {
            try
            {
                bool isExpires = context.Request.Headers.TryGetValue("isExpires", out StringValues expires);
                bool IsAuthorized = context.Request.Headers.TryGetValue("Authorization", out StringValues authStr);
                string token = authStr.ToString().Substring("Bearer ".Length).Trim();
                //每次訪問都更新token有效期
                new JWT(_cacheClient).RefreshToken(token, isExpires);
                context.Response.Headers.Add("refreshTokne", token);
            }
            catch (ValidationException)
            {
                if (context.Request.Path.Value.Contains("api/auth/islogin"))
                {
                    context.Response.ContentType = "text/plain";
                    await context.Response.WriteAsync("not login");
                }
            }
              await _next(context);
        }

        /// <summary>
        /// 生成jwtToken,有效期30分鐘
        /// </summary>
        /// <param name="claims"></param>
        /// <returns></returns>
        public static string CreateToken(IEnumerable<Claim> claims)
        {
            var key = new SymmetricSecurityKey(System.Text.Encoding.UTF8.GetBytes(SecurityKey));
            var expires = DateTime.Now.AddMinutes(30);
            var token = new JwtSecurityToken(
                        issuer: issuer,
                        audience: audience,
                        claims: claims,
                        notBefore: DateTime.Now,
                        expires: expires,
                        signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256Signature));
            string jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return jwtToken;
        }
        /// <summary>
        /// 更新token,先通過前端傳過來的token從redis里取出jwt,如果為null,則表 
        ///示過期或未登錄,如果jwt過期,則更新jwt,並且通過中間件把新的token放到響應頭裡返回前端。
        /// </summary>
        /// <param name="token">token</param>
        /// <param name="isExpires">是否失效</param>
        public  void RefreshToken(string token,bool isExpires=false)
        {

            TokenModel tokenMode = _cacheClient.Get<TokenModel>(token);
            if (tokenMode == null)
                throw new ValidationException("expires");
            JwtSecurityToken jwtSecurityToken= new JwtSecurityTokenHandler().ReadJwtToken(token);
            if(isExpires)
                token = CreateToken(jwtSecurityToken.Claims);
            tokenMode.ExpireTime = tokenMode.ExpireTime.AddDays(7);
            if(tokenMode.ExpireTime.Day-DateTime.Now.Day==1)//實現最後一天如果訪問了就自動續期
                _cacheClient.Set(token, tokenMode, TimeSpan.FromDays(7));

        }

  然後前端可以根據響應結果來判斷是否跳到登錄頁。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在開發過程中發現.在SaveChanges的時候偶爾會拋出異常:Cannot access a disposed object. A common cause of this error is disposing a context that was resolved from dependen ...
  • 一、背景: 因編程的基礎差,因此最近開始鞏固學習C#基礎,後期把自己學習的東西,總結相應文章中,有不足處請大家多多指教。 二、簡介 C#提供以下類型的判斷語句: if語句 if-else語句 if else-if語句 cash-swith語句 本文章將逐一講解if、if-else、if else-i ...
  • 1.StackPanel:堆棧面板,通過Orientation屬性設置子元素的佈局排列方向為“Vertical”(垂直)和“Horizontal”(水平),不寫其預設值為“Vertical”,當設置為“Vertical”時子元素會沿垂直方向拉伸,反之設置為“Horizontal”時子元素會沿水平方向 ...
  • 場景 Winform控制項-DevExpress18下載安裝註冊以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100061243 參照以上將DevExpress安裝並引進到工具箱。 在進行頁面設計時通常會使用分隔 ...
  • 釘釘掃碼登錄網站(兩種方式實現) 效果: 源代碼地址:https://github.com/jellydong/DingQrCodeLogin 動手敲代碼! 第一步,釘釘後臺配置 參考鏈接: "獲取appId及appSecret" . 點擊進入釘釘開發者平臺 的頁面,點擊左側菜單的【移動接入應用 登 ...
  • 分散式事務在.net中的使用,以及相應的其他解決方案。為了實現分散式事務的效果,大概有三種方式:微軟提供的分散式事務、消息隊列、非同步作業 ...
  • var begin_daily = from a in _postgreDbContext.tab1 join b in _postgreDbContext.tab2 on a.id equals b.merchant_id into a_left ... ...
  • 場景 在新建一個Winform窗體後,拖拽控制項設置其佈局如下 如果只是單純的這麼設計,我們在運行後,如果對視窗進行縮放就會導致如下 所以我們需要在設計頁面佈局時對控制項進行定位設置。 註: 博客主頁:https://blog.csdn.net/badao_liumang_qizhi關註公眾號霸道的程式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...