Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Depois de a Biblioteca de Autenticação da Microsoft (MSAL) adquirir um token, ele armazena esse token em cache. As aplicações clientes públicas (desktop e móveis) devem tentar obter um token da cache antes de adquirir um token por outro método. Os métodos de aquisição nas aplicações cliente confidenciais fazem a gestão da cache por si próprios. Este artigo aborda a serialização predefinida e personalizada da cache de tokens no MSAL.NET.
Resumo
A recomendação é:
- Ao escrever aplicações móveis, o cache já está pré-configurado pela MSAL.
- Ao escrever uma aplicação de ambiente de trabalho, utilize a cache de tokens multiplataforma conforme explicado nas aplicações de desktop.
- Ao escrever novas aplicações clientes confidenciais (aplicações web, APIs web ou aplicações service-to-service ou daemon), use a Microsoft. Identity.Web como uma API de nível superior. Oferece integração com ASP.NET Core, ASP.NET Classic e funciona também de forma autónoma.
- As aplicações clientes confidenciais existentes que aproveitam diretamente o MSAL.NET podem continuar a fazê-lo.
- As aplicações web e as APIs web devem usar uma cache de token distribuída (por exemplo, Redis, SQL Server, Azure Cosmos DB) em conjunto com uma cache de memória limitada.
- A encriptação em repouso pode ser configurada opcionalmente usando o ASP.NET Core Data Protection.
- As aplicações web também podem basear-se em cookies de sessão; no entanto, esta opção não é recomendada devido à dimensão dos cookies.
- Aplicações Service-to-Service e daemon podem depender apenas do cache de memória. Se a sua aplicação serve muitos inquilinos, configure uma política de despejo.
- Os tokens de identidade geridos são armazenados em cache apenas na memória.
- Clientes confidenciais que utilizam o Microsoft.Identity.Web
- Clientes confidenciais usando MSAL.NET
- Desktop apps (Aplicações de ambiente de trabalho)
- Aplicações móveis
- Escreve a tua própria cache
O pacote NuGet Microsoft.Identity.Web.TokenCache fornece serialização da cache de tokens na biblioteca Microsoft.Identity.Web. A biblioteca oferece integração tanto com o ASP.NET Core como com o ASP.NET Classic, e as suas abstrações podem ser usadas para gerar outros frameworks de aplicações web ou APIs.
Note
Os exemplos abaixo referem-se ao ASP.NET Core. Para ASP.NET o código é semelhante, veja o ms-identity-aspnet-wepapp-openidconnect exemplo de aplicação web para uma implementação de referência.
| Método de extensão | Description |
|---|---|
| AddInMemoryTokenCaches | Cria uma cache temporária na memória para armazenamento e recuperação de tokens. As caches de tokens em memória são mais rápidas do que outros tipos de cache, mas os seus tokens não são mantidos entre reinicios da aplicação, e não podes controlar o tamanho da cache. Caches em memória são boas para aplicações que não precisam de tokens para persistir entre reinícios da aplicação. Use uma cache de tokens em memória em aplicações que participam em cenários de autenticação máquina-a-máquina, como serviços, daemons e outros que utilizam o AcquireTokenForClient (a concessão de credenciais do cliente). Os caches de tokens em memória também são bons para aplicações de exemplo e durante o desenvolvimento local de aplicações. Microsoft. As versões 1.19.0+ do Identity.Web partilham uma cache de token em memória entre todas as instâncias da aplicação. |
| AddSessionTokenCaches | A cache de tokens está ligada à sessão do utilizador. Esta opção não é ideal se o token de identificação contiver muitas reivindicações, porque o cookie se torna demasiado grande. |
AddDistributedTokenCaches |
A cache de tokens é um adaptador para a implementação do ASP.NET Core IDistributedCache. Permite-lhe escolher entre uma cache de memória distribuída, uma cache Redis, uma NCache distribuída ou uma cache SQL Server. Para detalhes sobre as IDistributedCache implementações, veja Cache de memória distribuída. |
Cache de token em memória
Aqui está um exemplo de código que utiliza a cache em memória no método ConfigureServices da classe Startup numa aplicação ASP.NET Core:
using Microsoft.Identity.Web;
public class Startup
{
const string scopesToRequest = "user.read";
public void ConfigureServices(IServiceCollection services)
{
// code before
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { scopesToRequest })
.AddInMemoryTokenCaches();
// code after
}
// code after
}
AddInMemoryTokenCaches é adequado para produção se pedir tokens exclusivos da aplicação. Se utilizar tokens de utilizador, considere utilizar uma memória cache de tokens distribuída.
O código de configuração da cache de token é semelhante entre as aplicações web e as APIs web do ASP.NET Core.
Caches de tokens distribuídos
Aqui estão exemplos de possíveis caches distribuídas:
// or use a distributed Token Cache by adding
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { scopesToRequest }
.AddDistributedTokenCaches();
// Distributed token caches have a L1/L2 mechanism.
// L1 is in memory, and L2 is the distributed cache
// implementation that you will choose below.
// You can configure them to limit the memory of the
// L1 cache, encrypt, and set eviction policies.
services.Configure<MsalDistributedTokenCacheAdapterOptions>(options =>
{
// Optional: Disable the L1 cache in apps that don't use session affinity
// by setting DisableL1Cache to 'true'.
options.DisableL1Cache = false;
// Or limit the memory (by default, this is 500 MB)
options.L1CacheOptions.SizeLimit = 1024 * 1024 * 1024; // 1 GB
// You can choose if you encrypt or not encrypt the cache
options.Encrypt = false;
// And you can set eviction policies for the distributed
// cache.
options.SlidingExpiration = TimeSpan.FromHours(1);
});
// Then, choose your implementation of distributed cache
// -----------------------------------------------------
// good for prototyping and testing, but this is NOT persisted and it is NOT distributed - do not use in production
services.AddDistributedMemoryCache();
// Or a Redis cache
// Requires the Microsoft.Extensions.Caching.StackExchangeRedis NuGet package
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost";
options.InstanceName = "SampleInstance";
});
// You can even decide if you want to repair the connection
// with Redis and retry on Redis failures.
services.Configure<MsalDistributedTokenCacheAdapterOptions>(options =>
{
options.OnL2CacheFailure = (ex) =>
{
if (ex is StackExchange.Redis.RedisConnectionException)
{
// action: try to reconnect or something
return true; //try to do the cache operation again
}
return false;
};
});
// Or even a SQL Server token cache
// Requires the Microsoft.Extensions.Caching.SqlServer NuGet package
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = _config["DistCache_ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "TestCache";
});
// Or an Azure Cosmos DB cache
// Requires the Microsoft.Extensions.Caching.Cosmos NuGet package
services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
cacheOptions.ContainerName = Configuration["CosmosCacheContainer"];
cacheOptions.DatabaseName = Configuration["CosmosCacheDatabase"];
cacheOptions.ClientBuilder = new CosmosClientBuilder(Configuration["CosmosConnectionString"]);
cacheOptions.CreateIfNotExists = true;
});
Para obter mais informações, consulte:
- Encriptação de cache distribuída e outras opções avançadas
- Gerir a eliminação da cache L2
- Configurar uma cache Redis no Docker
- Troubleshooting
A utilização da cache distribuída está presente no tutorial da aplicação web ASP.NET Core, na cache de tokens da fase 2-2.
Monitorize as taxas de acerto da cache e o desempenho da cache
O MSAL expõe métricas importantes como parte do objeto AuthenticationResult.AuthenticationResultMetadata . Pode registar estas métricas para avaliar a saúde da sua candidatura.
| Métrico | Meaning | Quando acionar um alarme? |
|---|---|---|
DurationTotalInMs |
Tempo total gasto em MSAL, incluindo chamadas de rede e cache. | Alarme com latência geral elevada (> 1 segundo). O valor depende da origem do token. Da cache: um acesso à cache. Do Microsoft Entra ID: dois acessos à cache mais uma chamada HTTP. A primeira chamada (por processo) demora mais por causa de uma chamada HTTP extra. |
DurationInCacheInMs |
Tempo gasto a carregar ou guardar a cache de tokens, que é personalizada pelo programador da aplicação (por exemplo, guardar para o Redis). | Alarme em picos. |
DurationInHttpInMs |
Tempo gasto a fazer chamadas HTTP para o Microsoft Entra ID. | Alarme em picos. |
TokenSource |
Fonte do token. Os tokens são recuperados da cache muito mais rapidamente (por exemplo, ~100 ms contra ~700 ms). Pode ser usado para monitorizar e alarmar a taxa de acertos do cache. | Utilizar com DurationTotalInMs. |
CacheRefreshReason |
Motivo para obter o token de acesso junto do fornecedor de identidade. | Utilizar com TokenSource. |
Tamanhos aproximados
Ao usar uma cache de token, é importante considerar o tamanho potencial da cache, especialmente para aplicações altamente disponíveis e distribuídas. Quando os utilizadores iniciam login, haverá uma entrada de cache para cada utilizador, com cerca de 7KB. O tamanho será maior se estiveres a chamar várias APIs a jusante. Para a autenticação entre serviços, existirá uma entrada de cache para cada locatário e API downstream, com cerca de 2 KB.
Estimativas detalhadas estão listadas abaixo.
Fluxos de aplicação (AcquireTokenForClient, AcquireTokenForManagedIdentity)
- Apenas os tokens de acesso são armazenados em cache. Um token ocupa cerca de 2-3 KB quando armazenado. Haverá 1 token por ID do cliente da aplicação * locatários * recursos downstream. Por exemplo, uma aplicação multi-inquilino que dá serviço a 1000 inquilinos e necessita de tokens para o Graph e o SharePoint utilizará: 3 KB * 1000 * 2, ou seja, aproximadamente 6 MB.
Site Web que chama API Web a jusante (AcquireTokenByAuthCode)
- Tokens de acesso – 4 KB; 1 token por ID do cliente da aplicação * utilizador * inquilino * recurso subordinado.
- Token de atualização – 2KB; 1 token por ID de aplicação cliente * utilizador.
- ID token – 2KB; 1 token por ID da aplicação do cliente * utilizador * número de inquilinos onde esse utilizador faz login.
Note
Recomendamos vivamente a utilização das APIs de nível superior de Microsoft.Identity.Web para tal, e não do MSAL diretamente. As considerações de cache são as mesmas.
Web API que chama outra Web API (AcquireTokenOnBehalfOf)
O mesmo acontece com o cenário do site, mas haverá 1 nó para cada sessão, não para cada utilizador. Por predefinição, o MSAL identifica uma sessão aplicando hash à asserção upstream, mas isto pode ser alterado. Consulte Processos OBO de Longa Duração.
Note
Recomendamos vivamente a utilização das APIs de nível superior de Microsoft.Identity.Web para tal, e não de MSAL diretamente. As considerações de cache são as mesmas.
Tipos de cache de tokens
O MSAL.NET opera com dois tipos de caches de token - utilizador e aplicação.
A cache de tokens da aplicação que contém os tokens de acesso desta aplicação. É mantido e atualizado de forma silenciosa ao chamar AcquireTokenForClient.
A cache de tokens de utilizador contém tokens ID, tokens de acesso e tokens de atualização para contas com as quais o MSAL.NET interage. É usado e atualizado de forma silenciosa, se necessário, ao chamar AcquireTokenSilent. É atualizado por cada método de aquisição de tokens, com exceção do AcquireTokenForClient , que utiliza apenas a cache da aplicação.
Passos seguintes
Os exemplos seguintes ilustram a serialização da cache de tokens.
| Sample | Platform | Description |
|---|---|---|
| active-directory-dotnet-desktop-msgraph-v2 | Ambiente de Trabalho (WPF) | Aplicação de ambiente de trabalho Windows .NET (WPF) que chama a API do Microsoft Graph.
|
| active-directory-dotnet-v1-to-v2 | Ambiente de trabalho (consola) | Conjunto de soluções do Visual Studio que ilustram a migração de aplicações Azure AD v1.0 (usando ADAL.NET) para aplicações da plataforma de identidades da Microsoft (usando MSAL.NET). |
| ms-identity-aspnet-webapp-openidconnect | ASP.NET (net472) | Exemplo de serialização de cache de token numa aplicação ASP.NET MVC (usando MSAL.NET). |