C#WebApi Session存儲驗證碼過程中發現的問題


C#WebApi Session存儲驗證碼過程中發現的問題

webapi開發的過程中,領導要求驗證碼需要后台實現然后網頁前端和app展示。無奈只能硬着頭皮上。大概過程就是后台自動生成一個4位或者多位隨機字符串,存入HttpContext.Current.Session中,然后前端網頁或者app登陸時傳給后端,后端通過對比HttpContext.Current.Session與傳過來的值來對比驗證碼是否正確,傳給網頁前端或app,然后由前端或app控制展現的格式。在實現的過程中。網頁沒有發現問題,但是app卻出現一個令人頭疼的問題。每次app請求驗證碼之后,HttpContext.Current.Session.SessionID的值都會變更,這是我不想看到的。因為SessionId的值一旦改變,Session中的驗證碼就會丟失。進過多次聯調,終於發現了其中的問題。下面是我個人的理解:每次網頁前端或者app請求接口的時候,后端都會檢查SessionID是否為空,如果為空,就會默認生成一個SessionID,然后返回Response的時候,會默認把sessionID的值存到一個cookie中並且返回請求方,這個默認生成的cookie的過期時間是返回時間之后的20分鍾,但是在我的實現中,cookie的過期時間總會比現在的北京時間晚8個小時,也就是UTC時間,因為網頁前端並沒有判斷cookie 的邏輯,所以網頁前端請求驗證碼的時候,並不會出現什么問題,但是app請求的時候會判斷cookie的過期時間,所以每次請求過后,cookie都是過期 的,所以每次請求都是新的SessionID,這就需要后端返回的時候,不使用自動生成的cookie,返回Response之前,生成自己的cookie,並且把SessionID存進去,並且把Cookie過期時間設置成正確的時間。實現思路大概就是這樣,說的不好或者不清楚的還望大佬們多多包涵,有想法的可以多多交流,下面附上代碼:

實現驗證生成及存儲的代碼:

 [HttpGet]
       public IHttpActionResult GetVerificationCode(int length=4)
      {
           if (CodeCreater.CreateCode(length,out string code))
          {
               HttpContext.Current.Session.Add("VerificationCode", code);
               
               HttpCookie sessionCookie = new HttpCookie("ASP.NET_SessionId")
              {
                   Value = HttpContext.Current.Session.SessionID,
                   Expires = DateTime.Now.AddHours(8).AddMinutes(30)
              };
               HttpContext.Current.Response.Cookies.Add(sessionCookie);

               return Json(new { result = true, data = code });
          }
           else
          {
               return Json(new { result = false, msg = "出現錯誤" });
          }
      }

檢驗驗證碼是否正確的代碼:

 if (userModel.VerificationCode == null)
              {
                   return Json(new { result = false, msg = "驗證碼不能為空" });
              }
               var test = HttpContext.Current.Session["VerificationCode"].ToString();
               if (userModel.VerificationCode.ToUpper() != HttpContext.Current.Session["VerificationCode"].ToString().ToUpper())
              {
                   return Json(new { result = false, msg = "驗證碼不正確" });
              }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM