Toegangstokens opslaan in cache
Het is relatief duur om een OAuth-toegangsteken op te halen, omdat hiervoor een HTTP-aanvraag voor het token-eindpunt is vereist. Daarom is het waar mogelijk goed om tokens in de cache op te nemen. De Microsoft Authentication Library voor .NET (MSAL.NET) (MSAL) cachet tokens die zijn verkregen van Azure AD, inclusief vernieuwingstokens.
Sommige implementaties omvatten MSAL zijn in-memory cache en gedistribueerde cache. Deze optie wordt ingesteld in de methode ConfigureServices van de opstartklasse van de webtoepassing. Als u een token voor de downstream-API wilt verkrijgen, moet u .EnableTokenAcquisitionToCallDownstreamApi() .
De app Surveys maakt gebruik van gedistribueerde tokencache waarin gegevens worden opgeslagen in de back-store. De app gebruikt een Redis-cache als de back-store. Elk server-exemplaar in een serverfarm leest/schrijft naar dezelfde cache, en deze aanpak schaalt naar veel gebruikers.
Voor een webserver met één exemplaar kunt u de ASP.NET Core in de geheugencache gebruiken. (Dit is ook een goede optie voor het lokaal uitvoeren van de app tijdens de ontwikkeling.)
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";
});
}
De configuratie voor SurveyApi wordt opgegeven in appsettings.json.
"SurveyApi": {
"BaseUrl": "https://localhost:44301",
"Scopes": "https://test.onmicrosoft.com/surveys.webapi/surveys.access",
"Name": "SurveyApi"
},
Tokens in cache versleutelen
Tokens zijn gevoelige gegevens, omdat ze toegang verlenen tot de resources van een gebruiker. (In tegenstelling tot het wachtwoord van een gebruiker kunt u bovendien niet gewoon een hash van het token opslaan.) Daarom is het essentieel om te beveiligen dat tokens niet worden aangetast.
De cache met Redis-back-by wordt beveiligd met een wachtwoord, maar als iemand het wachtwoord verkrijgt, kan deze alle toegangstokens in de cache verkrijgen. De MSAL-tokencache is versleuteld.
Het token verkrijgen
De Survey-toepassing roept de downstream web-API aan vanuit de pagina-constructor.
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}";
});
}
}
Een andere manier is om een ITokenAcquisition service in de controller te injecteren. Zie Tokens verkrijgen en cachen met behulp van de Microsoft Authentication Library (MSAL) voor meer informatie