MSAL.NET を使用してトークン キャッシュからトークンを取得する

.NET (MSAL.NET) のMicrosoft Authentication Libraryを使用してアクセス トークンを取得すると、トークンがキャッシュされます。 アプリケーションがトークンを必要とする場合は、最初にキャッシュからトークンをフェッチする必要があります。

AuthenticationResult.AuthenticationResultMetadata.TokenSource プロパティを調べることで、トークンのソースを監視できます。

Web サイトと Web API

ASP.NET Core と ASP.NET Classic の Web サイトは、MSAL.NET のラッパーである Microsoft.Identity.Web と統合する必要があります。 メモリ トークン キャッシュまたは分散トークン キャッシュは、 トークン キャッシュのシリアル化の説明に従って構成できます。

ASP.NET Core 上の Web API では、Microsoft.Identity.Web を使用する必要があります。 ASP.NET クラシック上の Web API は、AcquireTokenOnBehalfOfを呼び出して MSAL を直接使用し、メモリまたは分散キャッシュを構成する必要があります。 詳細については、「MSAL.NET でのトークン キャッシュのシリアル化」を参照してください。 キャッシュをクリアする API がないため、 AcquireTokenSilent API を呼び出す理由はありません。 キャッシュ サイズは、MemoryCache、Redis などの基になるキャッシュ ストアに削除ポリシーを設定することで管理できます。

Web サービス/デーモン アプリ

ユーザーが関係しないアプリ ID のトークンを要求するアプリケーションは、 AcquireTokenForClient を呼び出すことによって、MSAL の内部キャッシュに依存し、独自のメモリ トークン キャッシュまたは分散トークン キャッシュを定義できます。 手順と詳細については、「MSAL.NET でのトークン キャッシュのシリアル化」を参照してください。

ユーザーが関与していないため、 AcquireTokenSilentを呼び出す理由はありません。 AcquireTokenForClient キャッシュをクリアする API がないため、キャッシュを単独で検索します。 キャッシュ サイズは、トークンが必要なテナントとリソースの数に比例します。 キャッシュ サイズは、MemoryCache、Redis などの基になるキャッシュ ストアに削除ポリシーを設定することで管理できます。

デスクトップ、コマンド ライン、モバイル アプリケーション

デスクトップ、コマンド ライン、モバイル アプリケーションでは、最初に AcquireTokenSilent メソッドを呼び出して、受け入れ可能なトークンがキャッシュ内にあるかどうかを確認する必要があります。 多くの場合、キャッシュ内のトークンに基づいて、より多くのスコープを持つ別のトークンを取得できます。 有効期限が近づいているときにトークンを更新することもできます (トークン キャッシュにも更新トークンが含まれるため)。

ユーザー操作を必要とする認証フローの場合、MSAL はアクセス トークン、更新トークン、ID トークン、および 1 つのアカウントに関する情報を表す 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();
}