Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
MSAL Angular stellt eine Interceptor Klasse bereit, die automatisch Token für ausgehende Anforderungen abruft, die den Angular-Client http für bekannte geschützte Ressourcen verwenden. Dieses Dokument enthält weitere Informationen zum Konfigurieren und Verwenden von MsalInterceptor.
Wir empfehlen zwar, MsalInterceptor anstelle der acquireTokenSilent-API direkt zu verwenden, bitte beachten Sie jedoch, dass die Verwendung von MsalInterceptor optional ist. Sie können stattdessen Token explizit mithilfe der acquireToken-APIs beziehen.
Bitte beachten Sie, dass dies MsalInterceptor für Ihren Komfort vorgesehen ist und möglicherweise nicht allen Anwendungsfällen entspricht. Wir ermutigen Sie, Ihren eigenen Interceptor zu implementieren, wenn Sie spezifische Anforderungen haben, die von der MsalInterceptor nicht abgedeckt werden.
Configuration
Konfiguration von MsalInterceptor in app.module.ts
Die MsalInterceptor kann Ihrer Anwendung in der app.module.ts als Provider zusammen mit ihrer Konfiguration hinzugefügt werden. Die Importe übernehmen eine Instanz von MSAL sowie zwei Angular-spezifische Konfigurationsobjekte. Das dritte Argument ist ein MsalInterceptorConfiguration Objekt, das die Werte für interactionType, a protectedResourceMapund optional authRequestenthält.
Ihre Konfiguration sieht möglicherweise wie unten aus. Weitere Möglichkeiten zum Konfigurieren von MSAL Angular für Ihre App finden Sie in unserem Konfigurationsdokument .
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 { }
Interaktionstyp
Obwohl MsalInterceptor dafür ausgelegt ist, Token im Hintergrund abzurufen, wird bei einem Fehlschlagen einer Anforderung im Hintergrund auf das interaktive Abrufen von Token zurückgegriffen. Die InteractionType Kann aus @azure/msal-browser importiert und auf Popup oder Redirectfestgelegt werden.
{
interactionType: InteractionType.Redirect,
protectedResourceMap: new Map([
['Enter_the_Graph_Endpoint_Here/v1.0/me', ['user.read']]
])
}
Übersicht geschützter Ressourcen
Die geschützten Ressourcen und die entsprechenden Bereichsangaben werden als protectedResourceMap in der MsalInterceptor-Konfiguration angegeben.
Bei den URLs, die Sie in der protectedResourceMap Auflistung angeben, wird die Groß-/Kleinschreibung beachtet. Fügen Sie für jede Ressource angeforderte Bereiche hinzu, die im Zugriffstoken zurückgegeben werden sollen.
Beispiel:
-
["user.read"]für Microsoft Graph -
["<Application ID URL>/scope"]für benutzerdefinierte Web-APIs (d. h.api://<Application ID>/access_as_user)
Bereiche können für eine Ressource auf folgende Weise angegeben werden:
- Ein Array von Bereichen, das jeder HTTP-Anforderung zu dieser Ressource hinzugefügt wird, unabhängig von der 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"]]
]),
}
- Ein Array von
ProtectedResourceScopes, das Bereiche nur für bestimmte HTTP-Methoden anfügt.
{
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"]
}
]]
])
}
Beachten Sie, dass Scopes einer Ressource eine Kombination aus Strings und ProtectedResourceScopes enthalten können. Im folgenden Beispiel verfügt eine GET Anfrage über die Berechtigungsumfänge "all.scope" und "read.scope", während eine PUT Anfrage nur "all.scope" hätte.
{
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"]
}
]]
])
}
- Ein Scope-Wert von
null, der angibt, dass eine Ressource ungeschützt sein soll und keine Token erhalten wird. Nicht enthalteneprotectedResourceMapRessourcen sind standardmäßig nicht geschützt. Die Angabe einer bestimmten Ressource, die nicht geschützt werden soll, kann nützlich sein, wenn einige Routen für eine Ressource geschützt werden sollen und einige nicht. Beachten Sie, dass die Reihenfolge inprotectedResourceMapwichtig ist; daher sollte die null-Ressource vor ähnlichen Basis-URLs oder Platzhaltern platziert werden.
{
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"]]
]),
}
Weitere Punkte, die bezüglich des protectedResourceMap zu beachten sind:
-
Wildcards:
protectedResourceMapunterstützt die Verwendung*für Wildcards. Bei Verwendung von Platzhaltern gilt: Wenn improtectedResourceMapmehrere übereinstimmende Einträge gefunden werden, wird der erste gefundene Treffer verwendet (basierend auf der Reihenfolge derprotectedResourceMap). -
Relative Pfade: Wenn Ihre Anwendung relative Ressourcenpfade enthält, müssen Sie unter Umständen den relativen Pfad in
protectedResourceMapangeben. Dies gilt auch für Probleme, die bei ngx-translate auftreten können. Beachten Sie, dass der relative Pfad in IhremprotectedResourceMapje nach App möglicherweise einen führenden Schrägstrich benötigt oder auch nicht und dass Sie gegebenenfalls beide Varianten ausprobieren müssen.
Strikte Übereinstimmung (strictMatching)
In msal-angular v5 verwendet der Musterabgleich für URL-Komponenten bei den protectedResourceMap-Einträgen standardmäßig eine strikte Abgleichssemantik. Das Feld strictMatching in MsalInterceptorConfiguration steuert dieses Verhalten.
Important
Wenn Ihre Anwendung Schlüssel dynamisch festlegt protectedResourceMap (z. B. aus Umgebungsdateien APP_INITIALIZERoder JSON-Konfigurationen), und diese Schlüssel Basis-URLs ohne Unterpfade oder Wildcards sind, kann der strenge Abgleich im Hintergrund verhindern, dass der Authorization Header angefügt wird. Dies führt zu 401-Fehlern ohne Fehler zur Build-Zeit und ohne Warnung pro Anfrage – nur zu einer einmaligen Initialisierungswarnung, wenn strictMatching nicht explizit konfiguriert ist. Weitere Informationen finden Sie unter "Problembehandlung bei strenger Übereinstimmung ".
Welche strengen Abgleichsänderungen
| Behavior | Legacy (strictMatching: false) |
Strikt (standardmäßig in v5) |
|---|---|---|
| Escaping von Metazeichen |
. und andere Regex-Metazeichen werden nicht maskiert; sie wirken als Regex-Operatoren |
Alle Metacharacter (einschließlich .) werden als Literale behandelt. |
| Verankerung | Muster kann innerhalb der Zeichenfolge an beliebiger Stelle übereinstimmen | Muster muss mit der vollständigen Zeichenfolge übereinstimmen (^…$) |
Host-Platzhalter (*) |
* entspricht einer beliebigen Zeichenfolge, einschließlich . |
* entspricht jeder Zeichenfolge, die nicht. enthält (Wildcards bleiben innerhalb eines einzelnen DNS-Labels) |
Pfad-/Such-/Hash-Platzhalter (*) |
* entspricht einer beliebigen Zeichenfolge |
* entspricht einer beliebigen Zeichenfolge (unverändert) |
? Zeichen |
Übergeben an den zugrunde liegenden regex | Als Literal? behandelt (Trennzeichen einer URL-Abfragezeichenfolge, kein Platzhalter) |
Mit exakter Übereinstimmung (die Standardeinstellung in v5):
- Ein Muster wie
*.contoso.comentsprichtapp.contoso.comaber nichta.b.contoso.com(ein Platzhalter kann keine durch Punkte getrennten Segmente überspannen). - Ein Muster wie
https://graph.microsoft.com/v1.0/meentspricht nur genau dieser URL.
Häufige Fehlermuster
Die folgenden protectedResourceMap Schlüsselmuster funktionieren beim Legacy-Abgleich, schlagen jedoch bei strikter Übereinstimmung stillschweigend fehl:
| Tastenmuster | URL der ausgehenden Anforderung | Ergebnis bei strikter Übereinstimmung | Beheben |
|---|---|---|---|
https://api.example.com |
https://api.example.com/v1/users |
Keine Übereinstimmung – der Schlüssel wird in den Pfad / aufgelöst, die Anfrage enthält den Pfad /v1/users |
https://api.example.com/* |
https://api.example.com/ |
https://api.example.com/v1/users |
Keine Übereinstimmung – ein abschließender Schrägstrich verankert das Muster genau auf / |
https://api.example.com/* |
environment.apiConfig.uri (z. B. https://api.example.com) |
https://api.example.com/v1/users |
Keine Übereinstimmung – identisch mit oben | `${environment.apiConfig.uri}/*` |
Standardverhalten in v5 (keine Konfiguration erforderlich)
Der strenge Abgleich ist standardmäßig aktiviert. Es ist keine zusätzliche Konfiguration erforderlich:
{
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
}
Legacy-Abgleich deaktivieren
Wenn Ihre Muster auf der weniger strikten Übereinstimmung aus v4 basieren, können Sie strictMatching: false festlegen, um das Legacy-Verhalten vorübergehend beizubehalten:
Note
Legacyabgleich (strictMatching: false) wird zur Abwärtskompatibilität bereitgestellt und kann in einer zukünftigen Hauptversion entfernt werden. Wir empfehlen, Ihre protectedResourceMap Muster so zu aktualisieren, dass sie mit strikter Übereinstimmung funktionieren.
{
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
}
Leitfaden für umgebungsgesteuerte Konfigurationen
Wenn Ihre protectedResourceMap-Schlüssel auf Angular-environment-Werte verweisen (zum Beispiel environment.apiConfig.uri), prüfen Sie, ob diese Werte exakte Pfade (zum Beispiel https://graph.microsoft.com/v1.0/me) oder reine Basis-URLs (zum Beispiel https://api.example.com) sind. Exakte Pfade funktionieren bei strikter Übereinstimmung korrekt und benötigen keine Sonderbehandlung:
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,
};
}
Wenn der Umgebungswert eine bare Basis-URL ist und Sie Unterpfade abgleichen müssen, fügen Sie einen /* Wildcard an:
// 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);
Bei wirklich dynamischen Konfigurationen, bei denen die Struktur der Schlüssel zur Build-Zeit nicht bekannt ist (zum Beispiel APP_INITIALIZER, per fetch geladenes JSON oder platformBrowserDynamic), legen Sie strictMatching: false als vorübergehend sicheren Standardwert fest. Siehe Fixoptionen – Option B für ein Codebeispiel.
Problembehandlung beim strengen Abgleich
Symptome
- API-Anforderungen geben 401 Unauthorized nach dem Upgrade auf
@azure/msal-angularv5 zurück (oder zwischen v5-Nebenversionen wie 5.0.x → 5.1.x). - Der
Authorization: Bearer <token>Header fehlt bei ausgehenden HTTP-Anforderungen. - Es werden keine Buildzeit- oder Laufzeitfehler gemeldet – der Fehler wird im Hintergrund ausgeführt.
- Das Problem kann nur in bestimmten Umgebungen (z. B. Staging/Produktion) auftreten, bei denen sich die API-Basis-URL von der Entwicklung unterscheidet.
Optionen zur Fehlerbehebung
Option A: Aktualisieren von Schlüsseln für die Arbeit mit striktem Abgleich (empfohlen)
Aktualisieren Sie Ihre protectedResourceMap Schlüssel, um genaue Pfade oder Wildcards zu verwenden, die mit strengen Übereinstimmungsregeln übereinstimmen. Dieser Ansatz wird bevorzugt, da strenge Übereinstimmungen sicherer und vorhersehbarer sind:
{
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
}
Option B: Festlegen strictMatching: false (Fallback für dynamische Konfigurationen)
Wenn Ihre protectedResourceMap Schlüssel dynamisch zur Laufzeit geladen werden (z. B. aus APP_INITIALIZER, JSON-Konfiguration oder platformBrowserDynamic), und Sie können nicht garantieren, dass sie genaue Pfade oder Wildcards enthalten, legen strictMatching: false Sie sie als temporären sicheren Standardwert fest:
{
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
Legacy-Abgleich (strictMatching: false) steht zur Rückwärtskompatibilität zur Verfügung und kann in einer zukünftigen Hauptversion entfernt werden.
Laufzeitwarnung
MsalInterceptor gibt eine einmalige Laufzeitwarnung über den MSAL-Logger während der Initialisierung aus, wenn strictMatching sie nicht explizit konfiguriert ist. Wenn diese Warnung angezeigt wird, folgen Sie den oben aufgeführten Fixoptionen.
Optionaler Authentifizierungsanforderung
Weitere Informationen zu den optionalen authRequest, die in MsalInterceptorConfiguration festgelegt werden können, finden Sie bitte hier in unserer Dokumentation zu mehreren Mandanten.
Änderungen von msal-angular v1 zu v2
Note
Die unprotectedResourceMap in MsalAngularConfiguration von MSAL Angular v1 wurde eingestellt und funktioniert nicht mehr.
-
protectedResourceMapwurde in dasMsalInterceptorConfiguration-Objekt verschoben und kann alsMap<string, Array<string|ProtectedResourceScopes>>übergeben werden.MsalAngularConfigurationwurde als veraltet eingestuft und funktioniert nicht mehr. - Das Platzieren der Root-Domain in
protectedResourceMap, um alle Routen zu schützen, wird nicht mehr unterstützt. Verwenden Sie stattdessen den Wildcardabgleich.
Weitere Informationen zum Konfigurieren von Bereichen finden Sie in unseren HÄUFIG gestellten Fragen.