Obter um token do cache de tokens usando o MSAL.NET

Quando você adquire um token de acesso usando o Biblioteca do Microsoft Authenticator para .NET (MSAL.NET), o token é armazenado em cache. Quando o aplicativo precisa de um token, ele deve primeiro tentar buscá-lo do cache.

Você pode monitorar a origem dos tokens inspecionando a AuthenticationResult.AuthenticationResultMetadata.TokenSource propriedade.

Sites e APIs Web

os sites ASP.NET Core e ASP.NET Clássico devem se integrar ao Microsoft. Identity.Web, um wrapper para MSAL.NET. O cache de token de memória ou o cache de token distribuído podem ser configurados conforme descrito na serialização do cache de token.

As APIs Web no ASP.NET Core devem usar Microsoft. Identity.Web. As APIs Web no ASP.NET clássico usam a MSAL diretamente chamando AcquireTokenOnBehalfOf e devem configurar a memória ou o cache distribuído. Para obter mais informações, confira Serialização do cache de token no MSAL.NET. Não há razão para chamar a AcquireTokenSilent API, pois não há nenhuma API para limpar o cache. O tamanho do cache pode ser gerenciado definindo políticas de remoção no repositório de cache subjacente, como MemoryCache, Redis etc.

Aplicativos de serviço Web/Daemon

Aplicativos que solicitam tokens para uma identidade de aplicativo, sem nenhum usuário envolvido, com uma chamada a AcquireTokenForClient, podem depender do cache interno da MSAL, definir um cache de token de memória próprio ou definir um cache de token distribuído próprio. Para obter instruções e mais informações, consulte a serialização de cache de token em MSAL.NET.

Como nenhum usuário está envolvido, não há razão para chamar AcquireTokenSilent. AcquireTokenForClient examinará o cache por conta própria, pois não há nenhuma API para limpar o cache. O tamanho do cache é proporcional com o número de locatários e recursos para os quais você precisa de tokens. O tamanho do cache pode ser gerenciado definindo políticas de remoção no repositório de cache subjacente, como MemoryCache, Redis etc.

Desktop, linha de comando e aplicativos móveis

A área de trabalho, a linha de comando e os aplicativos móveis devem primeiro chamar o AcquireTokenSilent método para verificar se um token aceitável está no cache. Em muitos casos, é possível adquirir outro token com mais escopos com base em um token no cache. Também é possível atualizar um token quando ele está chegando perto da expiração (já que o cache de token também contém um token de atualização).

Para fluxos de autenticação que exigem uma interação do usuário, a MSAL armazena em cache os tokens de acesso, atualização e ID e o IAccount objeto, que representa informações sobre uma única conta. Saiba mais sobre o IAccount. Para fluxos de aplicativos, como credenciais de cliente, somente tokens de acesso são armazenados em cache, porque o objeto IAccount e o token de ID exigem um usuário e o token de atualização não é aplicável.

O padrão recomendado é chamar o AcquireTokenSilent método primeiro. Se AcquireTokenSilent falhar, adquira um token usando outros métodos.

No exemplo a seguir, o aplicativo primeiro tenta adquirir um token do cache de token. Se uma MsalUiRequiredException exceção for gerada, o aplicativo adquirirá um token interativamente.

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
}

Limpar a cache

Em aplicativos cliente públicos, a remoção de contas do cache o limpará. No entanto, isso não remove o cookie de sessão, que está no navegador.

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

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