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.
BrowserConfigurationAuthErrors
stubbed_public_client_application_called
Foutbericht: Stub-exemplaar van openbare clienttoepassing is aangeroepen. Als u msal-react gebruikt, moet u ervoor zorgen dat de context niet wordt gebruikt zonder een provider.
BrowserAuthErrors
Interaction_in_progress
Foutbericht: De interactie wordt momenteel uitgevoerd. Zorg ervoor dat deze interactie is voltooid voordat u een interactieve API aanroept.
Deze fout treedt op wanneer een interactieve API (loginPopup, loginRedirect, acquireTokenPopup, ) acquireTokenRedirectwordt aangeroepen terwijl er nog een interactieve API wordt uitgevoerd. De aanmeldings- en acquireToken-API's zijn asynchroon, dus u moet ervoor zorgen dat de resulterende beloften zijn opgelost voordat u een andere aanroept.
Gebruiken loginPopup of acquireTokenPopup
Zorg ervoor dat de belofte die door deze API's wordt geretourneerd, is opgelost voordat u een andere aanroept.
❌ Het volgende voorbeeld geeft deze fout, omdat loginPopup nog steeds wordt uitgevoerd wanneer acquireTokenPopup wordt aangeroepen:
const request = { scopes: ["openid", "profile"] };
loginPopup();
acquireTokenPopup(request);
✔️ U kunt dit oplossen door ervoor te zorgen dat alle interactieve API's zijn opgelost voordat u een andere API aanroept:
const request = { scopes: ["openid", "profile"] };
await msalInstance.loginPopup();
await msalInstance.acquireTokenPopup(request);
Gebruiken loginRedirect of acquireTokenRedirect
Wanneer u omleidings-API's gebruikt, moet handleRedirectPromise worden aangeroepen wanneer u terugkomt van de omleiding. Dit zorgt ervoor dat het tokenantwoord van de server correct wordt verwerkt en dat tijdelijke cachevermeldingen worden opgeschoond. Deze fout treedt op wanneer handleRedirectPromise niet de kans heeft gehad om te worden voltooid voordat de toepassing loginRedirect of acquireTokenRedirect aanroept.
❌ In het volgende voorbeeld wordt deze fout gegenereerd omdat handleRedirectPromise het antwoord van een vorige loginRedirect aanroep nog steeds wordt verwerkt wanneer loginRedirect een tweede keer wordt aangeroepen:
msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
✔️ Om dit op te lossen, moet u wachten tot handleRedirectPromise is voltooid voordat u een interactieve API aanroept:
await msalInstance.handleRedirectPromise();
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
Of u kunt ook:
msalInstance
.handleRedirectPromise()
.then((tokenResponse) => {
if (!tokenResponse) {
const accounts = msalInstance.getAllAccounts();
if (accounts.length === 0) {
// No user signed in
msalInstance.loginRedirect();
}
} else {
// Do something with the tokenResponse
}
})
.catch((err) => {
// Handle error
console.error(err);
});
Opmerking: Als u loginRedirect of acquireTokenRedirect aanroept vanaf een pagina die niet uw redirectUri is, moet u ervoor zorgen dat handleRedirectPromise wordt aangeroepen en afgewacht op zowel de redirectUri-pagina als de pagina van waaruit u de omleiding hebt gestart. Dit komt doordat de redirectUri-pagina zal terugleiden naar de pagina die oorspronkelijk loginRedirect heeft aangeroepen, en die pagina zal het tokenantwoord verwerken.
Wrapper-bibliotheken
Als u een van onze wrapperbibliotheken gebruikt (React of Angular), raadpleegt u de foutdocumenten in deze specifieke bibliotheken om aanvullende redenen waarom u deze fout mogelijk krijgt:
Als u geen van de wrapper-bibliotheken gebruikt, maar u zich zorgen maakt dat uw toepassing gelijktijdige interactieve aanvragen kan activeren, moet u controleren of er een andere interactie wordt uitgevoerd voordat u een interactie aanroept in uw tokenverwervingsmethode. U kunt dit bereiken door een globale toepassingsstatus of een broadcast-service te implementeren die de huidige MSAL-interactiestatus verzendt via de MSAL Events-API.
❌ In het volgende voorbeeld wordt deze fout gegenereerd omdat het acquireTokenPopupcatch-blok niet controleert of er op dit moment een andere interactie plaatsvindt:
async function myAcquireToken(request) {
const msalInstance = getMsalInstance(); // get the msal application instance
const tokenRequest = {
account: msalInstance.getActiveAccount() || null;
...request
};
let tokenResponse;
try {
// attempt silent acquisition first
tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
} catch (error) {
if (error instanceof InteractionRequiredAuthError) {
try {
tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
} catch (err) {
console.log(err);
// handle other errors
}
}
console.log(error);
// handle other errors
}
return tokenResponse;
};
const request = {
scopes: ["User.Read"]
};
myAcquireToken(request);
myAcquireToken(request);
✔️ U kunt dit oplossen door te wachten totdat de interactiestatus is None ingesteld voordat u een andere interactieve API aanroept:
async function myAcquireToken(request) {
const msalInstance = getMsalInstance(); // get the msal application instance
const tokenRequest = {
account: msalInstance.getActiveAccount() || null;
...request
};
let tokenResponse;
try {
// attempt silent acquisition first
tokenResponse = await msalInstance.acquireTokenSilent(tokenRequest);
} catch (error) {
if (error instanceof InteractionRequiredAuthError) {
// check for any interactions
if (myGlobalState.getInteractionStatus() !== InteractionStatus.None) {
// throw a new error to be handled in the caller below
throw new Error("interaction_in_progress");
} else {
// no interaction, invoke popup flow
tokenResponse = await msalInstance.acquireTokenPopup(tokenRequest);
}
}
console.log(error);
// handle other errors
}
return tokenResponse;
};
async function myInteractionInProgressHandler() {
/**
* "myWaitFor" method polls the interaction status via getInteractionStatus() from
* the application state and resolves when it's equal to "None".
*/
await myWaitFor(() => myGlobalState.getInteractionStatus() === InteractionStatus.None);
// wait is over, call myAcquireToken again to re-try acquireTokenSilent
return (await myAcquireToken(tokenRequest));
};
const request = {
scopes: ["User.Read"]
};
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
myAcquireToken(request).catch((e) => myInteractionInProgressHandler());
Stappen voor probleemoplossing
-
Schakel uitgebreide logboekregistratie in en traceer de volgorde van gebeurtenissen. Controleer of
handleRedirectPromisewordt aangeroepen en terugkeert voordat eenlogin- ofacquireToken-API wordt aangeroepen.
Als u niet kunt achterhalen waarom deze fout wordt weergegeven, maak dan een issue aan en zorg dat u de volgende informatie kunt delen:
- Gedetailleerde logboeken
- Een voorbeeld-app en/of codefragmenten die we kunnen gebruiken om het probleem te reproduceren
- Vernieuw de pagina. Gaat de fout weg?
- Open uw toepassing op een nieuw tabblad. Gaat de fout weg?
block_iframe_reload
Foutbericht: Aanvraag is geblokkeerd in een iframe omdat MSAL een verificatieantwoord heeft gedetecteerd.
Deze fout treedt op bij het aanroepen van ssoSilent of acquireTokenSilent, wanneer de pagina die wordt gebruikt als uw redirectUri probeert een aanmeldings- of acquireToken-functie aan te roepen.
Onze aanbevolen oplossing hiervoor is om uw redirectUri in te stellen op een lege pagina die MSAL niet implementeert bij het aanroepen van stille API's. Dit heeft ook het extra voordeel van het verbeteren van de prestaties, omdat het verborgen iframe uw pagina niet hoeft weer te geven.
✔️ U kunt dit per aanvraag doen, bijvoorbeeld:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Houd er rekening mee dat u deze nieuwe redirectUri moet registreren bij uw app-registratie.
Als u hiervoor geen speciale redirectUri wilt gebruiken, moet u er in plaats daarvan voor zorgen dat redirectUri niet probeert MSAL-API's aan te roepen wanneer deze wordt gerenderd in de verborgen iframe die door de silent API's wordt gebruikt.
monitor_window_timeout
Foutberichten:
- Het ophalen van tokens in iframe is mislukt vanwege een time-out.
Deze fout kan optreden bij het aanroepenssoSilent, acquireTokenSilentacquireTokenPopupof loginPopup er zijn verschillende redenen waarom dit kan gebeuren. Dit zijn enkele van de meest voorkomende:
- De pagina die u als uw
redirectUrigebruikt, verwijdert of wijzigt de hash - De pagina die u als uw
redirectUrigebruikt, navigeert automatisch naar een andere pagina - U wordt beperkt door uw id-provider
- Uw identiteitsprovider heeft niet teruggeleid naar uw
redirectUri.
Belangrijk: Als uw toepassing gebruikmaakt van een routerbibliotheek (bijvoorbeeld React Router, Angular-router), moet u ervoor zorgen dat de hash of automatische omleiding niet wordt verwijderd terwijl MSAL-token wordt opgehaald. Indien mogelijk is het het beste als de redirectUri pagina de router helemaal niet aanroept.
Problemen veroorzaakt door de redirectUri-pagina
Wanneer u een stille aanroep doet, wordt in sommige gevallen een iframe geopend en gaat u naar de autorisatiepagina van uw id-provider. Nadat de id-provider de gebruiker heeft geautoriseerd, wordt het iframe teruggeleid naar de redirectUri autorisatiecode of foutinformatie in het hash-fragment. De MSAL-instantie die wordt uitgevoerd in het frame of venster dat oorspronkelijk de aanvraag heeft gemaakt, extraheert deze antwoord-hash en verwerkt deze. Als u redirectUri deze hash verwijdert of bewerkt of naar een andere pagina navigeert voordat MSAL deze heeft geëxtraheerd, ontvangt u deze time-outfout.
✔️ Om dit probleem op te lossen, moet u ervoor zorgen dat de pagina die u gebruikt omdat u redirectUri geen van deze dingen uitvoert, ten minste wanneer deze in een pop-up of iframe worden geladen. We raden u aan een lege pagina te gebruiken als uw redirectUri voor stille en pop-upstromen om ervoor te zorgen dat geen van deze dingen kan optreden.
U kunt dit per aanvraag doen, bijvoorbeeld:
msalInstance.acquireTokenSilent({
scopes: ["User.Read"],
redirectUri: "http://localhost:3000/blank.html",
});
Houd er rekening mee dat u deze nieuwe redirectUri moet registreren bij uw app-registratie.
Opmerkingen met betrekking tot Angular en React:
- Als u
@azure/msal-angulargebruikt, mag uwredirectUri-pagina niet worden beschermd door deMsalGuard. - Als u
@azure/msal-reactgebruikt, zou uwredirectUri-pagina deMsalAuthenticationComponentniet moeten renderen of deuseMsalAuthentication-hook moeten gebruiken.
Problemen die worden veroorzaakt door de id-provider
Throttling
Een van de meest voorkomende redenen waarom deze fout kan worden gegenereerd, is dat uw toepassing in een lus is vastgelopen of dat er in korte tijd te veel tokenaanvragen zijn ingediend. Wanneer dit gebeurt, kan de identiteitsprovider de daaropvolgende aanvragen korte tijd beperken, waardoor u niet wordt teruggeleid naar uw redirectUri en dit uiteindelijk tot deze fout leidt.
✔️ Om problemen door throttling op te lossen, hebt u 2 opties:
- Stop met het indienen van aanvragen voor een korte tijd voordat u het opnieuw probeert.
- Een interactieve API aanroepen, zoals
acquireTokenPopupofacquireTokenRedirect.
X-Frame-Options weigeren
U kunt deze fout ook krijgen als de identiteitsprovider niet terugverwijst naar uw applicatie. In stille scenario’s gaat deze fout soms gepaard met een X-Frame-Options: Deny-fout, wat aangeeft dat uw identiteitsprovider u een foutbericht probeert te tonen of op interactie wacht.
✔️ De X-Frame-Options-fout bevat meestal een URL en het openen van deze URL op een nieuw tabblad kan u helpen om te zien wat er gebeurt. Als interactie is vereist, kunt u in plaats daarvan een interactieve API gebruiken. Als er een fout wordt weergegeven, kunt u de fout oplossen.
Sommige B2C-stromen zullen deze fout waarschijnlijk veroorzaken vanwege hun behoefte aan gebruikersinteractie. Deze stromen zijn onder andere:
- Wachtwoord opnieuw instellen
- Profiel bewerken
- Inschrijven
- Sommige aangepaste beleidsregels zijn afhankelijk van hoe ze zijn geconfigureerd
Netwerklatentie
Een andere mogelijke reden waarom de id-provider mogelijk niet op tijd terugleidt naar uw toepassing, kan het zijn dat er extra netwerklatentie is.
✔️ De standaardtime-out is ongeveer 10 seconden en zou in de meeste gevallen voldoende moeten zijn. Als het echter langer duurt voordat uw identiteitsprovider u omleidt, kunt u deze time-out in de MSAL-configuratie verhogen met een van de configuratieparameters iframeHashTimeout, windowHashTimeout of loadFrameTimeout.
const msalConfig = {
auth: {
clientId: "your-client-id",
},
system: {
windowHashTimeout: 9000, // Applies just to popup calls - In milliseconds
iframeHashTimeout: 9000, // Applies just to silent calls - In milliseconds
loadFrameTimeout: 9000, // Applies to both silent and popup calls - In milliseconds
},
};
hash_empty_error
Foutberichten:
Hash-waarde kan niet worden verwerkt omdat deze leeg is. Controleer of je redirectUri de hash niet verwijdert.
Deze fout treedt op wanneer de pagina die u gebruikt als uw redirectUri de hash verwijdert of automatisch omleidt naar een andere pagina. Dit gebeurt meestal wanneer de applicatie een router implementeert die naar een andere route navigeert, waardoor de hash wegvalt.
U kunt deze fout oplossen door een speciale redirectUri-pagina te gebruiken die niet onderhevig is aan de router. Voor stille en pop-upoproepen kunt u het beste een lege pagina gebruiken. Als dit niet mogelijk is, moet u ervoor zorgen dat de router niet navigeert terwijl MSAL-token wordt opgehaald. U kunt dit doen door te detecteren of uw applicatie is geladen in een iframe voor stille aanroepen, in een popup voor popupaanroepen, of door te wachten op handleRedirectPromise voor omleidingsaanroepen.
hash bevat geen bekende eigenschappen
Foutberichten:
Hash bevat geen bekende properites. Controleer of uw redirectUri de hash niet wijzigt.
Zie de uitleg voor hash_empty_error hierboven. De hoofdoorzaak voor deze fout is vergelijkbaar, het verschil dat de hash is gewijzigd in plaats van verwijderd.
kan_token_niet_verkrijgen_van_native_platform
Foutberichten:
- Kan geen token verkrijgen van het systeemeigen platform.
Deze fout treedt op wanneer de acquireTokenByCode-API wordt aangeroepen met nativeAccountId in plaats van code en de app wordt uitgevoerd in een omgeving die geen tokens van de systeemeigen broker verkrijgt. Raadpleeg het document over apparaatgebonden tokens voor een lijst met vereisten.
Native verbinding niet tot stand gebracht
Foutberichten:
- Er is geen verbinding met het systeemeigen platform tot stand gebracht. Installeer een compatibele browserextensie en voer initialize() uit.
Deze fout treedt op wanneer de gebruiker zich heeft aangemeld met de systeemeigen broker, maar er momenteel geen verbinding met de systeemeigen broker bestaat. Dit kan om de volgende redenen gebeuren:
- De extensie Windows Accounts is verwijderd of uitgeschakeld
- De
initializeAPI is niet aangeroepen of er is niet op gewacht voordat een andere MSAL-API werd aangeroepen
uninitialized_public_client_application
Foutberichten:
- U moet de initialisatiefunctie aanroepen en wachten voordat u probeert een andere MSAL-API aan te roepen.
Deze fout wordt gegenereerd wanneer een login, acquireToken of handleRedirectPromise API wordt aangeroepen voordat de initialize API wordt aangeroepen. De initialize API moet worden aangeroepen en gewacht voordat u tokens probeert te verkrijgen.
❌ In het volgende voorbeeld wordt deze fout gegenereerd omdat handleRedirectPromise deze wordt aangeroepen voordat initialisatie is voltooid:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.handleRedirectPromise(); // This will throw
msalInstance.acquireTokenSilent(); // This will also throw
✔️ U kunt dit oplossen door te wachten totdat initialize is voltooid voordat u een andere MSAL-API aanroept:
const msalInstance = new PublicClientApplication({
auth: {
clientId: "your-client-id",
},
system: {
allowNativeBroker: true,
},
});
await msalInstance.initialize();
await msalInstance.handleRedirectPromise(); // This will no longer throw this error since initialize completed before this was invoked
msalInstance.acquireTokenSilent(); // This will also no longer throw this error
Other
Fouten die niet door msal worden opgeworpen, zoals serverfouten
Toegang voor ophalen op [URL] is geblokkeerd door CORS-beleid
Deze fout treedt op bij MSAL.js v2.x en wordt veroorzaakt door onjuiste configuratie tijdens app-registratie op Azure Portal. U moet er met name voor zorgen dat uw redirectUri is geregistreerd als het type: Single-page application onder de sectie Authenticatie in uw App-registratie. Als dit is gelukt, ziet u een groen vinkje met de volgende tekst:
Uw omleidings-URI komt in aanmerking voor de autorisatiecodestroom met PKCE.