Настройка выглядит следующим образом:
- Веб-приложение 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"
}