Ошибка веб-API от имени adal id_token - PullRequest
0 голосов
/ 13 июня 2018

Я создал веб-API в Azure.Этот веб-API выполняет некоторые вызовы в SharePoint Online.Некоторые вызовы API выполняются от имени.

Этот веб-API работает нормально до 01.05.2018 и прекрасно работает со старыми службами приложений, которые были созданы до 01.05.2018.

Сотрудник Microsoft сказал:

В рамках наших усилий по усилению безопасности мы не разрешаем выкуп id_token для любого приложения, созданного после 2018-05-01 00: 00: 00.

Во время входа в систему adal я получил id_token.Id_token имеет то же значение, что и access_token: enter image description here

Когда я вызываю веб-интерфейс API, я отправлю этот токен в качестве токена носителя.Веб-API берет этот токен (строка accessToken) и запускает метод AcquireTokenAsync:

        var clientID = ConfigurationManager.AppSettings["ClientID"];
        var clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
        var tenant = ConfigurationManager.AppSettings["Tenant"];

        var appCred = new ClientCredential(clientID, clientSecret);
        var authContext = new AuthenticationContext(
            "https://login.microsoftonline.com/" + tenant);

        var resource = new Uri(sharePointUrl).GetLeftPart(UriPartial.Authority);

        var authResult = await authContext.AcquireTokenAsync(resource, appCred,
            new UserAssertion(accessToken));
        return authResult.AccessToken;

Но в строке, которая вызывает AcquireTokenAsync, у меня появляется сообщение об ошибке:

AADSTS240002: Input id_token cannot be used as 'urn:ietf:params:oauth:grant-type:jwt-bearer' grant

а в чем проблема?

1 Ответ

0 голосов
/ 13 июня 2018

Проблема в том, что вы используете одно и то же удостоверение приложения во внешнем интерфейсе и бэкэнде, и MS не позволяет вам использовать токен Id (который используется здесь как токен доступа из-за первого) для получениядругой токен доступа.

Возможное решение:

  • Зарегистрируйте другое приложение (внешнее JS-приложение должно быть собственным приложением)
  • Оно должно получить доступтокен для вашего внутреннего API, используя идентификатор клиента API или URI идентификатора приложения в качестве ресурса
  • Тогда API может обменять токен доступа на другой токен доступа

Если этомультитенантное приложение, миграция, вероятно, не будет легкой.Если это один арендатор, то все должно быть возможно.Разумеется, ваше внешнее приложение должно требовать разрешения для вызова внутреннего API в Azure AD, и это разрешение должно быть предоставлено.

Другим решением было бы получить другой токен доступа во внешнем интерфейсе, используяADAL.JS вместо того, чтобы использовать его от имени в серверной части и присоединять его ко всем запросам API в дополнение к токену Id.

...