Resurser och omfång

Microsofts identitetsplattform använder en omfångscentrerad modell för att komma åt resurser. Här refererar en resurs till alla program som kan vara mottagare av en åtkomsttoken (till exempel MS Graph API eller ditt eget webb-API) och ett omfång (även kallat "behörighet") refererar till alla aspekter av en resurs som en åtkomsttoken beviljar rättigheter.

Åtkomsttokenbegäranden i MSAL.js är avsedda att vara per resurs per omfång. Det innebär att en åtkomsttoken som har begärts för resurs A med omfånget scp1:

  • kan inte användas för åtkomst till resurs A med omfång scp2, och,
  • kan inte användas för åtkomst till resurs B i något omfång.

Den avsedda mottagaren av en åtkomsttoken representeras av anspråket aud . Om värdet för anspråket aud inte matchar resursens APP-ID-URI bör token betraktas som ogiltig. På samma sätt representeras de behörigheter som en åtkomsttoken beviljar av anspråket scp . Mer information finns i Åtkomsttokenanspråk .

Standardomfång

Som standard lägger MSAL.js till omfången openidoch profileoffline_access i varje begäran. Dessa omfång krävs för att ta emot en uppdateringstoken och de id-tokenanspråk som används för att fylla kontoobjektet med användarens information.

Arbeta med flera resurser

När du måste komma åt flera resurser initierar du en separat tokenbegäran för var och en:

// "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" ]
});

Tänk på att du kan begära flera omfång för samma resurs (t.ex. User.Readoch User.WriteCalendar.Read för MS Graph API).

const graphToken = await msalInstance.acquireTokenSilent({
     scopes: [ "User.Read", "User.Write", "Calendar.Read" ] // all MS Graph API scopes
});

Om du felaktigt skickar flera resurser i din tokenbegäran utfärdas den token som du får endast för den första resursen.

// 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" ]
});

I Microsoft Entra ID kallas de omfång (behörigheter) som anges direkt för programregistreringen statiska omfång. Andra omfång som endast definieras i koden kallas dynamiska omfång. Detta påverkar inloggningsmetoderna (dvs. loginPopup, loginRedirect) och acquireToken (dvs. acquireTokenPopup, acquireTokenRedirect, acquireTokenSilent) förMSAL.js. Tänk på att:

 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);

I kodfragmentet ovan uppmanas användaren att ge sitt medgivande när de autentiserar och tar emot en ID-token och en åtkomsttoken med omfånget User.Read. Senare, om de begär en åtkomsttoken för User.Read, kommer de inte att bli ombedda att ge sitt medgivande igen (med andra ord kan de hämta en token tyst).

Å andra sidan har användaren inte samtyckt till Mail.Read i autentiseringssteget, och uppmanas därför att ge sitt medgivande när en åtkomsttoken begärs för Mail.Read omfång. Den mottagna token innehåller alla tidigare medgivande omfång (för den specifika resursen), därav termen inkrementellt medgivande.

Överväg ett något annorlunda fall:

 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);

I kodfragmentet ovan får användaren endast en User.Read för api://<myCustomApiClientId>/My.Scope, även om användaren samtycker till både och omfång, i enlighet med principen per resurs per omfång. Men eftersom de redan har samtyckt till api://<myCustomApiClientId>/My.Scopekan de hämta en åtkomsttoken för den resursen/omfånget tyst senare.

I Microsoft Entra ID lever medgivandet längre än programmets livslängd. Det innebär att när du begär en åtkomsttoken för en resurs returneras alla omfång som du tidigare har samtyckt till för den resursen, oavsett vilket omfång som begärdes vid den tidpunkten. Om du med andra ord samtycker till User.Read och Mail.Read idag och kör en ny instans av din applikation imorgon där du endast begär en åtkomsttoken för User.Read, får du fortfarande en token utfärdad för bådeUser.Read och Mail.Read. Mer information finns i Behörigheter och medgivande.