Отсутствует имя участника-пользователя в заявке с использованием конечной точки версии 2.0

Я создал проект, подобный следующему примеру от Microsoft, где у меня есть собственное приложение, запрашивающее доступ к веб-API с использованием конечной точки v2.0: https://github.com/azureadquickstarts/appmodelv2-nativeclient-dotnet

Мне удалось успешно войти в AAD, используя учетную запись, зарегистрированную в этом AAD, а не учетную запись Microsoft. Я получил претензию, однако она не содержит ни сообщения, ни электронного письма. Я использую jwt.ms для анализа претензии, и это информация, которую я получаю из претензии:

{
   "typ": "JWT",
   "alg": "RS256",
   "kid": "1LTMzakihiRla_8z2BEJVXeWMqo"
}.{
   "aud": "Client ID/ App ID",
   "iss": "https://login.microsoftonline.com/tenantid/v2.0",
   "iat": 1534758037,
   "nbf": 1534758037,
   "exp": 1534761937,
   "aio": "ATQAy/8IAAAA+PZj+5vnrUwDfqTTKNBDcy0Tl7rOztkxzrb9YWXHVlevKwrlsGBP/gYAvL4bwr2G",
   "azp": "Client ID/ App ID",
   "azpacr": "0",
   "e_exp": 262800,
   "name": "xxx yyy",
   "oid": "9cc37e1d-0490-4cf4-9bb8-c872899dee91",
   "preferred_username": "[email protected]",
   "scp": "access_as_user",
   "sub": "2l0nasrd8QbBpiEu1RGLFCavj3SzTzizIgmKAiMbdU0",
   "tid": "tenantid",
   "uti": "HG2cIi_MGUyBxBl6MzFPAA",
   "ver": "2.0"
}.[Signature]

Я не могу понять, почему я не получаю UPN в заявке. Буду очень признателен за любую помощь!


person sc1234    schedule 20.08.2018    source источник
comment
Какие области вы указываете при аутентификации пользователя?   -  person juunas    schedule 20.08.2018
comment
Я использую область по умолчанию: access_as_user   -  person sc1234    schedule 20.08.2018
comment
Не могли бы вы попробовать добавить openid и profile в области видимости? Не уверен, добавляет ли он их по умолчанию, но v2 не возвращает все пользовательские данные, если вы этого не попросите.   -  person juunas    schedule 20.08.2018


Ответы (2)


Убедитесь, что вы также запрашиваете области openid и profile. Информацию о том, какие области предоставляют и какую информацию в отдельных претензиях, можно найти в документации здесь с некоторой базовой обзорной информацией здесь Я скачал образец, на который вы ссылались. В файле App.config я изменил ключ области действия на / access_as_user, адрес электронной почты профиля openid "/> и запустил его код. Это привело к получению утверждения primary_username -" Основное имя пользователя, которое представляет пользователя в конечной точке v2.0. Это может быть адрес электронной почты, номер телефона или общее имя пользователя без определенного формата. Его значение непостоянно и со временем может меняться. Для получения этого утверждения требуется область профиля. "Области openid, profile и email являются частью хорошо известных областей в конечных точках V2, обсуждаемых в документация разработчика Azure AD. Чтобы просмотреть эти хорошо известные области, перейдите по URL-адресу:

https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration

Где {tenant} можно заменить на common = Пользователи с личной учетной записью Microsoft и рабочей или учебной учетной записью из Azure Active Directory (Azure AD) могут войти в приложение. организации = Только пользователи с рабочими или учебными учетными записями из Azure AD могут войти в приложение. потребители = Только пользователи с личной учетной записью Microsoft могут войти в приложение. tenantGUID или tenantName = (ваш конкретный идентификатор или имя клиента Azure AD - например, contoso.onmicrosoft.com) пользователи одного клиента могут получить доступ к приложению. Можно использовать либо понятное доменное имя клиента Azure AD, либо идентификатор GUID клиента.

Перейдя по URL-адресу https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration, вы получите JSON, который показывает эти области, доступные там в разделе scopes_supported:

"scopes_supported": 
[
  "openid",
  "profile",
  "email",
  "offline_access"
],

Эти четыре области являются специальными областями для конечной точки v2, и поэтому, когда вы запрашиваете их, вам не нужно видеть, к какому приложению или принципалу службы эти области обращаются. Они являются глобальными в некотором смысле для конечной точки v2, поэтому, когда вы запрашиваете их, вы запрашиваете их, поскольку openid profile email offline_access идентификатор приложения не должен использоваться для этих областей.

person Louis Simonetti III    schedule 20.08.2018
comment
Я добавил openid, профиль и адрес электронной почты на портале регистрации приложений, но получаю то же требование. Я добавил области в веб-api, и я также попытался добавить области в разрешениях Microsoft Graph. - person sc1234; 20.08.2018
comment
Как вы вызываете конечную точку авторизации? Это SDK? - person Louis Simonetti III; 20.08.2018
comment
Это код, используемый для получения токена: app = new PublicClientApplication (clientId, login.microsoftonline .com / common / v2.0, TokenCacheHelper.GetUserCache ()); результат = ожидание app.AcquireTokenSilentAsync (Области, app.Users.FirstOrDefault ()); где Scopes = api: // appid / access_as_user api: // appid / openid api: // appid / email - person sc1234; 20.08.2018
comment
Я скачал образец, на который вы ссылались. В файле App.config я изменил ключ области видимости на <add key="TodoListServiceScope" value="api://<api_guid>/access_as_user openid profile email" /> и запустил его код. Это приводит к получению утверждения preferred_username - основного имени пользователя, представляющего пользователя в конечной точке v2.0. Это может быть адрес электронной почты, номер телефона или общее имя пользователя без определенного формата. Его значение непостоянно и со временем может меняться. Для получения этого утверждения требуется объем профиля. - person Louis Simonetti III; 20.08.2018
comment
Я уже получал предпочтительное_имя_пользователя в заявке только с областью видимости access_as_user. Я не знаю, почему он игнорирует остальные прицелы. - person sc1234; 21.08.2018
comment
Я заменил области действия, как вы предложили: ‹add key = TodoListServiceScope value = api: // appid / access_as_user адрес электронной почты профиля openid /›, но я все еще получаю то же требование. - person sc1234; 21.08.2018
comment
что сводится к supported claims в версии 2.0, доступной в известном URL https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration: "claims_supported": [ "sub", "iss", "cloud_instance_name", "cloud_instance_host_name", "cloud_graph_host_name", "msgraph_host", "aud", "exp", "iat", "auth_time", "acr", "nonce", "preferred_username", "name", "tid", "ver", "at_hash", "c_hash", "email" ], - person Louis Simonetti III; 21.08.2018
comment
preferred_username - это OpenID Connect стандарт, который Microsoft использует в конечной точке v2. Стандартные претензии OpenID Connect - person Louis Simonetti III; 21.08.2018
comment
Спасибо за ваш ответ. Боюсь, что имя предпочтительного_пользователя не уникально, поэтому я не могу использовать его в моем случае. Из того, что я прочитал, я думаю, мне нужно будет сделать запрос к api графика, чтобы получить upn, но я не могу найти подходящий способ сделать это. Вы знаете, как этого добиться? - person sc1234; 22.08.2018
comment
Спасибо за всю эту информацию, она полезна, но даже после добавления ['user.read', 'openid', 'profile'] я все еще не могу получить основное имя пользователя (upn). - person SSH This; 26.05.2020
comment
@SSHTВы обновили манифест приложения, чтобы он принимал токены версии 2? Кроме того, с момента публикации этого поста теперь доступны необязательные претензии. Доступны новые функции и необязательные претензии. на сайте Документов здесь - person Louis Simonetti III; 26.05.2020

Вам необходимо сделать запрос явно для UPN и электронной почты. В конечной точке v1.0 они возвращаются по умолчанию, но поскольку v2.0 требовал токенов меньшего размера, они сделали это необязательным. Пройдите по следующим ссылкам, и, надеюсь, ваша проблема будет решена. Почему вам нужно запрашивать UPN и заявки по электронной почте https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims Как добавить дополнительные утверждения в манифест приложения https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-app-manifest

person Fizza Khorasany    schedule 28.08.2019