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.
Dit artikel bevat een overzicht van de verschillende typen fouten en aanbevelingen voor het afhandelen van veelvoorkomende aanmeldingsfouten.
Basisprincipes van MSAL-foutafhandeling
Uitzonderingen in Microsoft Authentication Library (MSAL) zijn bedoeld voor app-ontwikkelaars om problemen op te lossen, niet voor weergave aan eindgebruikers. Uitzonderingsberichten worden niet gelokaliseerd.
Wanneer u uitzonderingen en fouten verwerkt, kunt u het uitzonderingstype zelf en de foutcode gebruiken om onderscheid te maken tussen uitzonderingen. Zie Microsoft Entra foutcodes voor verificatie en autorisatie voor een lijst met foutcodes.
Tijdens de aanmeldingservaring kunnen er fouten optreden over toestemmingen, voorwaardelijke toegang (MFA, Apparaatbeheer, beperkingen op basis van locatie), tokenuitgifte en inwisseling en gebruikerseigenschappen.
In de volgende sectie vindt u meer informatie over foutafhandeling voor uw app.
Foutafhandeling in MSAL voor iOS/macOS
De volledige lijst met MSAL voor iOS- en macOS-fouten wordt vermeld in MSALError enum.
Alle door MSAL gegenereerde fouten worden geretourneerd met het domein MSALErrorDomain.
Voor systeemfouten retourneert MSAL het origineel NSError van de systeem-API. Als het ophalen van tokens bijvoorbeeld mislukt vanwege een gebrek aan netwerkconnectiviteit, retourneert MSAL een fout met het domein en NSURLErrorDomain de NSURLErrorNotConnectedToInternet code.
U wordt aangeraden ten minste de volgende twee MSAL-fouten aan de clientzijde af te handelen:
MSALErrorInteractionRequired: De gebruiker moet een interactieve aanvraag doen. Er zijn veel voorwaarden die kunnen leiden tot deze fout, zoals een verlopen verificatiesessie of de noodzaak van aanvullende verificatievereisten. Roep de INTERACTIEVE MSAL-tokenverwervings-API aan om te herstellen.MSALErrorServerDeclinedScopes: Sommige of alle scopes zijn afgewezen. Bepaal of u wilt doorgaan met alleen de verleende machtigingen, of het aanmeldingsproces wilt stoppen.
Note
De MSALInternalError opsomming mag alleen worden gebruikt voor verwijzing en foutopsporing. Probeer deze fouten niet automatisch op te lossen tijdens runtime. Als uw app een van de fouten tegenkomt die onder MSALInternalErrorvallen, kunt u een algemeen bericht met gebruikersgerichte informatie weergeven waarin wordt uitgelegd wat er is gebeurd.
Dit betekent bijvoorbeeld MSALInternalErrorBrokerResponseNotReceived dat de gebruiker de verificatie niet heeft voltooid en handmatig naar de app is teruggestuurd. In dit geval moet uw app een algemeen foutbericht weergeven waarin wordt uitgelegd dat de verificatie niet is voltooid en wordt voorgesteld dat ze opnieuw proberen te verifiëren.
In de volgende Objective-C voorbeeldcode ziet u aanbevolen procedures voor het afhandelen van enkele veelvoorkomende foutvoorwaarden.
MSALInteractiveTokenParameters *interactiveParameters = ...;
MSALSilentTokenParameters *silentParameters = ...;
MSALCompletionBlock completionBlock;
__block __weak MSALCompletionBlock weakCompletionBlock;
weakCompletionBlock = completionBlock = ^(MSALResult *result, NSError *error)
{
if (!error)
{
// Use result.accessToken
NSString *accessToken = result.accessToken;
return;
}
if ([error.domain isEqualToString:MSALErrorDomain])
{
switch (error.code)
{
case MSALErrorInteractionRequired:
{
// Interactive auth will be required
[application acquireTokenWithParameters:interactiveParameters
completionBlock:weakCompletionBlock];
break;
}
case MSALErrorServerDeclinedScopes:
{
// These are list of granted and declined scopes.
NSArray *grantedScopes = error.userInfo[MSALGrantedScopesKey];
NSArray *declinedScopes = error.userInfo[MSALDeclinedScopesKey];
// To continue acquiring token for granted scopes only, do the following
silentParameters.scopes = grantedScopes;
[application acquireTokenSilentWithParameters:silentParameters
completionBlock:weakCompletionBlock];
// Otherwise, instead, handle error fittingly to the application context
break;
}
case MSALErrorServerProtectionPoliciesRequired:
{
// Integrate the Intune SDK and call the
// remediateComplianceForIdentity:silent: API.
// Handle this error only if you integrated Intune SDK.
// See more info here: https://aka.ms/intuneMAMSDK
break;
}
case MSALErrorUserCanceled:
{
// The user cancelled the web auth session.
// You may want to ask the user to try again.
// Handling of this error is optional.
break;
}
case MSALErrorInternal:
{
// Log the error, then inspect the MSALInternalErrorCodeKey
// in the userInfo dictionary.
// Display generic error message to the end user
// More detailed information about the specific error
// under MSALInternalErrorCodeKey can be found in MSALInternalError enum.
NSLog(@"Failed with error %@", error);
break;
}
default:
NSLog(@"Failed with unknown MSAL error %@", error);
break;
}
return;
}
// Handle no internet connection.
if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorNotConnectedToInternet)
{
NSLog(@"No internet connection.");
return;
}
// Other errors may require trying again later,
// or reporting authentication problems to the user.
NSLog(@"Failed with error %@", error);
};
// Acquire token silently
[application acquireTokenSilentWithParameters:silentParameters
completionBlock:completionBlock];
// or acquire it interactively.
[application acquireTokenWithParameters:interactiveParameters
completionBlock:completionBlock];
let interactiveParameters: MSALInteractiveTokenParameters = ...
let silentParameters: MSALSilentTokenParameters = ...
var completionBlock: MSALCompletionBlock!
completionBlock = { (result: MSALResult?, error: Error?) in
if let result = result
{
// Use result.accessToken
let accessToken = result.accessToken
return
}
guard let error = error as NSError? else { return }
if error.domain == MSALErrorDomain, let errorCode = MSALError(rawValue: error.code)
{
switch errorCode
{
case .interactionRequired:
// Interactive auth will be required
application.acquireToken(with: interactiveParameters, completionBlock: completionBlock)
case .serverDeclinedScopes:
let grantedScopes = error.userInfo[MSALGrantedScopesKey]
let declinedScopes = error.userInfo[MSALDeclinedScopesKey]
if let scopes = grantedScopes as? [String] {
silentParameters.scopes = scopes
application.acquireTokenSilent(with: silentParameters, completionBlock: completionBlock)
}
case .serverProtectionPoliciesRequired:
// Integrate the Intune SDK and call the
// remediateComplianceForIdentity:silent: API.
// Handle this error only if you integrated Intune SDK.
// See more info here: https://aka.ms/intuneMAMSDK
break
case .userCanceled:
// The user cancelled the web auth session.
// You may want to ask the user to try again.
// Handling of this error is optional.
break
case .internal:
// Log the error, then inspect the MSALInternalErrorCodeKey
// in the userInfo dictionary.
// Display generic error message to the end user
// More detailed information about the specific error
// under MSALInternalErrorCodeKey can be found in MSALInternalError enum.
print("Failed with error \(error)");
default:
print("Failed with unknown MSAL error \(error)")
}
}
// Handle no internet connection.
if error.domain == NSURLErrorDomain && error.code == NSURLErrorNotConnectedToInternet
{
print("No internet connection.")
return
}
// Other errors may require trying again later,
// or reporting authentication problems to the user.
print("Failed with error \(error)");
}
// Acquire token silently
application.acquireToken(with: interactiveParameters, completionBlock: completionBlock)
// or acquire it interactively.
application.acquireTokenSilent(with: silentParameters, completionBlock: completionBlock)
Problemen met voorwaardelijke toegang en claims
Wanneer tokens op de achtergrond worden opgehaald, kan uw toepassing fouten krijgen wanneer een claims-uitdaging voor voorwaardelijke toegang, zoals MFA-beleid, wordt vereist door een API waartoe u toegang probeert te krijgen.
Het patroon voor het afhandelen van deze fout is om interactief een token te verkrijgen met BEHULP van MSAL. Hiermee wordt de gebruiker gevraagd en krijgt deze de mogelijkheid om te voldoen aan het vereiste beleid voor voorwaardelijke toegang.
In bepaalde gevallen kunt u, wanneer u een API aanroept waarvoor voorwaardelijke toegang is vereist, een claims-uitdaging ontvangen in de foutmelding van de API. Als het beleid voor voorwaardelijke toegang bijvoorbeeld een beheerd apparaat (Intune) heeft, is de fout ongeveer AADSTS53000: uw apparaat moet worden beheerd om toegang te krijgen tot deze resource of iets dergelijks. In dit geval kunt u de claims doorgeven in de aanroep van het acquire-token, zodat de gebruiker wordt gevraagd om te voldoen aan het juiste beleid.
Met MSAL voor iOS en macOS kunt u specifieke claims aanvragen in zowel interactieve als stille tokenverwervingsscenario's.
Als u aangepaste claims wilt aanvragen, geeft u claimsRequest op in MSALSilentTokenParameters of MSALInteractiveTokenParameters.
Zie Aangepaste claims aanvragen met MSAL voor iOS en macOS voor meer informatie.
Opnieuw proberen na fouten en uitzonderingen
U wordt verwacht dat u uw eigen beleid voor opnieuw proberen implementeert bij het aanroepen van MSAL. MSAL maakt HTTP-aanroepen naar de Microsoft Entra-service en af en toe kunnen er fouten optreden. Het netwerk kan bijvoorbeeld uitvalt of de server overbelast is.
HTTP 429
Wanneer de Service Token Server (STS) overbelast is met te veel aanvragen, retourneert deze HTTP-fout 429 met een hint over hoe lang het duurt voordat u het opnieuw kunt proberen in het Retry-After antwoordveld.
Volgende stappen
Overweeg logregistratie in MSAL voor iOS/macOS in te schakelen om u te helpen problemen te diagnosticeren en op te lossen.