администратор не дал согласия на использование приложения Azure AD

Я пытаюсь получить токен из Azure AD из клиентского приложения Python. Я хочу, чтобы пользователи могли беспрепятственно проходить аутентификацию, используя только имя пользователя и пароль (client_id / secret будет встроен в приложение). Я зарегистрировал свое приложение, дал ему все разрешения и нажал кнопку «предоставить разрешения» на новом портале в соответствии с этим сообщением:

Пользователь или администратор не дал согласие на использование приложения - отправьте интерактивный запрос авторизации для этого пользователя и ресурса

Я отправляю сообщение http по адресу:

https://login.microsoftonline.com/{tenant_id}/oauth2/token

со следующими данными:

headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

body = "resource={0}&grant_type=password&username={1}&password={2}&client_id={3}&client_secret={4}&scope=openid".format(app_id_uri,user,password,client_id,client_secret)

Я не могу избавиться от этой ошибки, что бы я ни пытался:

b'{"error":"invalid_grant","error_description":"AADSTS65001: The user or administrator has not consented to use the application with ID \'078c1175-e384-4ac7-9116-efbebda7ccc2\'. Send an interactive authorization request for this user and resource.

Опять же моя цель:

Пользователь вводит пользователя / пароль и больше ничего. Приложение отправляет user / pass / client_id / client_secret, получает токен.


person Progger    schedule 02.01.2017    source источник
comment
Не могли бы вы проверить свои oauth2PermissionGrants с помощью Graph Explorer? Пример здесь: graphexplorer.cloudapp.net/Home/Index/. Узнайте, предоставлен ли объекту-службе вашего приложения надлежащий доступ к ресурсам.   -  person juunas    schedule 02.01.2017
comment
Так что я не на 100% уверен, что я здесь вижу, но когда я вставляю graph.windows.net {my_dir} / oauth2PermissionGrants, я вижу массив значений с тремя принципалами службы в нем, каждый из которых имеет идентификатор клиента, ни один из которых не соответствует идентификатору client_id моего приложения. Угадаете, что это могло быть виновником? Я до сих пор не знаю, как это сделать, если так.   -  person Progger    schedule 02.01.2017
comment
Идентификатор клиента на самом деле является идентификатором объекта субъекта-службы :) Поэтому сначала найдите субъекта-службы из конечной точки servicePrincipals.   -  person juunas    schedule 02.01.2017
comment
хорошо, значит, он там, но как мне узнать, есть ли у него правильный доступ? значение рядом с областью: Directory.ReadWrite.All Directory.Read.All Member.Read.Hidden User.Read User.ReadBasic.All User.Read.All Group.Read.All Group.ReadWrite.All Directory.AccessAsUser.All , ... что, вероятно, является результатом того, что я проверил все, что мог проверить в разрешениях приложения.   -  person Progger    schedule 02.01.2017
comment
Установлен ли тип согласия на AllPrincipals или Principal на oauth2PermissionGrant? Потому что, если это AllPrincipals, это означает, что согласие администратора было дано.   -  person juunas    schedule 02.01.2017
comment
Оно делает. Хм. В получаемом мной сообщении говорится, что нужно выполнить интерактивный запрос, но это именно то, чего я пытаюсь избежать, потому что это приложение на Python без веб-браузера, и я пытаюсь избежать сложностей. Итак, если разрешения верны, есть идеи, почему я вижу ошибку разрешений? Спасибо за вашу помощь.   -  person Progger    schedule 02.01.2017


Ответы (2)


Согласно вашему комментарию:

Сообщение, которое я получаю, требует выполнить интерактивный запрос, но это именно то, чего я пытаюсь избежать, потому что это приложение на Python без веб-браузера, и я пытаюсь избежать сложностей.

Я думаю, вы хотите создать приложение-демон или приложение, которое только приложение интегрируется с Azure AD. Вы можете обратиться к https://graph.microsoft.io/en-us/docs/authorization/app_only для общего введения.

Кроме того, вы можете использовать ADAL для Python для реализации этой функции с помощью легкость. Также вы можете обратиться к client_credentials_sample. py для быстрого начала.

person Gary Liu    schedule 03.01.2017
comment
Так что это сразу же дало мне токен, который я могу использовать для получения информации о пользователе из Graph. Единственная проблема в том, что я не могу понять, как проверить учетные данные пользователя на Graph. Это возможно? В идеале я хотел бы получить токен с использованием кредитов пользователя вместо client_id / secret, но не уверен, возможно ли это. - person Progger; 03.01.2017
comment
Боюсь, вам нужно настроить дополнительную логику для реализации этой функции, если вы не хотите интерактивный запрос. Вы можете использовать api графика, чтобы сопоставить информацию о пользователе с его сертификатом. Например, graph.microsoft.io/en-us /docs/api-reference/v1.0/api/user_get - person Gary Liu; 03.01.2017
comment
Привет, @progger, у тебя есть обновления? Вы решили свою проблему? - person Gary Liu; 13.01.2017
comment
@ gary-liu-msft В итоге я выбрал ADAL для Python. Он отлично работает. Благодарность! - person Progger; 18.01.2017

Вам следует попробовать войти в систему как администратор, чтобы иметь возможность вообще дать согласие на использование приложения на вашем клиенте.

person RasmusW    schedule 02.01.2017
comment
Все это было сделано с использованием учетной записи администратора, поэтому, к сожалению, это не помогло. - person Progger; 02.01.2017