Я хочу включить идентификаторы групп в токен доступа, полученный с помощью MSAL, в моем веб-клиенте React. Я получаю токен доступа с помощью:
const accessToken = await instance.acquireTokenSilent({
scopes: [
"https://graph.windows.net/Group.Read.All",
"https://graph.windows.net/User.Read",
],
account: accounts[0],
})
).accessToken;
Я предоставил приложению разрешение Microsoft Graph API Group.Read.All (delegated) на регистрацию в Azure. Я также добавил groups в качестве необязательного утверждения в Token configuration section. Итак, манифест приложения теперь имеет следующие свойства:
{
"accessTokenAcceptedVersion": 2,
(...)
"groupMembershipClaims": "SecurityGroup",
(...)
"optionalClaims": {
"accessToken": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": []
}
],
},
(...)
}
Я успешно получаю токен доступа с действительной подписью. Токен доступа также включает следующее утверждение:
{
"scp": "Group.Read.All User.Read"
}
, но отсутствует ожидаемое утверждение groups, которое должно включать список идентификаторов групп. Что я настроил неправильно?
Похоже, что id_token, полученный с помощью MSAL, содержит идентификаторы групп, но не токен доступа.





Когда вы определяете необязательное утверждение, вы говорите «включите идентификаторы групп в токены доступа для этого API». Вы получаете токен доступа к API Microsoft Graph, а не к своему API. И они не настраивают включение идентификаторов групп.
Вам необходимо определить область на вкладке «Предоставление API» при регистрации вашего приложения и использовать ее при получении токена доступа. Этот токен будет содержать идентификаторы групп.
Обратите внимание: используя манифест ресурса, токены доступа генерируются не с помощью клиента. Чтобы получить дополнительные утверждения в токене доступа, запросите токен для своего приложения. Обратитесь к этому MsDoc.
https://graph.windows.net/, то это ресурс Microsoft Graph, поэтому токен доступа генерируется для клиента, а не для вашего приложения.Следовательно, чтобы получить идентификаторы групп в токене доступа, Expose an API как показано ниже:

Предоставьте разрешения API:

Теперь я сгенерировал токен доступа, передав область как api://ClientID/test.read
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
scope:api://xxx/test.read
grant_type:authorization_code
redirect_uri:https://jwt.ms
client_secret:ClientSecret
code:code

Когда я декодировал токен доступа, отображаются идентификаторы групп:

Измените свой код, как показано ниже:
const accessToken = await instance.acquireTokenSilent({
scopes: [
"api://ClientID/ScopeName",
],
account: accounts[0],
})
).accessToken;
Можете ли вы вставить скриншот страницы Expose a API?
Спасибо! Просто небольшое примечание; у моей регистрации приложения уже был URI идентификатора приложения, определенный как
https://myapp.mycompany.com. Добавив новую область под названиемuser_read, а затем добавив ее в разрешения API, а затем изменив код на использованиеscopes: ["https://myapp.mycompany.com/user_read"], я получаю ожидаемый токен доступа.