Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Buradan başlamadan önce uygulama nesnesini nasıl başlatabileceğinizi anladığınızdan emin olun.
MSAL'deki oturum açma API'leri, oturum açmış bir kullanıcı için authorization code karşılığında alınabilen bir ID belirteci, ek bir kaynak için onay kapsamları ve uygulamanızın API'yi güvenli bir şekilde çağırabilmesini sağlamak üzere kullanıcının onayladığı kapsamları içeren bir erişim belirteci alır.
Etkileşim Türü Seçme
loginRedirect ile loginPopup arasındaki farklardan emin değilseniz buraya bakın.
Kullanıcının oturumunu açma
Oturum açma API'lerine bir istek nesnesi geçirmeniz gerekir. Bu nesne, istekte farklı parametreler kullanmanıza olanak tanır. İstek nesnesi parametreleri hakkında daha fazla bilgi için buraya bakın.
Oturum açma istekleri için tüm parametreler isteğe bağlıdır, bu nedenle boş bir nesne gönderebilirsiniz.
- Popup
try {
const loginResponse = await msalInstance.loginPopup({});
} catch (err) {
// handle error
}
- Redirect
try {
msalInstance.loginRedirect({});
} catch (err) {
// handle error
}
Alternatif olarak, aşağıdakilere önceden onay vermek için bir kapsam kümesi de gönderebilirsiniz:
- Popup
var loginRequest = {
scopes: ["user.read", "mail.send"] // optional Array<string>
};
try {
const loginResponse = await msalInstance.loginPopup(loginRequest);
} catch (err) {
// handle error
}
- Redirect
var loginRequest = {
scopes: ["user.read", "mail.send"] // optional Array<string>
};
try {
msalInstance.loginRedirect(loginRequest);
} catch (err) {
// handle error
}
Hesap API'leri
Oturum açma araması başarılı olduğunda, şu anda oturum açmış kullanıcılar hakkındaki bilgileri almak için işlevini kullanabilirsiniz getAllAccounts() .
const myAccounts: AccountInfo[] = msalInstance.getAllAccounts();
Hesap bilgilerini biliyorsanız, API'yi kullanarak getAccount() hesap bilgilerini de alabilirsiniz:
const username = "test@contoso.com";
const myAccount: AccountInfo = msalInstance.getAccount({ username });
const homeAccountId = "userid.hometenantid"; // Best to retrieve the homeAccountId from an account object previously obtained through msal
const myAccount: AccountInfo = msalInstance.getAccount({ homeAccountId });
Note
username ile filtreleme, kullanım kolaylığı sağlamak için sunulmaktadır ve homeAccountId temelinde arama yapmaya göre daha az güvenilir olduğu kabul edilmelidir. Mümkün olduğunda kullanın homeAccountId.
B2C senaryolarında, getAccount() API’sinde username filtresini kullanabilmek için B2C kiracınızın idTokens üzerinde emails claim’ini döndürecek şekilde yapılandırılması gerekir.
Bu API'ler aşağıdaki imzaya sahip bir hesap nesnesi veya hesap nesneleri dizisi döndürür:
{
// home account identifier for this account object
homeAccountId: string;
// Entity who issued the token represented as a full host of it (e.g. login.microsoftonline.com)
environment: string;
// Full tenant or organizational id that this account belongs to
tenantId: string;
// preferred_username claim of the id_token that represents this account.
username: string;
};
ssoSilent() ile sessiz oturum açma
Kimlik doğrulama sunucusuyla zaten var olan bir oturum varsa, etkileşim olmadan belirteç isteklerinde bulunmak için ssoSilent() API'sini kullanabilirsiniz.
Kullanıcı İpucuyla
Kullanıcının oturum açma bilgilerine zaten sahipseniz, performansı artırmak ve yetkilendirme sunucusunun doğru hesap oturumunu aramasını sağlamak için bunu API'ye geçirebilirsiniz. Bir belirteci sessizce başarıyla almak için istek nesnesine aşağıdakilerden birini geçirebilirsiniz.
login_hintisteğe bağlı kimlik belirteci talep değerinden (ssoSilent'ye loginHint olarak sağlanan) yararlanmanız önerilir; çünkü bu, sessiz (ve etkileşimli) istekler için en güvenilir hesap ipucudur.
-
account( hesap API'lerinden biri kullanılarak alınabilir) -
sid(biraccountnesnesininidTokenClaimsöğesinden alınabilen) -
login_hint(aşağıdaki yollarla alınabilir)- Hesap nesnesinin
loginHintözelliği olarak (önerilir) - Hesap nesnesinin
login_hintkimlik belirteci talebi olarak (önerilir) - Hesap nesnesinin
usernameözelliği olarak (önerilmez) - Hesap nesnesinin
upnkimlik belirteci talebi olarak (önerilmez)
- Hesap nesnesinin
Note
username ve upn özellikleri, gerçek login_hint talep yerine kısmen desteklenir, ancak önerilmez. Mevcutsa loginHint veya idTokenClaims.login_hint hesap özelliklerini kullanın.
Bir hesap iletildiğinde, önce login_hint isteğe bağlı ID belirteci talebi (tercih edilir), ardından sid isteğe bağlı id belirteci talebi aranır; bunlar bulunamazsa loginHint (sağlanmışsa) ya da hesap kullanıcı adına geri dönülür.
const account = msalInstance.getAllAccounts()[0];
const silentRequest = {
scopes: ["User.Read", "Mail.Read"],
loginHint: account.loginHint, // alternatively, account.idTokenClaims.login_hint
};
try {
const loginResponse = await msalInstance.ssoSilent(silentRequest);
} catch (err) {
if (err instanceof InteractionRequiredAuthError) {
const loginResponse = await msalInstance.loginPopup(silentRequest).catch(error => {
// handle error
});
} else {
// handle error
}
}
Kullanıcı İpucu Olmadan
Kullanıcı hakkında yeterli bilgi yoksa, ssoSilent API’yi göndermeden bir account, sid veya login_hint kullanmayı deneyebilirsiniz.
const silentRequest = {
scopes: ["User.Read", "Mail.Read"]
};
Ancak, uygulamanızın tek bir tarayıcı oturumunda birden çok kullanıcı için kod yolları varsa veya kullanıcının bu tek tarayıcı oturumu için birden çok hesabı varsa, sessiz oturum açma hataları olasılığı daha yüksektir. Yetkilendirme sunucusu birden fazla hesap oturumu algıladığında aşağıdaki hata görüntülenebilir:
InteractionRequiredAuthError: interaction_required: AADSTS16000: Either multiple user identities are available for the current request or selected account is not supported for the scenario.
Bu, sunucunun hangi hesapta oturum açacağını belirleyemediğini ve hesabı seçmek için yukarıdaki parametrelerden birini (account, login_hint, sid) veya etkileşimli bir oturum açmayı gerektirdiğini gösterir.
Warning
ssoSilent kullanıldığında hizmet, yeniden yönlendirme URI’si sayfanızı görünmez bir gömülü iframe içinde yüklemeye çalışır. ve gibi X-FRAME-OPTIONS: DENY uygulamanızın yeniden yönlendirme URI sayfası yanıtında bulunan içerik güvenlik ilkeleri ve X-FRAME-OPTIONS: SAMEORIGINHTTP üst bilgi değerleri, uygulamanızın iframe'e yüklenmesini önleyerek sessiz SSO'nun etkili bir şekilde engellenmesini sağlayabilir. kullanmayı ssoSilentplanlıyorsanız, yeniden yönlendirme URI'sinin bu tür ilkeler uygulamayan bir sayfaya işaretdiğinden emin olun.
RedirectUri Ile İlgili Dikkat Edilmesi Gerekenler
Tüm kimlik doğrulama akışları artık MSAL yeniden yönlendirme köprüsünü uygulayan ayrılmış bir yeniden yönlendirme sayfası gerektirir . Bu, COOP (Cross-Origin-Opener-Policy) başlıklarını desteklemek ve açılır pencereler/iframe’ler ile ana uygulama arasında güvenli iletişimi etkinleştirmek için gereklidir.
Yeniden yönlendirme sayfasını ayarlama
redirectUri öğeniz, yeniden yönlendirme köprüsü komut dosyasını yükleyen özel bir sayfayı işaret etmelidir. Bu sayfa şu şekilde olmalıdır:
- Yeniden yönlendirme köprüsü betiğini yükleme - Bu betik ana pencereyle iletişimi işler
- Köprü betiği dışında javascript içermez - Yeniden yönlendirme sayfası yalnızca köprü betiğini çalıştırmalıdır
- Yönlendirme mantığını içermez - Karma işlemeyi engelleyebilecek yönlendirici kitaplıklarından kaçının
- Uygulama Kaydınıza kayıtlı olun - URI'nin Azure portalında kayıtlı olanlarla tam olarak eşleşmesi gerekir
Örnek yeniden yönlendirme sayfası (Vite veya Webpack gibi bir paketleyici kullanırken):
<!DOCTYPE html>
<html>
<head>
<title>Redirect</title>
</head>
<body>
<p>Processing authentication...</p>
<script type="module">
import { broadcastResponseToMainFrame } from "@azure/msal-browser/redirect-bridge";
broadcastResponseToMainFrame();
</script>
</body>
</html>
Note
Tanımlayıcı @azure/msal-browser/redirect-bridge bir paketleyici (Vite, Webpack vb.) tarafından çözümlenmelidir; tarayıcıların doğrudan getirebileceği bir URL değildir. Çerçeveye özgü yönergeler için Yeniden Yönlendirme Köprüsü kurulum kılavuzuna bakın.
Configuration
redirectUri öğesini MSAL yapılandırmanızın genelinde veya her istek için ayrı ayrı ayarlayabilirsiniz:
Genel yapılandırma:
const msalConfig = {
auth: {
clientId: "your-client-id",
authority: "https://login.microsoftonline.com/common",
redirectUri: "http://localhost:3000/redirect"
}
};
const msalInstance = new PublicClientApplication(msalConfig);
İstek başına yapılandırma:
msalInstance.loginPopup({
scopes: ["user.read"],
redirectUri: "http://localhost:3000/redirect"
});
Daha fazla bilgi edinmek ve örnek uygulamaları tamamlamak için bkz:
Açılır pencere interaction_in_progress hatalarının işlenmesi
Açılır pencere akışlarında, bekleyen bir etkileşimi iptal etmek ve yeni bir etkileşim başlatmak için overrideInteractionInProgress işaretini kullanabilirsiniz. Bu, kullanıcının bir açılır pencere iptal ettiği veya etkileşimin başarısız olduğu kurtarma senaryoları için kullanışlıdır.
Note
Bu özellik yalnızca açılır akışlarda kullanılabilir ve yeniden yönlendirme akışları için desteklenmez. COOP (Cross-Origin-Opener-Policy) başlığıyla geleneksel window.opener bağlantısı kesilir ve açılır pencerelerin ana çerçeveyle yalnızca BroadcastChannel üzerinden iletişim kurmasına olanak tanınır.
Important
Bunun true olarak ayarlanması, bekleyen tüm açılır pencere kimlik doğrulama isteklerini zorla iptal eder; ancak açık açılır pencereleri kapatmaz.
olarak trueayarlandığında:
- Şu anda devam eden başka bir açılır pencere etkileşimi varsa, zorla iptal edilir ancak açık olan açılır pencereler kapatılamaz
- Bekleyen etkileşim,
interaction_in_progress_cancelledhatasıyla reddedilir - Yeni açılır pencere akışı hemen başlar.
Geçerli kullanım örnekleri:
- Kullanıcının açılır pencereyi iptal ettiği durumlarda oluşan hatalardan kurtarma (açılır pencere, kimlik doğrulama tamamlanmadan kapatıldı)
- Özel hata kurtarma akışları uygulama
- Başarısız bir açılır pencere etkileşiminden sonra "yeniden deneme" mekanizması sunma
Varsayılan:false
Önemli: Yalnızca düğme tıklamada kullan
Hata yakalarken interaction_in_progress. Geçersiz kılma yalnızca açık bir kullanıcı eylemi (bir "Yeniden Dene" düğmesine tıklama gibi) tarafından tetiklenmelidir. Etkileşimlerin otomatik olarak geçersiz kılınmış olması şu nedenlere yol açabilir:
- Birden çok kimlik doğrulama akışı arasındaki yarış koşulları
- Meşru kimlik doğrulama girişimlerinin beklenmeyen iptalleri
- Kimlik doğrulama akışlarının beklenmedik bir şekilde başlatılması ve durdurulmasıyla ilgili kötü kullanıcı deneyimi
- Başarılı kimlik doğrulama yanıtlarıyla sonuçlanmayan çok sayıda açık açılır pencere
Örnek: Kullanıcı tarafından tetiklenen yeniden deneme ile düzgün hata işleme
Görsel geri bildirim içeren eksiksiz uygulamalar için bkz:
- Express Sample — Özel CSS ile JavaScript uygulamasını gösterir
- React Router Örneği — Material-UI bileşenleriyle React uygulamasını gösterir
Her iki örnek de şu şekildedir:
- Açılır pencere kimlik doğrulaması sırasında görüntülenen uyarı iletisi
-
interaction_in_progresshatası oluştuğunda net açıklamalı yeniden deneme modali/iletişim kutusu - Kullanıcı tarafından tetiklenen yeniden deneme için uygun durum yönetimi
- Üretime hazır kullanıcı arabirimi bileşenleri
// State to track if user wants to retry
let userWantsRetry = false;
// Button click handler
async function handleLoginClick() {
try {
const loginRequest = {
scopes: ["user.read"]
};
// If user explicitly clicked retry, override the existing interaction
if (userWantsRetry) {
loginRequest.overrideInteractionInProgress = true;
userWantsRetry = false; // Reset flag
}
const response = await msalInstance.loginPopup(loginRequest);
// Handle successful login
} catch (error) {
if (error.errorCode === 'interaction_in_progress') {
// Show retry button to user - DO NOT automatically retry
showRetryButton();
} else {
// Handle other errors
console.error(error);
}
}
}
// Retry button click handler
function handleRetryClick() {
userWantsRetry = true; // Set flag for next login attempt
handleLoginClick(); // User explicitly requested retry
}
Örnek: Kullanıcı tarafından tetiklenen yeniden deneme ile React bileşeni
function LoginButton() {
const { instance } = useMsal();
const [showRetry, setShowRetry] = useState(false);
const [retryRequested, setRetryRequested] = useState(false);
const handleLogin = async () => {
try {
const loginRequest = {
scopes: ["user.read"],
// Only override if user clicked the retry button
overrideInteractionInProgress: retryRequested
};
setRetryRequested(false); // Reset retry flag
const response = await instance.loginPopup(loginRequest);
setShowRetry(false);
} catch (error) {
if (error.errorCode === 'interaction_in_progress') {
// Show retry button - let user decide whether to retry
setShowRetry(true);
} else {
console.error(error);
}
}
};
const handleRetry = () => {
setRetryRequested(true); // User explicitly requested retry
handleLogin();
};
return (
<div>
<button onClick={handleLogin}>Login</button>
{showRetry && (
<button onClick={handleRetry}>
Retry Login (Cancel Pending)
</button>
)}
</div>
);
}
Sonraki Adımlar
Erişim belirtecini nasıl edineceğinizi ve kullanacağınızı öğrenin!