當你使用 Microsoft 驗證資源庫 for .NET(MSAL.NET)取得存取權杖時,該權杖會被快取保存。 當應用程式需要標記時,應先嘗試從快取中擷取該標記。
你可以透過檢查 AuthenticationResult.AuthenticationResultMetadata.TokenSource 物業來監控這些代幣的來源。
網站與網頁 API
ASP.NET Core 和 ASP.NET Classic 網站應與 Microsoft.Identity.Web 整合,這是 MSAL.NET 的包裝程式。 記憶體令牌快取或分散式令牌快取可以依照 令牌快取序列化的描述來配置。
ASP.NET Core 上的網頁 API 應該使用 Microsoft。Identity.Web。 ASP.NET 經典版的網頁 API 直接使用 MSAL,透過呼叫AcquireTokenOnBehalfOf方式進行,並應配置記憶體或分散快取。 如需詳細資訊,請參閱 MSAL.NET 中的權杖快取序列化。 沒有理由呼叫 AcquireTokenSilent API,因為沒有 API 可以清除快取。 快取大小可透過在底層快取儲存體(例如 MemoryCache、Redis 等)上設定淘汰原則來管理。
Web 服務 / 守護程序應用程式
若應用程式在沒有使用者參與的情況下,透過呼叫 AcquireTokenForClient 請求 App 身份的標記,可以依賴 MSAL 的內部快取、自行定義記憶體標記快取或分散式標記快取。 關於指令與更多資訊,請參閱 MSAL.NET 中的標記快取序列化。
既然沒有使用者參與,就沒有理由呼叫 AcquireTokenSilent。
AcquireTokenForClient 我會自己去快取裡找,因為沒有 API 可以清除快取。 快取大小與你需要的租戶數量和資源成正比。 快取大小可以透過在底層快取儲存體(如 MemoryCache、Redis 等)上設定淘汰原則來管理。
桌面、命令列與行動應用程式
桌面、命令列及行動應用程式應先呼叫該 AcquireTokenSilent 方法以驗證快取中是否有可接受的令牌。 在許多情況下,可以根據快取中的某個權杖,取得另一個具有更多權限範圍的權杖。 也可以在快到期時刷新一個代幣(因為代幣快取中也有刷新代幣)。
對於需要使用者互動的認證流程,MSAL 會快取存取權、刷新權杖、ID 權杖,以及代表單一帳號資訊的物件。IAccount 了解更多關於 IAccount的資訊。 對於應用程式流程,例如 用戶端憑證,只有存取權杖會被快取,因為 IAccount 物件和 ID 權杖需要使用者,而刷新權杖不適用。
建議的做法是先呼叫 AcquireTokenSilent 方法。 如果 AcquireTokenSilent 失敗,則用其他方法取得代幣。
以下範例中,應用程式首先嘗試從令牌快取中取得一個令牌。 若 MsalUiRequiredException 拋出例外,應用程式會以互動方式取得一個憑證。
var accounts = await app.GetAccountsAsync();
AuthenticationResult result = null;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException ex)
{
// A MsalUiRequiredException happened on AcquireTokenSilent.
// This indicates you need to call AcquireTokenInteractive to acquire a token
Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");
try
{
result = await app.AcquireTokenInteractive(scopes)
.ExecuteAsync();
}
catch (MsalException msalex)
{
ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
}
}
catch (Exception ex)
{
ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
return;
}
if (result != null)
{
string accessToken = result.AccessToken;
// Use the token
}
清除快取
在公用用戶端應用程式中,將帳戶從快取中移除將會清除快取。 不過,這並不會移除瀏覽器裡的會話 Cookie。
var accounts = (await app.GetAccountsAsync()).ToList();
// clear the cache
while (accounts.Any())
{
await app.RemoveAsync(accounts.First());
accounts = (await app.GetAccountsAsync()).ToList();
}