Asp.net-Mvc

刷新 IdentityServer4 客戶端中的訪問令牌

  • October 31, 2017

我想知道如何使用混合流刷新 IdentityServer4 客戶端中的訪問令牌,它是使用 ASP.NET Core MVC 建構的。

如果我正確理解了整個概念,則客戶端首先需要具有“offline_access”範圍才能使用刷新令牌,這是啟用短期訪問令牌和撤銷刷新令牌的最佳實踐,以防止任何新的訪問令牌發給客戶。

我成功獲得了訪問令牌和刷新令牌,但是在 MVC 客戶端中訪問令牌的實際更新過程應該如何處理呢?

OpenId Connect (OIDC) 中間件可以自動處理嗎?或者我應該通過基本上檢查訪問令牌是否已過期或即將過期(即將到來的 30 秒)來檢查訪問令牌的過期時間,然後通過使用刷新令牌呼叫令牌端點來刷新訪問令牌?

是否建議在我的 Controller 操作方法中使用IdentityModel2TokenClient擴展方法RequestRefreshTokenAsync來呼叫令牌端點?

我已經看到在 OIDC 中間件事件中請求訪問令牌並使用響應儲存包含​​過期日期時間的聲明的程式碼。問題是我的 OIDC 已經以某種方式自動請求訪問令牌,因此在收到第一個訪問令牌後直接請求新的訪問令牌感覺不好。

沒有訪問令牌刷新邏輯的控制器操作方法範例:

public async Task<IActionResult> GetInvoices()
   {
       var token = await HttpContext.Authentication.GetTokenAsync("access_token");

       var client = new HttpClient();
       client.SetBearerToken(token);

       var response = await client.GetStringAsync("http://localhost:5001/api/getInvoices");
       ViewBag.Json = JArray.Parse(response).ToString();

       return View();
   }

OIDC 中間件不會為您處理這個問題。它在檢測到HTTP 401響應時被執行,然後將使用者重定向到 IdentityServer 登錄頁面。在重定向到您的 MVC 應用程序之後,它會將聲明轉換為 aClaimsIdentity並將其傳遞給 Cookies 中間件,該中間件會將其具體化為會話 cookie。

只要 cookie 仍然有效,其他所有請求都不會涉及 OIDC 中間件。

所以你必須自己處理這件事。您要考慮的另一件事是,每當您要刷新訪問令牌時,都必須更新現有的令牌,以免失去它。如果您不這樣做,會話 cookie 將始終包含相同的令牌 - 原始令牌 - 您每次都會刷新它。

我找到的一個解決方案是將其掛接到 Cookies 中間件中。這是一般流程:

  • 在每個請求上,使用 Cookies 中間件事件來檢查訪問令牌
  • 如果它接近到期時間,請請求一個新的
  • 替換新的訪問和刷新令牌ClaimsIdentity
  • 指示 Cookies 中間件更新會話 cookie,使其包含新令牌

我喜歡這種方法的是,在您的 MVC 程式碼中,您幾乎可以保證始終擁有有效的訪問令牌,除非引用令牌連續多次失敗。

我不喜歡的是它與 MVC 密切相關——更具體地說是 Cookies 中間件——所以它不是真正可移植的。

你可以看看我整理的這個 GitHub 儲存庫。它確實使用它IdentityModel,因為它可以處理所有事情並隱藏您必須對 IdentityServer 進行的 HTTP 呼叫的大部分複雜性。

引用自:https://stackoverflow.com/questions/41168304