Токены, возвращенные MSAL. JS не содержат ни одного из дополнительных требований - PullRequest
0 голосов
/ 24 марта 2020

Настройка выглядит следующим образом:

  • Веб-приложение SPA, которое подключается к внутреннему API. Предполагается войти в систему пользователя, запросить access_token к API и использовать его для всех запросов. Назовите его Приложение .
  • Backend API, которое должно получать access_tokens и авторизовать пользователей на основании содержащейся в нем заявки groups. Назовите его API .

Конфигурация на стороне Azure AD:

  • Приложение настроено на перенаправление и получил API разрешение на API (область действия API.User).
  • Серверная часть предоставляет область действия API.User и авторизует приложение как авторизованное клиентское приложение.

Теперь, чтобы получить groups утверждение, что я добавил его в конфигурацию токена в обоих приложениях. Так как это не сработало, я пошел и добавил еще несколько необязательных претензий, чтобы посмотреть, возвращены ли какие-либо из них. Они не. Соответствующие части манифеста выглядят следующим образом:

"groupMembershipClaims": "All",
"oauth2AllowIdTokenImplicitFlow": true,
"oauth2AllowImplicitFlow": true,
"optionalClaims": {
        "idToken": [
            {
                "name": "email",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "groups",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "nickname",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "given_name",
                "source": null,
                "essential": false,
                "additionalProperties": []
            }
        ],
        "accessToken": [
            {
                "name": "email",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "groups",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "nickname",
                "source": null,
                "essential": false,
                "additionalProperties": []
            },
            {
                "name": "given_name",
                "source": null,
                "essential": false,
                "additionalProperties": []
            }
        ],
        "saml2Token": [
            {
                "name": "groups",
                "source": null,
                "essential": false,
                "additionalProperties": []
            }
        ]
}

Обе регистрации приложений настроены одинаково (с учетом вышеуказанных значений).

Код внешнего интерфейса, получающий маркер:

    msalInstance = new Msal.UserAgentApplication(
        {
          auth: {
            clientId: <the Application's client id>
          }
        }
    );

    this.msalInstance.handleRedirectCallback((error, response) => {
         console.warn("In handleRedirectCallback");
         console.warn(JSON.stringify(error));
         console.warn(JSON.stringify(response));
      });

      if (this.msalInstance.getAccount()) {
        const request = {
          scopes: ['api://<the API client id>/API.User']
        }
        this.msalInstance.acquireTokenSilent(request)
          .then(response => {
            console.warn("In acquireTokenSilent then");
            console.warn(JSON.stringify(response));
          })
          .catch(err => {
            if (err.name === 'InteractionRequiredAuthError') {
              return this.msalInstance.acquireTokenRedirect(request);
            }
          });
      }
      else {
        const request = {
          scopes: ['user.read', 'email', 'openid', 'profile']
        };

        this.msalInstance.loginRedirect(request);
      }

Я явно делаю что-то не так, так как все access_tokens и id_tokens имеют одинаковую компоновку, полностью независимую от любых изменений, которые я делаю при регистрации приложений или request.scopes. Я вижу, что в запросе MSAL есть поле claimsRequest, но оно недокументировано, и я не знаю, что там нужно поместить. Документы MSDN звучат так, как будто все, что мне нужно, - это настроить регистрацию приложения, и заявки будут добавлены к полученным токенам, но это явно не так.

Есть ли что-то еще, что я должен настроить, чтобы получить groups претензию?

РЕДАКТИРОВАТЬ:

Пример макета id_token, который я получаю:

{
  "aud": "api://<the Application client id>",
  "iss": "https://login.microsoftonline.com/<the Tenant id>/",
  "iat": 1585052362,
  "nbf": 1585052362,
  "exp": 1585056262,
  "aio": <Azure AD opaque string>,
  "given_name": "<My first name>",
  "hasgroups": "true",
  "name": "<My account name>",
  "nonce": <some guid>,
  "oid": "<my account OID>",
  "preferred_username": "<my email>",
  "sub": <...>,
  "tid": "<the tenant id>",
  "uti": <Azure AD opaque string>,
  "ver": "2.0"
}

пример access_token I ' м получаю:

{
  "aud": "api://<the Application client id>",
  "iss": "https://sts.windows.net/<the Tenant id>/",
  "iat": 1585052365,
  "nbf": 1585052365,
  "exp": 1585056265,
  "acr": "1",
  "aio": <Azure AD opaque string>,
  "appid": "<the Application client id>",
  "appidacr": "0",
  "family_name": <my last name>,
  "given_name": <my first name>,
  "hasgroups": "true",
  "ipaddr": <my ip addr>,
  "name": <my account name>,
  "oid": <my account oid>,
  "onprem_sid": <not sure what this is, but some identifier>,
  "scp": "API.User",
  "sub": <...>,
  "tid": <the tenant ID>,
  "unique_name": <my email>,
  "upn": <my email>,
  "uti": <Azure AD opaque string>,
  "ver": "1.0"
}

1 Ответ

1 голос
/ 24 марта 2020

Поскольку вы отметили, что получаете утверждение hasgroups, это означает, что группы не были включены в токен, скорее всего, из-за ограничений по размеру. Претензия задокументирована здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens.

Соответствующая цитата оттуда:

Если присутствует, всегда верно, означая, что пользователь находится по крайней мере в одном группа. Используется вместо заявки групп для JWT в неявных потоках предоставления, если заявка полной группы расширит фрагмент URI за пределы длины URL (в настоящее время 6 или более групп)

Таким образом, 5 является максимальным значением в неявный поток. Максимум 200, например, для потока кода авторизации.

...