MSAL: AcquireTokenSilentAsync всегда взаимодействует с конечной точкой

Я смотрю на MSAL и пытаюсь понять, как правильно использовать его в клиентском приложении. В моем случае я хотел бы аутентифицировать пользователя, а затем использовать токен идентификатора против "частного" веб-приложения API.

Теперь у меня сложилось впечатление, что AcquireTokenSilentAsync будет повторно использовать существующий токен из кэша (если он доступен), не выполняя дополнительный вызов к конечной точке аутентификации, если токен все еще действителен, и области действия запрашиваемых объектов могут быть выполнены (это была моя интерпретация, и это наверное это не так). Однако, похоже, это не так. Что я вижу в fiddler, так это то, что этот метод всегда будет обращаться к конечной точке авторизации.

Первоначально я думал, что мои обертки службы клиента всегда должны вызывать этот метод, чтобы получить маркер идентификатора, который затем будет передаваться на внутренний веб-сайт через заголовок носителя аутентификации. Вот пример того, что я имею в виду:

public async Task<string> GetAllWorkers() {
    _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", await GetToken());

    var request = new HttpRequestMessage(HttpMethod.Get, _url);
    var resposta = await _httpClient.SendAsync(request);
    var content = await resposta.Content.ReadAsStringAsync();
    return content;
}

GetToken это метод, который оборачивает типичный код, используемый для аутентификации пользователя (использует блок try / catch для обертывания AcquireTokenSilentAsync и, в случае сбоя, перенаправляет пользователя в метод AcquireTokenAsync для отображения пользовательского интерфейса входа в систему).

Вопрос: действительно ли этот дополнительный вызов перед всеми моими бэкэнд-сервисами действительно подходит? Или я должен кэшировать токен и повторно использовать его во всех внутренних вызовах веб-сервисов, пока не получу 401 (и только тогда я должен вызвать метод GetToken для обновления моего токена id?)

Редактирование, чтобы дать больше информации

_clientApp = new PublicClientApplication(ClientId, 
                                       Authority, 
                                       TokenCacheHelper.GetUserCache());

TokenCacheHelper - это помощник для кэширования токенов, который поставляется с большинством образцов Azure AD. GetToken метод, который возвращает заголовок аутентификации, представляет собой один вкладыш, который взаимодействует с помощником, который инкапсулирует поле _clientApp, показанное выше:

return (await _helper.AuthenticateUser()).IdToken

А вот и метод AuthenticateUser:

public async Task<AuthenticationResult> AuthenticateUser() {
    try {
        return await _clientApp.AcquireTokenSilentAsync(_scopes, _clientApp.Users.FirstOrDefault());
    }
    catch (MsalUiRequiredException ex) {
        return await RetryWithGraphicalUI();
    }
}

Теперь помощник кеша токенов находится под ударом. Я не понимаю, почему метод AcquireTokenSilentAsync всегда вызывает конечную точку oauth2 ( https://login.microsoftonline.com/{azure ad guid} /oauth2/v2.0/token)...

Тем временем я изменил код, сделав кэш моего вспомогательного класса AuthenticationResult. Теперь AcquireTokenSilentAsync будет вызываться только в том случае, если один из методов веб-API "внутреннего" приложения возвращает 401 в ответ на вызов, выполненный с заголовком авторизации канала-носителя.

1 ответ

Решение

В конце концов, я согласился с кэшированием AuthenticationResult и его идентификатора. Это, кажется, лучший вариант, так как это спасает меня от удаленного вызова. Я только попробую позвонить AcquireTokenSilentAsync снова, когда веб-служба возвращает 401.

Другие вопросы по тегам