Маркер доступа, полученный с помощью MSAL, не содержит идентификаторы групп

Я хочу включить идентификаторы групп в токен доступа, полученный с помощью 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, содержит идентификаторы групп, но не токен доступа.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы определяете необязательное утверждение, вы говорите «включите идентификаторы групп в токены доступа для этого 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;

Спасибо! Просто небольшое примечание; у моей регистрации приложения уже был URI идентификатора приложения, определенный как https://myapp.mycompany.com . Добавив новую область под названием user_read, а затем добавив ее в разрешения API, а затем изменив код на использование scopes: ["https://myapp.mycompany.com/user_read"], я получаю ожидаемый токен доступа.

robino16 27.09.2023 13:21

Можете ли вы вставить скриншот страницы Expose a API?

Rukmini 27.09.2023 13:22

Другие вопросы по теме

Похожие вопросы