Cacheåtkomsttokens
Det är relativt dyrt att hämta en OAuth-åtkomsttoken eftersom det kräver en HTTP-begäran till tokenslutpunkten. Därför är det bra att cachelagra token när det är möjligt. Microsoft Authentication Library för .NET (MSAL.NET) (MSAL) cachelagrar token som hämtas från Azure AD, inklusive uppdateringstoken.
Vissa implementeringar inkluderar MSAL är minnescache och distribuerad cache. Det här alternativet anges i metoden ConfigureServices i webbappens startklass. Om du vill hämta en token för det underordnade API:et måste du .EnableTokenAcquisitionToCallDownstreamApi() .
Surveys-appen använder distribuerad tokencache som lagrar data i lagringslagret. Appen använder en Redis-cache som lagringslagring. Varje serverinstans i en servergrupp läser/skriver till samma cache och den här metoden skalas till många användare.
För en webbserver med en instans kan du använda ASP.NET Core cacheminnet. (Detta är också ett bra alternativ för att köra appen lokalt under utvecklingen.)
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";
});
}
Konfigurationen för SurveyApi anges i appsettings.json.
"SurveyApi": {
"BaseUrl": "https://localhost:44301",
"Scopes": "https://test.onmicrosoft.com/surveys.webapi/surveys.access",
"Name": "SurveyApi"
},
Kryptera cachelagrade token
Token är känsliga data eftersom de ger åtkomst till en användares resurser. (Till skillnad från en användares lösenord kan du dessutom inte bara lagra en hash för token.) Därför är det viktigt att skydda token från att komprometteras.
Den Redis-backade cachen skyddas av ett lösenord, men om någon hämtar lösenordet kan de hämta alla cachelagrade åtkomsttoken. MSAL-tokencachen är krypterad.
Hämta token
Undersökningsprogrammet anropar det underordnade webb-API:et från sidkonstruktorn.
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}";
});
}
}
Ett annat sätt är att mata in en ITokenAcquisition tjänst i kontrollanten. Mer information finns i Hämta och cachelagra token med hjälp av Microsoft Authentication Library (MSAL)
Nästa steg
- Serialisering av tokencache i MSAL.NET
- Hämta och cachelagra token med hjälp av Microsoft Authentication Library (MSAL)
Exempelkod