iOS/macOS için MSAL.js’de hataları ve özel durumları işleme
Bu makalede, farklı hata türlerine genel bir bakış ve yaygın oturum açma hatalarını işlemeye yönelik öneriler verilmektedir.
MSAL hata işleme temelleri
Microsoft Kimlik Doğrulama Kitaplığı'ndaki (MSAL) özel durumlar, son kullanıcılara görüntülenmek için değil, uygulama geliştiricilerinin sorun gidermesine yöneliktir. Özel durum iletileri yerelleştirilmemiş.
Özel durumları ve hataları işlerken, özel durumlar arasında ayrım yapmak için özel durum türünün kendisini ve hata kodunu kullanabilirsiniz. Hata kodlarının listesi için bkz . Microsoft Entra kimlik doğrulaması ve yetkilendirme hata kodları.
Oturum açma deneyimi sırasında onaylar, Koşullu Erişim (MFA, Cihaz Yönetimi, Konum tabanlı kısıtlamalar), belirteç verme ve kullanım ve kullanıcı özellikleriyle ilgili hatalarla karşılaşabilirsiniz.
Aşağıdaki bölümde, uygulamanız için hata işleme hakkında daha fazla ayrıntı sağlanır.
iOS/macOS için MSAL'de hata işleme
iOS ve macOS için MSAL hatalarının tam listesi MSALError sabit listesinde listelenir.
MSAL tarafından oluşturulan tüm hatalar etki alanıyla birlikte MSALErrorDomain
döndürülür.
Sistem hataları için MSAL, sistem API'sinden özgün NSError
değerini döndürür. Örneğin, belirteç alma işlemi ağ bağlantısı olmaması nedeniyle başarısız olursa, MSAL etki alanı ve NSURLErrorNotConnectedToInternet
kodla NSURLErrorDomain
ilgili bir hata döndürür.
İstemci tarafında en az aşağıdaki iki MSAL hatasını işlemenizi öneririz:
MSALErrorInteractionRequired
: Kullanıcı etkileşimli bir istekte bulunmalıdır. Süresi dolan bir kimlik doğrulama oturumu veya ek kimlik doğrulaması gereksinimleri gereksinimi gibi bu hataya yol açabilecek birçok koşul vardır. Kurtarmak için MSAL etkileşimli belirteç alma API'sini çağırın.MSALErrorServerDeclinedScopes
: Kapsamların bazıları veya tümü reddedildi. Yalnızca verilen kapsamlarla devam etmek mi yoksa oturum açma işlemini durdurmak mı istediğinize karar verin.
Not
Sabit MSALInternalError
listesi yalnızca başvuru ve hata ayıklama için kullanılmalıdır. Bu hataları çalışma zamanında otomatik olarak işlemeye çalışmayın. Uygulamanız altında MSALInternalError
bulunan hatalardan herhangi biri ile karşılaşırsa, ne olduğunu açıklayan genel bir kullanıcıya yönelik ileti göstermek isteyebilirsiniz.
Örneğin, MSALInternalErrorBrokerResponseNotReceived
kullanıcının kimlik doğrulamasını tamamlamadığını ve uygulamaya el ile döndürüldüğünü gösterir. Bu durumda, uygulamanız kimlik doğrulamasının tamamlanmadığını açıklayan genel bir hata iletisi göstermeli ve yeniden kimlik doğrulaması yapmayı denemelerini önermelidir.
Aşağıdaki Objective-C örnek kodu, bazı yaygın hata koşullarını işlemeye yönelik en iyi yöntemleri gösterir.
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)
Koşullu Erişim ve talep sınamaları
Belirteçleri sessizce alırken, erişmeye çalıştığınız bir API için MFA ilkesi gibi bir Koşullu Erişim talep sınaması gerektiğinde uygulamanız hata alabilir.
Bu hatayı işlemeye yönelik desen, MSAL kullanarak etkileşimli bir belirteç almaktır. Bu, kullanıcıya sorar ve gerekli Koşullu Erişim ilkesini karşılama fırsatı verir.
Koşullu Erişim gerektiren bir API'yi çağırırken bazı durumlarda, API'den hatada bir talep sınaması alabilirsiniz. Örneğin, Koşullu Erişim ilkesinin yönetilen bir cihaza (Intune) sahip olması durumunda hata AADSTS53000: Cihazınızın bu kaynağa erişmek için yönetilmesi veya benzer bir şey olması gerekir. Bu durumda, kullanıcıdan uygun ilkeyi karşılaması istenmesi için alma belirteci çağrısında talepleri geçirebilirsiniz.
iOS ve macOS için MSAL, hem etkileşimli hem de sessiz belirteç alma senaryolarında belirli talepler istemenizi sağlar.
Özel talepler istemek için veya MSALInteractiveTokenParameters
içinde MSALSilentTokenParameters
belirtinclaimsRequest
.
Daha fazla bilgi için bkz . iOS ve macOS için MSAL kullanarak özel talepler isteme.
Hatalar ve özel durumlardan sonra yeniden deneme
MSAL'yi çağırırken kendi yeniden deneme ilkelerinizi uygulamanız beklenir. MSAL, Microsoft Entra hizmetine HTTP çağrıları yapar ve bazen hatalar oluşabilir. Örneğin ağ kapanabilir veya sunucu aşırı yüklenmiş olabilir.
HTTP 429
Hizmet Belirteci Sunucusu (STS) çok fazla istekle aşırı yüklendiğinde, yanıt alanında yeniden Retry-After
deneyebileceğiniz süreyle ilgili bir ipucuyla HTTP hatası 429 döndürür.
Sonraki adımlar
Sorunları tanılamanıza ve hatalarını ayıklamanıza yardımcı olması için iOS/macOS için MSAL'de Günlüğe Kaydetme'yi etkinleştirmeyi göz önünde bulundurun.