Как закешировать токен (Net CORE 3.1)
Код:
public async Task<string> GetUserAccessTokenAsync()
{
try
{
string userName = contextAccessor.HttpContext.User.Identity.Name;
IEnumerable<IAccount> accounts = await confidentialClientApplication.GetAccountsAsync(); //возвращает пустую коллекуцию
IAccount account = accounts.FirstOrDefault(a => a.Username.Equals(userName))!;
//падает експшнт, т.к. account = null
AuthenticationResult user = await confidentialClientApplication
.AcquireTokenSilent(graphScopes, account).ExecuteAsync();
return user.AccessToken;
}
catch (MsalUiRequiredException ex)
{
//здесь получение токена отрабатывавет return await UserAccessTokenBehalfOfAsync(); }
catch (Exception ex)
{
throw new ServiceException(
new Error
{
Code = GraphErrorCode.AuthenticationFailure.ToString(),
Message = "Caller needs to authenticate. Unable to retrieve the access token silently."
},
ex);
}
}
//////////////////////////////////// //UserAccessTokenBehalfOfAsync метод отрабатывается, токен получается
private async Task<string> UserAccessTokenBehalfOfAsync()
{
try
{
string? bearerToken = Context.Request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", "");
Verify.NotNull(nameof(bearerToken), bearerToken);
var result = confidentialClientApplication.AcquireTokenOnBehalfOf(graphScopes,
new UserAssertion(bearerToken));
var x = await result.ExecuteAsync();
return x.AccessToken;
}
catch (Exception innerEx)
{
//.... } }
Текст ексепшена при вызове AcquireTokenSilent() : No account or login hint was passed to the AcquireTokenSilent call.
Вопрос:
Как закешировать получаемый токен в методе UserAccessTokenBehalfOfAsync(), чтобы строчка кода в try'е IEnumerable accounts = await confidentialClientApplication.GetAccountsAsync(); возвращала account и мы в catch-блок более не попадали? Т.е. только первый раз поадает в кетч, а при последующем выолнении, токен подтягивается из кеша.
Я не работал ранее с кешированием вообще, пожалуйста подскажите.
Спасибо