Almacenamiento en caché de los tokens de acceso
Es relativamente costoso obtener un token acceso de OAuth, porque requiere una solicitud HTTP al punto de conexión del token. Por lo tanto, es bueno almacenar tokens en caché siempre que sea posible. La biblioteca de autenticación de Microsoft para .NET (MSAL.NET) (MSAL) almacena en caché los tokens obtenidos de Azure AD, incluidos los tokens de actualización.
Algunas implementaciones que incluyen MSAL son la caché en memoria y la caché distribuida. Esta opción se establece en el método ConfigureServices de la clase Startup de la aplicación web. Para adquirir un token para la API de nivel inferior, necesitará .EnableTokenAcquisitionToCallDownstreamApi().
La aplicación Surveys usa la caché de tokens distribuida que almacena los datos en la memoria auxiliar. La aplicación usa Redis Cache como memoria auxiliar. Cada una de las instancias de servidor de una granja de servidores lee o escribe en la misma caché, y este enfoque se escala a muchos usuarios.
Para un servidor web de instancia única, podría utilizar la caché en memoria de ASP.NET Core. (Esto también es una buena opción para ejecutar la aplicación de forma local durante el desarrollo).
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(
options =>
{
Configuration.Bind("AzureAd", options);
options.Events = new SurveyAuthenticationEvents(loggerFactory);
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.Events.OnTokenValidated += options.Events.TokenValidated;
})
.EnableTokenAcquisitionToCallDownstreamApi()
.AddDownstreamWebApi(configOptions.SurveyApi.Name, Configuration.GetSection("SurveyApi"))
.AddDistributedTokenCaches();
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = configOptions.Redis.Configuration;
options.InstanceName = "TokenCache";
});
}
La configuración de SurveyApi se especifica en appsettings.json.
"SurveyApi": {
"BaseUrl": "https://localhost:44301",
"Scopes": "https://test.onmicrosoft.com/surveys.webapi/surveys.access",
"Name": "SurveyApi"
},
Cifrado de tokens almacenados en caché
Los tokens son datos confidenciales, ya que conceden acceso a los recursos de un usuario. (Además, a diferencia de la contraseña del usuario, no puede almacenar simplemente un hash del token). Por lo tanto, es fundamental proteger los tokens para que no se vean comprometidos.
La memoria caché con respaldo de Redis está protegida por una contraseña, pero si un usuario la obtiene, podría conseguir todos los tokens de acceso almacenados en caché. La caché de tokens de MSAL está cifrada.
Adquisición del token
La aplicación Survey llama a la API web de nivel inferior desde el constructor de página.
public class SurveyService : ISurveyService
{
private string _serviceName;
private readonly IDownstreamWebApi _downstreamWebApi;
public SurveyService(HttpClientService factory, IDownstreamWebApi downstreamWebApi, IOptions<ConfigurationOptions> configOptions)
{
_serviceName = configOptions.Value.SurveyApi.Name;
_downstreamWebApi = downstreamWebApi;
}
public async Task<SurveyDTO> GetSurveyAsync(int id)
{
return await _downstreamWebApi.CallWebApiForUserAsync<SurveyDTO>(_serviceName,
options =>
{
options.HttpMethod = HttpMethod.Get;
options.RelativePath = $"surveys/{id}";
});
}
}
Otra manera es insertar un servicio ITokenAcquisition en el controlador. Para más información, consulte Adquisición y almacenamiento en caché de tokens con la biblioteca de autenticación de Microsoft (MSAL).
Código de ejemplo