訓練
認證
Microsoft Certified: Identity and Access Administrator Associate - Certifications
示範 Microsoft Entra ID 的功能,以現代化身分識別解決方案、實作混合式解決方案,以及實作身分識別治理。
適用於:具有白色複選標記符號的 Workforce 租使用者
外部租使用者(深入瞭解)
下列範例顯示以最少程式碼透過互動方式取得權杖,以使用 Microsoft Graph 讀取使用者的設定檔。
string[] scopes = new string[] { "user.read" };
var app = PublicClientApplicationBuilder.Create("YOUR_CLIENT_ID")
.WithDefaultRedirectUri()
.Build();
var accounts = await app.GetAccountsAsync();
AuthenticationResult result;
try
{
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.ExecuteAsync();
}
catch (MsalUiRequiredException)
{
result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
}
AcquireTokenInteractive
只有一個強制參數,scopes
。 它包含字串的列舉,這些字串會定義需要權杖的範圍。 如果權杖是用於 Microsoft Graph,則您可以在名為「權限」的區段中,於每個 Microsoft Graph API 的 API 參考中找到所需的範圍。例如,若要 列出用戶的聯繫人 ,您必須同時使用 User.Read
和 Contacts.Read
作為範圍。 如需詳細資訊,請參閱 Microsoft Graph 權限參考。
在桌面和行動應用程式上,請務必使用 .WithParentActivityOrWindow
來指定父代。 在許多情況下,這是一項需求,而且 MSAL 會引發例外狀況。
針對桌面應用程式,請參閱 父視窗控制代碼。
針對行動應用程式,提供 Activity
(Android) 或 UIViewController
(iOS)。
UI 很重要,因為其為互動式的。
AcquireTokenInteractive
具有一個特定的可選參數,可以(針對支援的平台)指定其父 UI。 在桌面應用程式中使用 .WithParentActivityOrWindow
時,它的類型會根據平台而有所不同。
或者,如果您不想要控制登入對話方塊出現在畫面的位置,則可以省略選擇性的父視窗參數來建立視窗。 這個選項適用於以命令行為基礎的應用程式,用於將呼叫傳遞至任何其他後端服務,而不需要任何視窗來進行用戶互動。
// net45
WithParentActivityOrWindow(IntPtr windowPtr)
WithParentActivityOrWindow(IWin32Window window)
// Mac
WithParentActivityOrWindow(NSWindow window)
// .NET Standard (this will be on all platforms at runtime, but only on .NET Standard platforms at build time)
WithParentActivityOrWindow(object parent).
備註:
在 .NET Standard 上,預期的 object
值在 Android 上為 Activity
、在 iOS 上為 UIViewController
、在 Mac 上為 NSWindow
,以及在 Windows 上為 IWin32Window
或 IntPr
。
在 Windows 上,您必須從 UI 執行緒呼叫 AcquireTokenInteractive
,讓內嵌瀏覽器取得適當的 UI 同步處理內容。 若不是從 UI 執行緒呼叫,可能會導致訊息無法正確處理,從而引發與 UI 的死鎖情況。 如果您尚未在 UI 執行緒上,則從 UI 執行緒呼叫 Microsoft 驗證程式庫 (MSAL) 的其中一種方式,是在 Windows Presentation Foundation (WPF) 上使用 Dispatcher
。
如果您使用的是 WPF,若要從 WPF 控制項取得視窗,可以使用 WindowInteropHelper.Handle
類別。 然後呼叫是來自 WPF 控制項 (this
):
result = await app.AcquireTokenInteractive(scopes)
.WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
.ExecuteAsync();
您使用 WithPrompt()
來透過指定提示,以控制使用者的互動性。 您可以使用 Microsoft.Identity.Client.Prompt 結構來控制確切的行為。
結構會定義下列常數:
SelectAccount
強制安全權杖服務 (STS) 呈現包含使用者當前工作階段的帳戶的帳戶選擇對話方塊。 這個選項是預設值。 當您想要讓使用者在不同的身分識別之間選擇時,這會很有用。
此選項會驅動 MSAL,以將 prompt=select_account
傳送至識別提供者。 它會根據可用資訊提供最佳體驗,例如帳戶資訊和用戶會話的存在。 除非您有充分的理由,否則請不要對其進行變更。
Consent
可讓您強制提示使用者同意,即使之前應用程式已授與同意亦然。 在此情況下,MSAL 會將 prompt=consent
傳送給識別提供者。 您可以在某些以安全性為主的應用程式中使用此選項,在組織治理要求每次使用者開啟應用程式時,向使用者顯示同意對話方塊。
ForceLogin
可讓您讓應用程式提示使用者輸入認證,即使可能不需要此使用者提示也一樣。 如果取得權杖失敗,此選項有助於讓使用者再次登入。 在此情況下,MSAL 會將 prompt=login
傳送給識別提供者。 組織有時會在以安全性為主的應用程式中使用此選項,其中治理要求使用者在每次存取應用程式的特定部分時登入。
Create
會透過將 prompt=create
傳送至識別提供者,以觸發用於外部身分識別的註冊體驗。 Azure Active Directory B2C (Azure AD B2C) 應用程式不應該傳送此提示。 如需詳細資訊,請參閱將自助註冊使用者流程新增至應用程式。
Never
(僅限 .NET 4.5 和 Windows 執行階段) 不會提示使用者。 相反地,它會嘗試使用儲存在隱藏內嵌網頁檢視中的 Cookie。
使用此選項可能會失敗。 在此情況下,AcquireTokenInteractive
會擲回例外狀況,通知您需要 UI 互動。 然後使用另一個 Prompt
參數。
NoPrompt
不會將任何提示傳送給識別提供者。 身分識別提供者會決定哪個登入體驗最適合使用者(單一登錄或選取帳戶)。
此選項是編輯 Azure AD B2C 中配置文件原則的必要選項。 如需詳細資訊,請參閱 Azure AD B2C 詳細資料。
這個方法可讓您指定是否要強制使用內嵌的 WebView 或系統 WebView (可用時)。 如需詳細資訊,請參閱網頁瀏覽器的使用方式。
var result = await app.AcquireTokenInteractive(scopes)
.WithUseEmbeddedWebView(true)
.ExecuteAsync();
此修飾元適用於您希望使用者事先同意數個資源的進階案例,而且您不想使用增量同意。 開發人員通常會使用增量同意搭配 MSAL.NET 和 Microsoft 身分識別平台。
var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
.WithExtraScopeToConsent(scopesForVendorApi)
.ExecuteAsync();
Web UI 是用來叫用瀏覽器的機制。 這種機制可以是專用的 UI WebBrowser 控制項或委派開啟瀏覽器的方式。 MSAL 為大部分的平台提供 web UI 實作,但在這些情況下,您可能會想要自行裝載瀏覽器:
為達此目的,您會提供 MSAL start Url
,這需要在瀏覽器中顯示,以便使用者可以輸入例如使用者名稱等項目。 驗證完成之後,您的應用程式必須傳送回 MSAL end Url
,其中包含 Microsoft Entra ID 提供的程式碼。
end Url
的主機一律為 redirectUri
。 若要攔截 end Url
,請執行下列其中一項動作:
redirect Url
為止。
WithCustomWebUi
是擴充點,可用來在公用用戶端應用程式中提供您自己的 UI。 您也可以讓使用者通過識別提供者的 /Authorize
端點,並讓他們登入和同意。 接著,MSAL.NET 可以兌換驗證碼並取得 token。
例如,您可以使用 Visual Studio 中的 WithCustomWebUi
讓 Electron 應用程式(例如 Visual Studio 意見反應)提供 Web 互動,但將其保留給 MSAL.NET 來執行大部分的工作。 如果您想要提供 UI 自動化,也可以使用 WithCustomWebUi
。
在公用用戶端應用程式中,MSAL.NET 會使用程式碼交換證明金鑰 (PKCE) 標準,以確保遵守安全性。 只有 MSAL.NET 可以兌換程式碼。 如需詳細資訊,請參閱 RFC 7636 - OAuth 公用用戶端的程式碼交換證明金鑰。
using Microsoft.Identity.Client.Extensions;
若要使用 WithCustomWebUI
,請遵循下列步驟:
實作 ICustomWebUi
介面。 如需詳細資訊,請參閱此 GitHub 頁面。
實作一個 AcquireAuthorizationCodeAsync
方法,並接受 MSAL.NET 所計算的授權碼 URL。
讓使用者與識別提供者進行身份驗證互動,並返回識別提供者用於回呼到您實作的 URL 和授權碼。 如果您有任何問題,則您的實作應該拋出 MsalExtensionException
例外,以便與 MSAL 合作。
在您的 AcquireTokenInteractive
呼叫中,使用 .WithCustomUI()
修飾元時,傳遞您的自訂網頁 UI 的實例:
result = await app.AcquireTokenInteractive(scopes)
.WithCustomWebUi(yourCustomWebUI)
.ExecuteAsync();
MSAL.NET 小組已重新撰寫 UI 測試,以使用此擴充性機制。 如果您想了解,請查看 MSAL.NET 原始程式碼中的 SeleniumWebUI 類別。
從 MSAL.NET 4.1 SystemWebViewOptions
中,您可以指定:
BrowserRedirectError
) 或所要顯示的 HTML 片段 (HtmlMessageError
)。BrowserRedirectSuccess
) 或所要顯示的 HTML 片段 (HtmlMessageSuccess
)。OpenBrowserAsync
委託來提供自己的實作方式。 類別也提供兩個瀏覽器的預設實作:適用於 Microsoft Edge 的 OpenWithEdgeBrowserAsync
以及 OpenWithChromeEdgeBrowserAsync
的 。若要使用這個結構,請撰寫如下列範例所示的內容:
IPublicClientApplication app;
...
options = new SystemWebViewOptions
{
HtmlMessageError = "<b>Sign-in failed. You can close this tab ...</b>",
BrowserRedirectSuccess = "https://contoso.com/help-for-my-awesome-commandline-tool.html"
};
var result = app.AcquireTokenInteractive(scopes)
.WithEmbeddedWebView(false) // The default in .NET
.WithSystemWebViewOptions(options)
.Build();
若要深入了解 AcquireTokenInteractive
的其他選用參數,請參閱 AcquireTokenInteractiveParameterBuilder。
訓練
認證
Microsoft Certified: Identity and Access Administrator Associate - Certifications
示範 Microsoft Entra ID 的功能,以現代化身分識別解決方案、實作混合式解決方案,以及實作身分識別治理。