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.