簡體   English   中英

當我已經將用戶的刷新令牌存儲在數據庫中時,使用 Microsoft.Graph SDK 的最佳方式是什么?

[英]Best way to use Microsoft.Graph SDK when I already have users' refresh tokens stored in database?

我正在構建一個多用戶、多租戶應用程序,它將在離線時代表許多用戶訪問 Microsoft Graph API。

因為該應用程序使用 Microsoft Identity 進行外部 OIDC 身份驗證,所以在用戶首次登錄期間,我已經請求了適當的范圍/同意,並收到了 Microsoft 頒發的訪問/刷新令牌。 令牌保存在數據庫中。

現在我想使用Microsoft.Graph這使得訪問 Graph API 變得更加容易,但似乎這個 SDK 的很大一部分是為了檢索令牌而編寫的,我不需要它,因為我已經有了令牌。

但是,我確實希望 SDK 客戶端自動使用存儲的刷新令牌來獲取新的訪問令牌,而不必自己手動處理刷新邏輯,如果可能的話。

經過研究,我發現我可以在構造GraphServiceClient時為AuthenticationProvider傳入一個null ,然后手動將承載令牌附加到客戶端,如下所示:

var graphClient = new GraphServiceClient(authenticationProvider: null);

var requestHeaders = new List<HeaderOption>() 
                  { new HeaderOption("Authorization", "Bearer " + myToken) };

var me = await graphClient.Me.Request(requestHeaders).GetAsync();

這確實有效並繞過了客戶端的令牌檢索邏輯,但現在的問題是它不會處理訪問令牌到期/更新。 因此,我必須使用單獨的代碼來確保始終傳遞未過期的訪問令牌,並在必要時使用刷新令牌自己更新令牌。

我想知道是否有一種方法可以自定義GraphServiceClient ,這樣它就不會嘗試使用單獨的 OAuth2/OIDC 流來獲取令牌,而是知道如何找到存儲在我的數據庫中的現有刷新令牌,並使用該刷新令牌來管理它更新/到期邏輯,就像它通過常規流程接收的令牌一樣。

理想的流程是這樣的:

  1. 傳入一個參數(我的數據庫中的用戶 ID)來創建一個GraphServiceClient

  2. 客戶端使用此用戶 ID 在我的數據庫 (EF Core) 中查找存儲的令牌。

  3. 如果存儲的訪問令牌已過期,請使用存儲的刷新令牌獲取新令牌,並更新數據庫中的令牌。

SDK 可以做到這一點嗎?

您的建議將不勝感激。

您可以在自己的自定義 class 中實現IAuthenticationProvider接口,然后在AuthenticateRequestAsync function 中進行必要的令牌檢查/刷新。 有關示例,請參閱https://github.com/microsoftgraph/msgraph-training-dotnet-core/blob/main/demo/GraphTutorial/Authentication/DeviceCodeAuthProvider.cs

我建議查看MSAL 庫來為您處理所有令牌邏輯。 您可以掛鈎到它的令牌緩存以按照您的意願對其進行序列化(例如,將其存儲在數據庫中)。 在我鏈接的示例中,我使用的是 MSAL,您可以看到我不必對過期令牌進行任何檢查,這一切都已為我處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM