Adal.js возвращает токен с недопустимым разрешением для ресурса powerbi

У меня проблема с аутентификацией в Azure Active Directory, которая связана со службой Power BI. Я пытаюсь получить токен доступа, чтобы получить доступ к API power bi rest.

Если я использую почтальона, я могу успешно использовать их логин OAuth2 для получения токена с правильными учетными данными для связи с API power bi rest.

Однако, когда я пытаюсь сделать это с помощью adal.js, токен недействителен. Чтобы упростить воспроизведение, я основал свой проект на

https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp-dotnet-webapi

Вам необходимо обновить конфигурацию окна в: \ active-directory-javascript-singlepageapp-dotnet-webapi \ TodoSPA \ App \ Scripts \ app.js

  window.config = {
        instance: 'https://login.microsoftonline.com/',
        tenant: <insert tenant>,
        clientId: <insert clientid>,
        postLogoutRedirectUri: window.location.origin,
        cacheLocation: 'localStorage', // enable this for IE, as sessionStorage does not work for localhost.
        endpoints: {
            "https://api.powerbi.com": "https://analysis.windows.net/powerbi/api",

        }
    };

Временное решение. Я могу получить токен с помощью автоматической аутентификации, при которой вам нужно жестко ввести имя пользователя и пароль.

Я следил за этим http://community.powerbi.com/t5/Developer/How-to-use-Power-BI-Rest-API-without-GUI-authentication-redirect/mp/14218#M119 для создания запроса на тихую аутентификацию:

Post Url: https://login.windows.net/<tenant>/oauth2/token

Body:
password: <password>
username: <username>
client_id: <clientid>
client_secret: <secret>
grant_type: password
scope: openId
resource: https://analysis.windows.net/powerbi/api

Я также подтвердил, что учетная запись, которую я использовал, имеет правильное разрешение с помощью почтальона и авторизации с помощью OAuth2. Полученный мной токен имел правильное разрешение для PowerBI.

Конфигурация почтальона

В почтальоне нажмите вкладку «Авторизация» -> Установите для типа значение OAuth2.0 -> Получить новый токен доступа:

Конфигурация, которую вы бы использовали:

AuthUrl: https://login.microsoftonline.com/ / oauth2 / authorize? Resource = https://analysis.windows.net/powerbi/api

URL-адрес токена доступа: https://login.microsoftonline.com/ / oauth2 / token

Тип гранта: Код авторизации:

Идентификатор клиента: Секрет клиента:

Перейдите на страницу https://dev.powerbi.com/apps, чтобы сгенерировать clientID / ClientSecret и установите URL перенаправления: https://www.getpostman.com/oauth2/callback

почтальон сгенерировал токен:

{
  "aud": "https://analysis.windows.net/powerbi/api",
  "iss": "https://sts.windows.net/<id>/",
  "iat": 1500464096,
  "nbf": 1500464096,
  "exp": 1500467996,
  "acr": "1",
  "aio": <value>,
  "amr": [
    "pwd"
  ],
  "appid": <app_id>,
  "appidacr": "1",
  "family_name": "Sunderam",
  "given_name": <userName>,
  "ipaddr": "23.252.49.99",
  "name": <name>,
  "oid": <oid_id>,
  "platf": "3",
  "puid": <puid_id>,
  "scp": "Content.Create Dashboard.Read.All Data.Alter_Any Dataset.Read.All Dataset.ReadWrite.All Group.Read Group.Read.All Metadata.View_Any Report.Read.All Report.ReadWrite.All",
  "sub": <sub_id>,
  "tid": <tid_id>,
  "unique_name": <user_email>,
  "upn": <user_email>,
  "ver": "1.0",
  "wids": [
    <wid_id>
  ]
}

токен adal.js

{
  "aud": <aud_id>,
  "iss": "https://sts.windows.net/<id>/",
  "iat": 1501037728,
  "nbf": 1501037728,
  "exp": 1501041628,
  "aio": <aio_id>",
  "amr": [
    "pwd"
  ],
  "family_name": <name>,
  "given_name": <name>,
  "ipaddr": "23.252.49.99",
  "name": ,"name"
  "nonce": "b21969c3-ae73-4928-bcd0-e9c501f791e4",
  "oid": <oid_id>,
  "platf": "5",
  "sub": <sub_id>,
  "tid": <tid_id>,
  "unique_name": <user_email>,
  "upn": <user_email>,
  "ver": "1.0"
}

Обратите внимание, что у токена почтальона есть scp, appid и wids.

Любой совет оценен, спасибо, Дерек


person darewreck    schedule 22.07.2017    source источник
comment
Какой поток получить жетон с помощью почтальона? И я предлагаю вам проверить запрос, чтобы убедиться, что токен был добавлен правильно. Вы также можете сравнить токен, используемый adal.js, с получением от почтальона.   -  person Fei Xue - MSFT    schedule 24.07.2017
comment
Если они являются токеном делегата, вы можете увидеть в токене утверждение scp.   -  person Fei Xue - MSFT    schedule 24.07.2017
comment
@FeiXue Я пытался отслеживать трафик с помощью скрипта для adal.js, но это было не то, что я ожидал. С почтальоном он прошел через весь OAuth2 с триггером, чтобы получить код, а затем перенаправить на назначенный URL-адрес. При этом запросе на получение access_token. Однако с adal.js я не вижу двух вызовов url для получения кода, обратного вызова и затем запроса на получение токена. Я сравнил токены, и они разные.   -  person darewreck    schedule 25.07.2017
comment
@FeiXue Добавлена ​​конфигурация для почтальона. Также причина, по которой я знаю, что токен был правильно добавлен к запросу, заключается в том, что я просто заменил токен на тот, который я получил от почтальона, на тот, который я получил от adal.js. Это сработает для одного, а не для другого. Также жетоны разные. Так что есть кое-что, чего я не понимаю с adal.js. Я предполагаю, что вам нужно запросить определенный ресурс, что, как я думал, я делаю правильно с библиотекой adal.js. Но я мог делать это неправильно.   -  person darewreck    schedule 25.07.2017
comment
Adal.js использует неявный поток для получения токена с помощью скрытого iframe. Не могли бы вы разделить претензии по двум токенам? Вы можете расшифровать его с этого сайта.   -  person Fei Xue - MSFT    schedule 25.07.2017
comment
@FeiXue, похоже, я сравниваю апельсины с яблоками. Там, где почтальон предоставляет учетные данные клиента, а adal.js - неявный поток аутентификации. Так что я все еще немного запутался в том, как заставить неявный поток правильно работать с adal.js   -  person darewreck    schedule 26.07.2017
comment
В исходном сообщении вы получили токен с помощью потока предоставления кода авторизации через почтальона. А теперь вы упомянули, что использовали поток учетных данных клиента. И на основе утверждений токена следует использовать токен делегата. Токен Adal.js выглядит некорректно, поскольку нет scp заявки. Вы получили токен из запроса или получили токен только из локального хранилища?   -  person Fei Xue - MSFT    schedule 26.07.2017
comment
Для adal.js сначала вы авторизуетесь в объявлении Azure, после чего, когда вы отправляете запрос в PowerBI, он автоматически проверяет, выходит ли токен в кеш, в противном случае он создаст скрытый iframe и получит токен. с неявным потоком, и поскольку Azure AD уже вошел в систему, он автоматически получит токен.   -  person Fei Xue - MSFT    schedule 26.07.2017
comment
Да, я не понимал, что adal.js - это другой поток. Из локального хранилища. Идентификационный токен устанавливается таким же, как токен доступа. Это настраивается adal.js, когда я пытаюсь аутентифицировать.login, что кажется неверным. Я не понимаю, почему access_token даже установлен, если это может означать что-то еще. Что такое токен-делегат?   -  person darewreck    schedule 26.07.2017
comment
Позвольте нам продолжить это обсуждение в чате.   -  person darewreck    schedule 26.07.2017


Ответы (1)


Проверить токен нужно через запрос. Например, вы можете проверить это через инструменты разработчика - вкладка Сеть (Chrome, F12).

И, судя по токену и коду, конфигурация кажется неверной. Ведь endpoints - это набор {Endpoint-ResourceId}, используемый для автоматического присоединения токенов в вызовах webApi.

Вы можете использовать конфигурацию, как показано ниже:

 window.config = {
        instance: 'https://login.microsoftonline.com/',
        tenant: <insert tenant>,
        clientId: <insert clientid>,
        postLogoutRedirectUri: window.location.origin,
        cacheLocation: 'localStorage', // enable this for IE, as sessionStorage does not work for localhost.
        endpoints: {
            "https://analysis.windows.net/powerbi/api": "https://api.powerbi.com",

        }
    };

Более подробную информацию об этой библиотеке вы можете найти по этой ссылке.

person Fei Xue - MSFT    schedule 26.07.2017
comment
спасибо, я посмотрю и попробую. документация относится к использованию с библиотекой angular. Я использую приложение для реагирования, поэтому могу использовать только adal.js - person darewreck; 26.07.2017