Во время получения токена не были найдены токены кеша

Я хочу отправить запрос от контроллера приложения ASP.NET MVC, развернутого в Microsoft Azure Cloud Active Directory, и получить ответ от службы, которая все еще развернута в Microsoft Azure Cloud Active Directory.

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

Когда я тестировал сервис и веб-приложения на своем портале Azure, я обнаружил сообщение об ошибке в заголовке:

Не удалось автоматически получить токен, так как в кэше не найдено ни одного токена. Метод вызова AcquireToken

Ошибка произошла в следующей части моего контроллера:

            ClientCredential credential = new ClientCredential( clientId, appKey );
            result = await authContext.AcquireTokenSilentAsync( todoListResourceId, credential, new UserIdentifier( userObjectID, UserIdentifierType.UniqueId ) );

clientId: идентификатор моего веб-приложения, установленного в Azure AD (например, c95d45dd-ba7f-41be-a995-1db604afff32).

appKey: скрытое значение ключа моего веб-приложения на портале.

todoListResourceId: идентификатор моего приложения API, установленного в Azure AD (например: 4cfebcb4-6f2e-4eeb-84f2-4220f65774ed).

userObjectID: значение, возвращенное из следующего фрагмента кода.

            string userObjectID = ClaimsPrincipal.Current.FindFirst( "http://schemas.microsoft.com/identity/claims/objectidentifier" ).Value;

то есть значение для пользователя, который находится в сети в браузере. Как указано в документе по моей ссылке на GitHub, это значение не является моей учетной записью Microsoft, которую я использовал при входе в свой портал Azure, а значением для моего пользователя, которого я зарегистрировал в моем Azure Active Directory.

Обсуждалась тема, аналогичная этой теме, и на нее был дан ответ the-cache-call-method">здесь раньше, но этот ответ не решил мою проблему.

Я работаю уже несколько дней, но не получил ответа от GET, POST, PUT, DELETE< /strong> методы в службе. Продолжаю разбираться с ошибкой в ​​названии. Я жду твоей помощи.


person Gbsibascin    schedule 01.02.2020    source источник
comment
Покажи всю свою программу. У вас проблема с аутентификацией.   -  person John Hanley    schedule 01.02.2020
comment
Весь проект находится по ссылке GitHub в вопросе.   -  person Gbsibascin    schedule 01.02.2020
comment
Вопросы должны быть самодостаточными. Внешние ссылки ломаются, удаляются и т. д. Прочтите эту ссылку и обновите свой вопрос. stackoverflow.com/help/minimal-reproducible-example   -  person John Hanley    schedule 01.02.2020
comment
Аккаунт по ссылке мой личный аккаунт. Это код, которым я собираюсь поделиться. Больше ничего нет. Я пытался решить эту проблему в течение нескольких дней, и у меня заканчивается время.   -  person Gbsibascin    schedule 01.02.2020
comment
@JohnHanley Нужно ли мне делиться всей программой? Когда я вызываю метод AcquireTokenSilentAsync, я получаю эту ошибку. Вот в чем проблема. Нигде больше. Я также упомянул, где я получил параметры в методе. Вы сказали, что это проблема аутентификации. Я неправильно назвал метод? Нужно ли настраивать на стороне портала? Это все, что я хочу знать.   -  person Gbsibascin    schedule 02.02.2020


Ответы (1)


Причина, по которой вы получаете эту ошибку, заключается в том, что вызовacquiretokensilentasync ОЖИДАЕТСЯ вызвать эту ошибку, когда кеш пуст. Этот вызов предназначен для перехвата в попытке поймать. Если он выдает эту ошибку, он должен вызвать вызовAcquiretokenasync.

В дополнение к этому похоже, что вы пытаетесь использовать поток учетных данных клиента с помощью вызоваAcquiretokensilentasync, который не является правильным методом для использования в соответствии с вики-документами ADAL.

Узнайте здесь, как это сделать правильно: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/Client-credential-flows

Похоже, вы используете идентификатор и секрет приложения, метод, в частности, о том, как это сделать в соответствии с документом, указанным выше:

AuthenticationContext authenticationContext = new AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
AuthenticationResult result = await authenticationContext.AcquireTokenAsync("https://resourceUrl", clientCredential);

Дополнительную документацию по вызову acquiretokensilentasync можно найти здесь: https://github.com/AzureAD/azure-activedirectory-library-for-dotnet/wiki/AcquireTokenSilentAsync-using-a-cached-token

Из документа выше:

Рекомендуемый шаблон для получения токена

Теперь, когда вы видели и AcquireTokenAsync, и AcquireTokenSilentAsync, самое время представить рекомендуемый шаблон использования для вызова этих методов. Идея состоит в том, что вы хотите свести к минимуму количество подписей для пользователя, и поэтому вам нужно:

сначала попытайтесь получить токен молча, и если этот вызов не удался, вы попытаетесь получить его в интерактивном режиме. Обратите внимание, что AcquireTokenSilent не нужно вызывать в потоке учетных данных клиента (когда приложение получает токен без пользователя, но от своего имени).

Обратите внимание, что AcquireTokenSilent может завершиться ошибкой по нескольким причинам, например, если в кэше нет маркера для пользователя или срок действия маркера истек и его нельзя обновить. По этим причинам вызов AcquireTokenAsync обычно получает токен. Но есть и такие проблемы, как проблемы с сетью, недоступность STS и т. д., которые невозможно решить напрямую. Вы увидите их более подробно в статье о лучших методах обработки ошибок.

В дополнение к этому, похоже, что вы используете библиотеку ADAL, я предлагаю перейти на библиотеку MSAL, поскольку Microsoft медленно движется к использованию библиотек MSAL и в какой-то момент в будущем (возможно, в далеком будущем) перейдет конечной точки ADAL/V1.0. Однако для этого нет текущих точных дат. Документ о переходе с ADAL на MSAL можно найти здесь:

https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Adal-to-Msal

person Frank Hu MSFT    schedule 03.02.2020
comment
Я изменил контроллер так, как вы хотели, и зафиксировал его. Вы можете увидеть изменение по ссылке на GitHub. (TodoListWebApp/Контроллеры/TodoListController.cs). Это метод, который я пробовал раньше. Когда я использую его таким образом, ответ становится ложным, когда я отправляю запрос в службу (response.IsSuccessStatusCode = false). Так что я до сих пор не получил ответа от метода get веб-API. - person Gbsibascin; 04.02.2020
comment
Я думаю, что раздел ClaimsPrincipal в TodoListService/Controllers/TodoListController.cs является причиной того, что служба возвращает ложный результат. - person Gbsibascin; 04.02.2020
comment
результат ложный, поскольку ClaimsPrincipal.Current.FindFirst(schemas.microsoft.com/identity/claims/ scope) имеет значение NULL в службе. (TodoListService/Контроллеры/TodoListController.cs) - person Gbsibascin; 04.02.2020