Как закешировать токен (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-блок более не попадали? Т.е. только первый раз поадает в кетч, а при последующем выолнении, токен подтягивается из кеша.

Я не работал ранее с кешированием вообще, пожалуйста подскажите.

Спасибо


Ответы (0 шт):