При получении токена токены кеша не найдены - PullRequest
1 голос
/ 01 февраля 2020

Я хочу отправить запрос от контроллера 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

Подобные топи c для этой топи c уже обсуждались и были даны ответы здесь ранее, но этот ответ не решил мою проблему.

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

1 Ответ

0 голосов
/ 04 февраля 2020

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

Кроме того, похоже, что вы пытаетесь использовать поток учетных данных клиента с помощью вызова acqutokensilentasyn c, который не подходит для использования в вики-документации ADAL.

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

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

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

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

Из do c выше:

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...