Desktopová aplikace, která volá webová rozhraní API: Získání tokenu pomocí WAM
Microsoft Authentication Library (MSAL) volá Správce webových účtů (WAM), komponentu Windows 10+, která funguje jako zprostředkovatel ověřování. Zprostředkovatel umožňuje uživatelům vaší aplikace využívat integraci s účty známými pro Windows, například účet, který jste se přihlásili k relaci Windows.
Návrh hodnoty WAM
Použití zprostředkovatele ověřování, jako je WAM, má řadu výhod:
- Lepší zabezpečení. Viz Ochrana tokenů.
- Podpora klíčů Windows Hello, podmíněného přístupu a FIDO
- Integrace se zobrazením e-mailů a účtů systému Windows
- Rychlé jednotné přihlašování.
- Možnost přihlásit se bezobslužně pomocí aktuálního účtu Windows.
- Opravy chyb a vylepšení dodávaná s Windows
Omezení WAM
- WAM je k dispozici ve Windows 10 a novějších verzích a v systémech Windows Server 2019 a novějších. V systémech Mac, Linux a starších verzích Windows se knihovna MSAL automaticky vrátí do prohlížeče.
- Autority Azure Active Directory B2C (Azure AD B2C) a Active Directory Federation Services (AD FS) (AD FS) se nepodporují. Knihovna MSAL se vrátí do prohlížeče.
Integrační balíček WAM
Většina aplikací musí odkazovat na Microsoft.Identity.Client.Broker
balíček, aby tuto integraci používala. Aplikace .NET MAUI to nemusí dělat, protože funkce se nachází uvnitř knihovny MSAL, pokud je net6-windows
cíl a novější.
Model volání WAM
Pro WAM můžete použít následující vzor:
// 1. Configuration - read below about redirect URI
var pca = PublicClientApplicationBuilder.Create("client_id")
.WithBroker(new BrokerOptions(BrokerOptions.OperatingSystems.Windows))
.Build();
// Add a token cache; see https://learn.microsoft.com/azure/active-directory/develop/msal-net-token-cache-serialization?tabs=desktop
// 2. Find an account for silent login
// Is there an account in the cache?
IAccount accountToLogin = (await pca.GetAccountsAsync()).FirstOrDefault();
if (accountToLogin == null)
{
// 3. No account in the cache; try to log in with the OS account
accountToLogin = PublicClientApplication.OperatingSystemAccount;
}
try
{
// 4. Silent authentication
var authResult = await pca.AcquireTokenSilent(new[] { "User.Read" }, accountToLogin)
.ExecuteAsync();
}
// Cannot log in silently - most likely Azure AD would show a consent dialog or the user needs to re-enter credentials
catch (MsalUiRequiredException)
{
// 5. Interactive authentication
var authResult = await pca.AcquireTokenInteractive(new[] { "User.Read" })
.WithAccount(accountToLogin)
// This is mandatory so that WAM is correctly parented to your app; read on for more guidance
.WithParentActivityOrWindow(myWindowHandle)
.ExecuteAsync();
// Consider allowing the user to re-authenticate with a different account, by calling AcquireTokenInteractive again
}
Pokud zprostředkovatel není (například Windows 8.1, Mac nebo Linux), MSAL se vrátí do prohlížeče, kde platí pravidla identifikátoru URI přesměrování.
URI pro přesměrování
V knihovně MSAL nemusíte konfigurovat identifikátory URI přesměrování WAM, ale musíte je nakonfigurovat v registraci aplikace:
ms-appx-web://microsoft.aad.brokerplugin/{client_id}
Trvalost mezipaměti tokenů
Je důležité zachovat mezipaměť tokenů MSAL, protože SLUŽBA MSAL tam nadále ukládá tokeny ID a metadata účtu. Další informace naleznete v tématu Serializace mezipaměti tokenů v MSAL.NET.
Účet pro tiché přihlášení
Pokud chcete najít účet pro tiché přihlášení, doporučujeme tento vzor:
- Pokud se uživatel dříve přihlásil, použijte tento účet. Pokud ne, použijte
PublicClientApplication.OperatingSystemAccount
pro aktuální účet Windows. - Umožňuje uživateli přejít na jiný účet interaktivním přihlášením.
Nadřazené úchyty oken
Nástroj MSAL musíte nakonfigurovat s oknem, na které má být interaktivní prostředí nadřazené pomocí WithParentActivityOrWindow
rozhraní API.
Aplikace uživatelského rozhraní
U aplikací uživatelského rozhraní, jako jsou model Windows Forms (WinForms), Windows Presentation Foundation (WPF) nebo Windows UI Library verze 3 (WinUI3), najdete v tématu Načtení popisovače okna.
Konzolové aplikace
Pro konzolové aplikace je konfigurace více zapojena z důvodu okna terminálu a jeho karet. Použijte následující kód:
enum GetAncestorFlags
{
GetParent = 1,
GetRoot = 2,
/// <summary>
/// Retrieves the owned root window by walking the chain of parent and owner windows returned by GetParent.
/// </summary>
GetRootOwner = 3
}
/// <summary>
/// Retrieves the handle to the ancestor of the specified window.
/// </summary>
/// <param name="hwnd">A handle to the window whose ancestor will be retrieved.
/// If this parameter is the desktop window, the function returns NULL. </param>
/// <param name="flags">The ancestor to be retrieved.</param>
/// <returns>The return value is the handle to the ancestor window.</returns>
[DllImport("user32.dll", ExactSpelling = true)]
static extern IntPtr GetAncestor(IntPtr hwnd, GetAncestorFlags flags);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
// This is your window handle!
public IntPtr GetConsoleOrTerminalWindow()
{
IntPtr consoleHandle = GetConsoleWindow();
IntPtr handle = GetAncestor(consoleHandle, GetAncestorFlags.GetRootOwner );
return handle;
}
Řešení problému
Chybová zpráva "Výběr účtu WAM nevrátil účet"
Zpráva "Výběr účtu WAM nevrátila účet" značí, že buď uživatel aplikace zavřel dialogové okno, ve které se zobrazují účty, nebo samotný dialog se chybově ukončil. K chybovému ukončení může dojít, pokud AccountsControl
je v systému Windows nesprávně zaregistrován ovládací prvek Windows. Tento problém vyřešíte takto:
Na hlavním panelu klikněte pravým tlačítkem na Start a pak vyberte Windows PowerShell (správce).
Pokud se zobrazí výzva dialogového okna Řízení uživatelských účtů, vyberte Ano a spusťte PowerShell.
Zkopírujte a spusťte následující skript:
if (-not (Get-AppxPackage Microsoft.AccountsControl)) { Add-AppxPackage -Register "$env:windir\SystemApps\Microsoft.AccountsControl_cw5n1h2txyewy\AppxManifest.xml" -DisableDevelopmentMode -ForceApplicationShutdown } Get-AppxPackage Microsoft.AccountsControl
Chybová zpráva MsalClientException: ErrorCode: wam_runtime_init_failed během nasazení jednoho souboru
Při balení aplikace do jedné sady souborů se může zobrazit následující chyba:
MsalClientException: wam_runtime_init_failed: The type initializer for 'Microsoft.Identity.Client.NativeInterop.API' threw an exception. See https://aka.ms/msal-net-wam#troubleshooting
Tato chyba značí, že nativní binární soubory z Microsoft.Identity.Client.NativeInterop nebyly zabaleny do jedné sady souborů. Chcete-li vložit tyto soubory pro extrakci a získat jeden výstupní soubor, nastavte vlastnost IncludeNativeLibrariesForSelfExtract
na true
. Přečtěte si další informace o tom, jak zabalit nativní binární soubory do jednoho souboru.
Problémy s připojením
Pokud se uživateli aplikace pravidelně zobrazuje chybová zpráva podobná "Zkontrolujte připojení a zkuste to znovu", přečtěte si průvodce odstraňováním potíží pro Office. Tento průvodce odstraňováním potíží používá také zprostředkovatele.
Vzorek
Ukázku WPF, která používá WAM , najdete na GitHubu.
Další kroky
Přejděte k dalšímu článku v tomto scénáři volání webového rozhraní API z desktopové aplikace.