Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
платформа удостоверений Майкрософт использует модель, ориентированную на область, для доступа к ресурсам. Здесь ресурс ссылается на любое приложение, которое может быть получателем маркера доступа (например, MS API Graph или собственного веб-API), а область (aka "разрешение") ссылается на любой аспект ресурса, который маркер доступа предоставляет права.
Запросы токена доступа в MSAL.js рассчитаны на модель «один ресурс — одна область (или набор областей)». Это означает, что маркер доступа запрашивается для ресурса A с областью действия scp1:
- невозможно использовать для доступа к ресурсу A с областью действия
scp2, и - невозможно использовать для доступа к ресурсу B с любой областью действия.
Предполагаемый получатель маркера доступа представлен aud утверждением. В случае, если значение aud утверждения не соответствует URI идентификатора приложения ресурса, маркер должен считаться недопустимым. Аналогичным образом, разрешения, предоставляемые маркером доступа , представлены утверждением scp . Дополнительные сведения см. в разделе Утверждения токена доступа.
Области по умолчанию
По умолчанию MSAL.js будет добавлять области действия openid, profile и offline_access в каждый запрос. Эти области действия необходимы для получения маркера обновления и утверждений из токена идентификации, используемых для заполнения объекта учётной записи сведениями о пользователе.
Работа с несколькими ресурсами
При доступе к нескольким ресурсам инициируйте отдельный запрос токена для каждого из них:
// "User.Read" stands as shorthand for "graph.microsoft.com/User.Read"
const graphToken = await msalInstance.acquireTokenSilent({
scopes: [ "User.Read" ]
});
const customApiToken = await msalInstance.acquireTokenSilent({
scopes: [ "api://<myCustomApiClientId>/My.Scope" ]
});
Помните, что можно запросить несколько областей для одного ресурса (напримерUser.Read, User.Write для Calendar.ReadMS API Graph).
const graphToken = await msalInstance.acquireTokenSilent({
scopes: [ "User.Read", "User.Write", "Calendar.Read" ] // all MS Graph API scopes
});
Если вы ошибочно передаете несколько ресурсов в запросе маркера, полученный маркер будет выдан только для первого ресурса.
// you will only receive a token for MS GRAPH API's "User.Read" scope here
const myToken = await msalInstance.acquireTokenSilent({
scopes: [ "User.Read", "api://<myCustomApiClientId>/My.Scope" ]
});
Динамические области действия и поэтапное согласие
В Microsoft Entra ID области (разрешения), заданные непосредственно в регистрации приложения, называются статическими областями. Другие области, определенные только в коде, называются динамическими областями. Это влияет на методы login (т. е. loginPopup, loginRedirect) и acquireToken (т. е. acquireTokenPopup, acquireTokenRedirect, acquireTokenSilent) в MSAL.js. Рассмотрите:
const loginRequest = {
scopes: [ "openid", "profile", "User.Read" ]
};
const tokenRequest = {
scopes: [ "Mail.Read" ]
};
// will return an ID Token and an Access Token with scopes: "openid", "profile" and "User.Read"
msalInstance.loginPopup(loginRequest);
// will fail and fallback to an interactive method prompting a consent screen
// after consent, the received token will be issued for "openid", "profile" ,"User.Read" and "Mail.Read" combined
msalInstance.acquireTokenSilent(tokenRequest);
В приведенном выше фрагменте кода пользователю будет предложено предоставить согласие после проверки подлинности и получения маркера идентификатора и маркера доступа с областью User.Read. Позже, если они запросят токен доступа для User.Read, у них снова не запросят согласие (иными словами, они смогут получить токен без вмешательства пользователя).
С другой стороны, пользователь не дал согласия на Mail.Read на этапе аутентификации, поэтому у него запросят согласие при запросе токена доступа для области действия Mail.Read. Полученный токен будет содержать все области доступа, на которые ранее было дано согласие (для этого конкретного ресурса), отсюда и термин инкрементальное согласие.
Рассмотрим немного другой случай:
const loginRequest = {
scopes: [ "openid", "profile", "User.Read" ],
extraScopesToConsent: [ "api://<myCustomApiClientId>/My.Scope"]
};
const tokenRequest = {
scopes: [ "Mail.Read" ]
};
const anotherTokenRequest = {
scopes: [ "api://<myCustomApiClientId>/My.Scope" ]
}
// will return an ID Token and an Access Token with scopes: "openid", "profile" and "User.Read"
msalInstance.loginPopup(loginRequest);
// will fail with InteractionRequiredError due to lack of consent for "Mail.Read" scope. You should fallback to an interactive method in this case.
msalInstance.acquireTokenSilent(tokenRequest);
// will succeed and return an Access Token with scope "api://<myCustomApiClientId>/My.Scope"
msalInstance.acquireTokenSilent(anotherTokenRequest);
В приведенном выше фрагменте кода, несмотря на то что пользователь соглашается на обе области User.Read и api://<myCustomApiClientId>/My.Scope, он получит только Access Token для MS API Graph в соответствии с принципом per-resource-per-scope(s). Однако, поскольку они уже дали согласие на api://<myCustomApiClientId>/My.Scope, впоследствии они могут без участия пользователя получить маркер доступа для этого ресурса или области действия.
Время существования согласия
В Microsoft Entra ID срок действия согласия не превышает время существования приложения. Это означает, что при запросе маркера доступа для ресурса будут возвращены все области, которые вы ранее предоставили этому ресурсу, независимо от того, какая область была запрошена в то время. Другими словами, если вы даете согласие User.Read и Mail.Read сегодня и запускаете новый экземпляр приложения завтра, запрашивая маркер доступаUser.Read только, вы по-прежнему получите маркер, выданный для обоихUser.Read и Mail.Read. Дополнительные сведения см. в разделе "Разрешения и согласие".