MSAL.NET 사용하여 토큰 캐시에서 토큰 가져오기

.NET(MSAL.NET)에 대한 Microsoft 인증 라이브러리 사용하여 액세스 토큰을 획득하면 토큰이 캐시됩니다. 애플리케이션에 토큰이 필요한 경우 먼저 캐시에서 가져오려고 시도해야 합니다.

AuthenticationResult.AuthenticationResultMetadata.TokenSource 속성을 검사하여 토큰의 출처를 모니터링할 수 있습니다.

웹 사이트 및 웹 API

ASP.NET Core 및 ASP.NET 클래식 웹 사이트는 MSAL.NET용 래퍼인 Microsoft.Identity.Web과 통합해야 합니다. 토큰 캐시 serialization에 설명된 대로 메모리 토큰 캐싱 또는 분산 토큰 캐싱을 구성할 수 있습니다.

ASP.NET Core의 Web API는 Microsoft.Identity.Web를 사용해야 합니다. ASP.NET 클래식의 Web API는 MSAL을 직접 호출 AcquireTokenOnBehalfOf 하여 사용하고 메모리 또는 분산 캐싱을 구성해야 합니다. 자세한 내용은 MSAL.NET의 토큰 캐시 직렬화를 참조하세요. 캐시를 지울 API가 없기 때문에 API를 호출 AcquireTokenSilent 할 이유가 없습니다. 캐시 크기는 MemoryCache, Redis 등과 같은 기본 캐시 저장소에서 제거 정책을 설정하여 관리할 수 있습니다.

웹 서비스/디먼 앱

호출 AcquireTokenForClient 을 통해 사용자 없이 앱 ID에 대한 토큰을 요청하는 애플리케이션은 MSAL의 내부 캐싱을 사용하거나, 자체 메모리 토큰 캐싱 또는 분산 토큰 캐싱을 정의할 수 있습니다. 지침 및 자세한 내용은 MSAL.NET 토큰 캐시 serialization을 참조하세요.

관련된 사용자가 없으므로 호출 AcquireTokenSilent할 이유가 없습니다. AcquireTokenForClient 캐시를 지울 API가 없으면 캐시를 자체적으로 볼 수 있습니다. 캐시 크기는 토큰에 필요한 테넌트 및 리소스 수에 비례합니다. 캐시 크기는 MemoryCache, Redis 등과 같은 기본 캐시 저장소에서 제거 정책을 설정하여 관리할 수 있습니다.

데스크톱, 명령줄 및 모바일 애플리케이션

데스크톱, 명령줄 및 모바일 애플리케이션은 먼저 메서드를 AcquireTokenSilent 호출하여 허용되는 토큰이 캐시에 있는지 확인해야 합니다. 대부분의 경우 캐시의 토큰을 기반으로 범위가 더 많은 다른 토큰을 획득할 수 있습니다. 토큰 캐시에 새로 고침 토큰도 포함되어 있으므로 만료가 가까워지면 토큰을 새로 고칠 수도 있습니다.

사용자 상호 작용이 필요한 인증 흐름의 경우 MSAL은 액세스, 새로 고침 및 ID 토큰과 IAccount 단일 계정에 대한 정보를 나타내는 개체를 캐시합니다. IAccount에 대해 자세히 알아봅니다. 클라이언트 자격 증명과 같은 애플리케이션 흐름의 경우 개체 및 ID 토큰에 사용자가 필요하고 새로 고침 토큰을 적용할 수 없으므로 액세스 토큰만 캐시 IAccount 됩니다.

권장되는 방식은 먼저 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
}

캐시 지우기

공용 클라이언트 애플리케이션에서 캐시에서 계정을 제거하면 삭제됩니다. 그러나 브라우저에 있는 세션 쿠키는 제거되지 않습니다.

var accounts = (await app.GetAccountsAsync()).ToList();

// clear the cache
while (accounts.Any())
{
   await app.RemoveAsync(accounts.First());
   accounts = (await app.GetAccountsAsync()).ToList();
}