Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
MSAL Angular biedt een Interceptor klasse die automatisch tokens verkrijgt voor uitgaande aanvragen die gebruikmaken van de Angular-client http voor bekende beveiligde resources. Dit document bevat meer informatie over het configureren en gebruiken van de MsalInterceptor.
Hoewel we aanbevelen om MsalInterceptor te gebruiken in plaats van de acquireTokenSilent API rechtstreeks te gebruiken, moet u er rekening mee houden dat het gebruik van de MsalInterceptor optioneel is. U kunt in plaats daarvan expliciet tokens verkrijgen met behulp van de acquireToken-API's.
Houd er rekening mee dat het MsalInterceptor voor uw gemak is voorzien en mogelijk niet in alle gebruiksscenario's past. We raden u aan uw eigen interceptor te schrijven als u specifieke vereisten hebt waarvoor de MsalInterceptor geen oplossing biedt.
Configuratie
Het configureren van de MsalInterceptor in de app.module.ts
De MsalInterceptor kan worden toegevoegd aan uw toepassing als provider in de app.module.ts, met de configuratie ervan. De import neemt een exemplaar van MSAL en twee Angular-specifieke configuratieobjecten in beslag. Het derde argument is een MsalInterceptorConfiguration object dat de waarden voor interactionType, a protectedResourceMapen een optioneel authRequestobject bevat.
Uw configuratie ziet er mogelijk uit zoals hieronder. Bekijk ons configuratiedocumenten op andere manieren om MSAL Angular voor uw app te configureren.
import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS, HttpClientModule } from "@angular/common/http";
import { AppComponent } from './app.component';
import { MsalModule, MsalRedirectComponent, MsalGuard, MsalInterceptor } from '@azure/msal-angular'; // Import MsalInterceptor
import { InteractionType, PublicClientApplication } from '@azure/msal-browser';
@NgModule({
declarations: [
AppComponent,
],
imports: [
MsalModule.forRoot( new PublicClientApplication({
// MSAL Configuration
}), {
// MSAL Guard Configuration
}, {
// MSAL Interceptor Configurations
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
['Enter_the_Graph_Endpoint_Here/v1.0/me', ['user.read']]
])
})
],
providers: [
{
provide: HTTP_INTERCEPTORS, // Provides as HTTP Interceptor
useClass: MsalInterceptor,
multi: true
},
MsalGuard
],
bootstrap: [AppComponent, MsalRedirectComponent]
})
export class AppModule { }
Interactietype
Hoewel de MsalInterceptor is ontworpen om tokens zonder gebruikersinteractie te verkrijgen, schakelt deze over op het interactief verkrijgen van tokens als een aanvraag zonder gebruikersinteractie mislukt. De InteractionType kan worden geïmporteerd uit @azure/msal-browser en ingesteld op Popup of Redirect.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
['Enter_the_Graph_Endpoint_Here/v1.0/me', ['user.read']]
])
}
Overzicht van beveiligde resources
De beveiligde resources en de bijbehorende scopes worden opgegeven als een protectedResourceMap in de configuratie van MsalInterceptor.
De URL's die u in de protectedResourceMap verzameling opgeeft, zijn hoofdlettergevoelig. Voeg voor elke resource de scopes toe die worden aangevraagd om in het toegangstoken te worden opgenomen.
Voorbeeld:
-
["user.read"]voor Microsoft Graph -
["<Application ID URL>/scope"]voor aangepaste web-API's (dat wil zeggen,api://<Application ID>/access_as_user)
Scopes kunnen voor een resource op de volgende manieren worden gespecificeerd:
- Een array van scopes die aan elke HTTP-aanvraag voor die resource worden toegevoegd, ongeacht de HTTP-methode.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map<string, Array<string> | null>([
["https://graph.microsoft.com/v1.0/me", ["user.read", "profile"]],
["https://myapplication.com/user/*", ["customscope.read"]]
]),
}
- Een array van
ProtectedResourceScopes, die alleen scopes koppelt voor specifieke HTTP-methoden.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map<string, Array<string|ProtectedResourceScopes> | null>([
["https://graph.microsoft.com/v1.0/me", ["user.read"]],
["http://myapplication.com", [
{
httpMethod: "POST",
scopes: ["write.scope"]
}
]]
])
}
Houd er rekening mee dat scopes voor een resource kunnen bestaan uit een combinatie van tekenreeksen en ProtectedResourceScopes. In het onderstaande voorbeeld heeft een GET verzoek de scopes "all.scope" en "read.scope", terwijl een PUT verzoek alleen "all.scope" zou hebben.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map<string, Array<string|ProtectedResourceScopes> | null>([
["http://myapplication.com", [
"all.scope",
{
httpMethod: "GET",
scopes: ["read.scope"]
},
{
httpMethod: "POST",
scopes: ["info.scope"]
}
]]
])
}
- Een bereikwaarde van
null, waarmee wordt aangegeven dat een resource niet moet worden beveiligd en geen tokens worden opgehaald. Resources die niet in deprotectedResourceMapresources zijn opgenomen, worden standaard niet beveiligd. Het opgeven van een bepaalde resource die niet moet worden beveiligd, kan handig zijn wanneer sommige routes op een resource moeten worden beveiligd en sommige niet. Houd er rekening mee dat de volgorde inprotectedResourceMapvan belang is, dus null-resource moet vóór vergelijkbare basis-URL's of jokertekens worden geplaatst.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map<string, Array<string> | null>([
["https://graph.microsoft.com/v1.0/me", ["user.read", "profile"]],
["https://myapplication.com/unprotected", null],
["https://myapplication.com/unprotected/post", [{ httpMethod: 'POST', scopes: null }]],
["https://myapplication.com", ["custom.scope"]]
]),
}
Andere zaken om op te letten met betrekking tot de protectedResourceMap:
-
Jokertekens:
protectedResourceMapondersteunt het gebruik van*jokertekens. Wanneer u jokertekens gebruikt, als er meerdere overeenkomende vermeldingen worden gevonden in deprotectedResourceMap, wordt de eerste gevonden overeenkomst gebruikt (op basis van de volgorde van deprotectedResourceMap). -
Relatieve paden: als er relatieve resourcepaden in uw toepassing zijn, moet u mogelijk het relatieve pad opgeven in de
protectedResourceMap. Dit geldt ook voor problemen die zich kunnen voordoen met ngx-translate. Houd er rekening mee dat het relatieve pad in uwprotectedResourceMap, afhankelijk van uw app, al dan niet een slash aan het begin nodig heeft en dat u mogelijk beide varianten moet proberen.
Exacte overeenkomst (strictMatching)
In msal-angular v5 maakt het URL-onderdeelpatroon voor protectedResourceMap vermeldingen standaard gebruik van strikte overeenkomende semantiek. Dit gedrag wordt bepaald door het strictMatching veld in MsalInterceptorConfiguration het veld.
Important
Als uw toepassing dynamisch sleutels instelt protectedResourceMap (bijvoorbeeld vanuit omgevingsbestanden, APP_INITIALIZERof JSON-configuratie) en deze sleutels basis-URL's zonder subpaden of jokertekens zijn, kan strikte overeenkomsten op de achtergrond verhinderen dat de Authorization header wordt gekoppeld. Dit resulteert in 401-fouten zonder build-time-fout en geen waarschuwing per aanvraag: slechts een eenmalige initialisatiewaarschuwing als strictMatching deze niet expliciet is geconfigureerd. Zie Problemen met strikte overeenkomsten oplossen voor meer informatie.
Welke strikte overeenkomende wijzigingen
| Gedrag | Verouderd (strictMatching: false) |
Strikt (standaard in v5) |
|---|---|---|
| Metacharacter ontsnappen |
. en andere regex-metatekens worden niet van een escape voorzien; ze werken als regex-operatoren |
Alle metatekens (inclusief .) worden behandeld als letterlijke tekens |
| Verankering | Patroon kan overal in de tekenreeks overeenkomen | Patroon moet overeenkomen met de volledige tekenreeks (^…$) |
Host-jokerteken (*) |
* komt overeen met een willekeurige tekenreeks, inclusief . |
* komt overeen met elke tekenreeks die . niet bevat (jokertekens blijven binnen één DNS-label) |
Pad/zoek-/hash-jokerteken (*) |
* komt overeen met een willekeurige tekenreeks |
* komt overeen met een willekeurige tekenreeks (ongewijzigd) |
? Teken |
Doorgegeven aan de onderliggende regex | Behandeld als een letterlijk teken? (scheidingsteken in de queryreeks van een URL, geen wildcard) |
Met strikte overeenkomst (de v5-standaard):
- Een patroon zoals
*.contoso.comkomt overeen metapp.contoso.com, maar nieta.b.contoso.com(een jokerteken kan geen puntscheidingstekens overspannen). - Een patroon zoals
https://graph.microsoft.com/v1.0/mekomt alleen overeen met die exacte URL.
Bekende foutpatronen
De volgende protectedResourceMap sleutelpatronen werken bij legacy-matching, maar falen stilzwijgend bij strikte matching:
| Sleutelpatroon | URL voor uitgaande aanvraag | Resultaat bij exacte overeenkomst | Repareren |
|---|---|---|---|
https://api.example.com |
https://api.example.com/v1/users |
Geen overeenkomst: sleutel wordt omgezet in pad /, aanvraag heeft pad /v1/users |
https://api.example.com/* |
https://api.example.com/ |
https://api.example.com/v1/users |
Geen overeenkomst — afsluitende slash verankert het patroon exact aan / |
https://api.example.com/* |
environment.apiConfig.uri (bijvoorbeeld, https://api.example.com) |
https://api.example.com/v1/users |
Geen overeenkomst , hetzelfde als hierboven | `${environment.apiConfig.uri}/*` |
Standaardgedrag in v5 (geen configuratie nodig)
Strikte overeenkomsten zijn standaard ingeschakeld. Er is geen aanvullende configuratie vereist:
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
["https://*.contoso.com/api", ["contoso.scope"]],
["https://graph.microsoft.com/v1.0/me", ["user.read"]]
])
// strictMatching defaults to true in v5
}
Afmelden voor verouderde matching
Als uw patronen afhankelijk zijn van de lossere matching uit v4, kunt u strictMatching: false instellen om het oude gedrag tijdelijk te behouden:
Note
Verouderde overeenkomsten (strictMatching: false) zijn beschikbaar voor compatibiliteit met eerdere versies en kunnen worden verwijderd in een toekomstige primaire versie. We raden u aan uw protectedResourceMap-patronen bij te werken zodat ze met strikte overeenkomst werken.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
["https://*.contoso.com/api", ["contoso.scope"]],
["https://graph.microsoft.com/v1.0/me", ["user.read"]]
]),
strictMatching: false // Use legacy matching for backwards compatibility
}
Richtlijnen voor omgevingsgestuurde configuraties
Als uw protectedResourceMap sleutels verwijzen naar Angular-waarden environment (bijvoorbeeld environment.apiConfig.uri), controleert u of deze waarden exacte paden zijn (bijvoorbeeld https://graph.microsoft.com/v1.0/me) of lege basis-URL's (bijvoorbeeld https://api.example.com). Exacte paden werken goed met strikte matching en vereisen geen speciale afhandeling:
export function MSALInterceptorConfigFactory(): MsalInterceptorConfiguration {
const protectedResourceMap = new Map<string, Array<string>>();
// environment.apiConfig.uri is an exact path (e.g. "https://graph.microsoft.com/v1.0/me")
// — strict matching works correctly
protectedResourceMap.set(environment.apiConfig.uri, environment.apiConfig.scopes);
return {
interactionType: InteractionType.Redirect,
protectedResourceMap,
};
}
Als de omgevingswaarde een lege basis-URL is en u moet overeenkomen met subpaden, voegt u een /* jokerteken toe:
// environment.apiConfig.uri is a base URL (e.g. "https://api.example.com")
// Append /* to match all sub-paths
protectedResourceMap.set(`${environment.apiConfig.uri}/*`, environment.apiConfig.scopes);
Voor echt dynamische configuraties waarbij de vorm van de sleutels niet bekend is tijdens het bouwen (bijvoorbeeld APP_INITIALIZER, JSON geladen via fetch of platformBrowserDynamic), stel strictMatching: false in als een veilige tijdelijke standaardwaarde. Zie Oplossingsopties: optie B voor een codevoorbeeld.
Problemen met strikte overeenkomsten oplossen
Symptomen
-
API-aanvragen retourneren 401 Niet geautoriseerd na een upgrade naar
@azure/msal-angularv5 (of tussen v5 secundaire versies, zoals 5.0.x → 5.1.x). - De
Authorization: Bearer <token>header ontbreekt in uitgaande HTTP-aanvragen. - Er worden geen fouten tijdens het buildproces of tijdens runtime gemeld — de mislukking verloopt stilzwijgend.
- Het probleem wordt mogelijk alleen weergegeven in bepaalde omgevingen (bijvoorbeeld fasering/productie), waarbij de API-basis-URL verschilt van ontwikkeling.
Herstelopties
Optie A: Sleutels bijwerken om te werken met strikte overeenkomsten (aanbevolen)
Werk uw protectedResourceMap sleutels bij om exacte paden of jokertekens te gebruiken die overeenkomen onder strikte overeenkomende regels. Deze benadering heeft de voorkeur omdat strikte overeenkomsten veiliger en voorspelbaarder zijn:
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
// Exact path — matches only this URL
["https://graph.microsoft.com/v1.0/me", ["user.read"]],
// Wildcard — matches all sub-paths of the API
["https://api.example.com/v1/*", ["api.scope"]]
])
// strictMatching defaults to true — no need to set it
}
Optie B: instellen strictMatching: false (terugval voor dynamische configuraties)
Als uw protectedResourceMap sleutels dynamisch worden geladen tijdens runtime (bijvoorbeeld van APP_INITIALIZER, JSON-configuratie of platformBrowserDynamic) en u niet kunt garanderen dat ze exacte paden of jokertekens bevatten, ingesteld strictMatching: false als een tijdelijke veilige standaardwaarde:
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
[config.apiUri, config.apiScopes]
]),
// Dynamic keys may be base URLs without wildcards.
// Remove once keys are migrated to exact paths or wildcard patterns.
strictMatching: false
}
Note
Verouderde overeenkomsten (strictMatching: false) zijn beschikbaar voor compatibiliteit met eerdere versies en kunnen worden verwijderd in een toekomstige primaire versie.
Runtime-waarschuwing
MsalInterceptor verzendt een eenmalige runtimewaarschuwing via de MSAL-logboekregistratie tijdens de initialisatie wanneer strictMatching deze niet expliciet is geconfigureerd. Als u deze waarschuwing ziet, volgt u de bovenstaande oplossingsopties.
Optionele authRequest
Zie het authRequest voor meer informatie over de optionele MsalInterceptorConfiguration opties die kunnen worden ingesteld in het document.
Wijzigingen van msal-angular v1 in v2
Note
De unprotectedResourceMap in MSAL Angular v1's MsalAngularConfiguration is afgeschaft en werkt niet meer.
-
protectedResourceMapis verplaatst naar hetMsalInterceptorConfigurationobject en kan worden doorgegeven alsMap<string, Array<string|ProtectedResourceScopes>>.MsalAngularConfigurationis afgeschaft en werkt niet meer. - Het rootdomein in de
protectedResourceMapplaatsen om alle routes te beveiligen wordt niet langer ondersteund. Gebruik in plaats daarvan jokertekens.
Zie onze FAQ’s voor meer informatie over het configureren van scopes.