ASP.NET Identity 2 手動檢查 Token 有效性

之前筆記 改 ASP.NET Identity 2 的 Token 時效 紀錄到可以調整 ASP.NET Identity 產生出 Token 的有效時間,而其中也提到可以參考 ForgotPassword 的寫法 (Forgotpasswrod –> 產生含有 token 的 reset password 連結 –> 使用 link 來 reset password)

整體功能是沒有問題的,只是使用體驗個人覺得稍嫌不足:link 包含 token,卻不是在開啟連結時就驗證 token 有效性,而是在填完相關資料才驗證,個人覺得既然 token 無效何必讓 user 多花那個時間填完資料才告訴 user token 無效,所以就來看可以如何調整吧

原始流程

  1. 填完資料

    1inputdata

  2. 送出後才驗證 Token 正確性

    2submitverify

改善後流程

避免 Token 無效仍讓 user 浪費時間填寫資料

  1. 填寫資料前先驗證 Token

    3verifytokenbeforeinput

  2. 初次開啟連結時 Token 仍有效

    4tokenok

  3. 輸入完成送出後才失效

    5invalidtoken

修改方式

  1. 開啟 Controllers –> AccountController.cs

    6accountcontroller

  2. 修改 ResetPassword 方法

    • 修改前

      [AllowAnonymous]
      public ActionResult ResetPassword(string code)
      {
          return code == null ? View("Error") : View();
      }
      

      7beforechange

    • 將 userid 也加入接放參數

      public ActionResult ResetPassword(string code, string userId)
      
    • 使用 UserManager.VerifyUserToken 驗證 Token 有效性

      UserManager.VerifyUserToken(userId, "ResetPassword", code)
      
    • Token 無效導向自訂頁面(非必要,但可以讓訊息更容易理解)

      return View("InvalidToken");
      
  3. 完整程式碼

    [AllowAnonymous]
    public ActionResult ResetPassword(string code, string userId)
    {
        if (code == null || !UserManager.VerifyUserToken(userId, "ResetPassword", code))
        {
            return View("InvalidToken");
        }
        return View();
    }
    

    8afterchange

心得

這個需求並不是 user 提出的,而是開發階段我自己測試時覺得使用者體驗不佳,決定自行加上的,站在 user 的角色:我相信沒有人想要填完一堆內容後再告訴我驗證失敗,如果 token 過期是發生在我填寫資料的過程也就算了,但經過修改後至少可以避免掉 token 早就過期還讓 user 填資料的情境

參考資訊

  1. 改 ASP.NET Identity 2 的 Token 時效