Delen via


Bureaublad-app die web-API's aanroept: een token interactief verkrijgen

In het volgende voorbeeld ziet u minimale code om een token interactief op te halen voor het lezen van het gebruikersprofiel met Microsoft Graph.

Code in MSAL.NET

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();
}

Verplichte parameters

AcquireTokenInteractive heeft slechts één verplichte parameter, scopes. Het bevat een opsomming van tekenreeksen waarmee de bereiken worden gedefinieerd waarvoor een token is vereist. Als het token voor Microsoft Graph is, kunt u de vereiste bereiken vinden in de API-verwijzing van elke Microsoft Graph API in de sectie 'Machtigingen'. Als u bijvoorbeeld de contactpersonen van de gebruiker wilt weergeven, moet u zowel User.Read als Contacts.Read als het bereik gebruiken. Raadpleeg Microsoft Graph-machtigingen voor meer informatie.

In zowel desktoptoepassingen als mobiele toepassingen is het belangrijk om het bovenliggende item op te geven met behulp van .WithParentActivityOrWindow. In veel gevallen is het een vereiste en MSAL genereert uitzonderingen.

Zie Voor bureaubladtoepassingen de bovenliggende venstergrepen.

Geef Activity voor mobiele toepassingen (Android) of (iOS) op UIViewController .

Optionele parameters in MSAL.NET

WithParentActivityOrWindow

De gebruikersinterface is belangrijk omdat deze interactief is. AcquireTokenInteractive heeft één specifieke optionele parameter die (voor platforms die deze ondersteunen) de bovenliggende gebruikersinterface kan opgeven. Wanneer u in een bureaubladtoepassing gebruikt .WithParentActivityOrWindow , heeft deze een ander type dat afhankelijk is van het platform.

U kunt ook de optionele bovenliggende vensterparameter weglaten om een venster te maken als u niet wilt bepalen waar het aanmeldingsdialoogvenster op het scherm wordt weergegeven. Deze optie is van toepassing op toepassingen die zijn gebaseerd op een opdrachtregel, worden gebruikt om aanroepen door te geven aan een andere back-endservice en hebben geen vensters nodig voor gebruikersinteractie.

// 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).

Opmerkingen:

  • In .NET Standard bevindt de verwachte object waarde zich Activity op Android, UIViewController in iOS, NSWindow op Mac en IWin32Window windows IntPr .

  • In Windows moet u aanroepen AcquireTokenInteractive vanuit de UI-thread, zodat de ingesloten browser de juiste context voor ui-synchronisatie krijgt. Het niet aanroepen van de UI-thread kan ertoe leiden dat berichten niet goed worden gepompt en impassescenario's met de gebruikersinterface veroorzaken. Een manier om de Microsoft Authentication Library (MSAL) aan te roepen vanuit de UI-thread als u zich nog niet in de UI-thread bevindt, is om te gebruiken Dispatcher op Windows Presentation Foundation (WPF).

  • Als u WPF gebruikt, kunt u de WindowInteropHelper.Handle klasse gebruiken om een venster op te halen van een WPF-besturingselement. Vervolgens is de aanroep afkomstig van een WPF-besturingselement (this):

    result = await app.AcquireTokenInteractive(scopes)
                      .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
                      .ExecuteAsync();
    

WithPrompt

U gebruikt WithPrompt() om de interactiviteit met de gebruiker te beheren door een prompt op te geven. U kunt het exacte gedrag bepalen met behulp van de structuur Microsoft.Identity.Client.Prompt .

De structuur definieert de volgende constanten:

  • SelectAccount dwingt de beveiligingstokenservice (STS) om het dialoogvenster accountselectie weer te geven dat accounts bevat waarvoor de gebruiker een sessie heeft. Dit is de standaardoptie. Het is handig als u gebruikers wilt laten kiezen uit verschillende identiteiten.

    Met deze optie stuurt MSAL prompt=select_account naar de id-provider. Het biedt de best mogelijke ervaring op basis van beschikbare informatie, zoals het account en de aanwezigheid van een sessie voor de gebruiker. Wijzig het alleen als u een goede reden hebt.

  • Consent hiermee kunt u afdwingen dat de gebruiker om toestemming wordt gevraagd, zelfs als de toepassing daarvoor toestemming heeft verleend. In dit geval verzendt MSAL prompt=consent naar de id-provider. U kunt deze optie gebruiken in sommige toepassingen die zijn gericht op beveiliging, waarbij het governancevenster van de organisatie vereist dat het toestemmingsdialoogvenster telkens wordt weergegeven wanneer de gebruiker de toepassing opent.

  • ForceLogin hiermee kunt u de gebruiker vragen om referenties, zelfs als deze gebruikersprompt mogelijk niet nodig is. Deze optie kan handig zijn om de gebruiker opnieuw aan te melden als het ophalen van tokens mislukt. In dit geval verzendt MSAL prompt=login naar de id-provider. Organisaties gebruiken deze optie soms in op beveiliging gerichte toepassingen waarbij governance vereist dat gebruikers zich telkens aanmelden wanneer ze toegang hebben tot specifieke onderdelen van een toepassing.

  • Create activeert een registratie-ervaring voor externe identiteiten door deze naar de id-provider te verzenden prompt=create . Azure Active Directory B2C-apps (Azure AD B2C) mogen deze prompt niet verzenden. Zie Een selfservicegebruikersstroom voor registratie toevoegen aan een app voor meer informatie.

  • Never (Alleen voor .NET 4.5 en Windows Runtime) wordt de gebruiker niet gevraagd. In plaats daarvan wordt geprobeerd de cookie te gebruiken die is opgeslagen in de verborgen ingesloten webweergave.

    Het gebruik van deze optie kan mislukken. In dat geval AcquireTokenInteractive genereert u een uitzondering om u op de hoogte te stellen dat u een interactie met de gebruikersinterface nodig hebt. Gebruik vervolgens een andere Prompt parameter.

  • NoPrompt stuurt geen prompt naar de id-provider. De id-provider bepaalt welke aanmeldingservaring het beste is voor de gebruiker (eenmalige aanmelding of selecteer account).

    Deze optie is verplicht voor het bewerken van profielbeleid in Azure AD B2C. Zie Azure AD B2C-specifieke informatie voor meer informatie.

WithUseEmbeddedWebView

Met deze methode kunt u opgeven of u het gebruik van een ingesloten webweergave of de systeemwebweergave wilt afdwingen (indien beschikbaar). Zie Usage of web browsers (Gebruik van webbrowsers) voor meer informatie.

var result = await app.AcquireTokenInteractive(scopes)
                    .WithUseEmbeddedWebView(true)
                    .ExecuteAsync();

WithExtraScopeToConsent

Deze wijzigingsfunctie is bedoeld voor geavanceerde scenario's waarin u wilt dat de gebruiker toestemming geeft voor verschillende resources en u geen incrementele toestemming wilt gebruiken. Ontwikkelaars gebruiken normaal gesproken incrementele toestemming met MSAL.NET en het Microsoft Identity Platform. Zie De toestemming van de gebruiker vooraf hebben voor verschillende resources voor meer informatie.

var result = await app.AcquireTokenInteractive(scopesForCustomerApi)
                     .WithExtraScopeToConsent(scopesForVendorApi)
                     .ExecuteAsync();

WithCustomWebUi

Een webgebruikersinterface is een mechanisme om een browser aan te roepen. Dit mechanisme kan een toegewezen webbrowserbesturingselement voor de gebruikersinterface zijn of een manier om het openen van de browser te delegeren. MSAL biedt implementaties van webgebruikersinterfaces voor de meeste platforms, maar in deze gevallen wilt u de browser mogelijk zelf hosten:

  • U hebt platforms die MSAL niet expliciet beslaat, zoals Blazor, Unity en Mono op desktops.
  • U wilt uw toepassing testen en een geautomatiseerde browser gebruiken die kan worden gebruikt met Selenium.
  • De browser en de app waarop MSAL wordt uitgevoerd, bevinden zich in afzonderlijke processen.

Om dit te bereiken, geeft u MSAL start Url, die moet worden weergegeven in een browser, zodat gebruikers items zoals hun gebruikersnaam kunnen invoeren. Nadat de verificatie is voltooid, moet uw app terugkeren naar MSAL end Url, dat een code bevat die microsoft Entra-id biedt. De host is end Url altijd redirectUri. Als u wilt onderscheppen end Url, voert u een van de volgende handelingen uit:

  • Controleer browseromleidingen totdat redirect Url deze is bereikt.
  • Laat de browser omleiden naar een URL die u bewaakt.

WithCustomWebUi is een uitbreidbaarheidspunt dat u kunt gebruiken om uw eigen gebruikersinterface in openbare clienttoepassingen te bieden. U kunt gebruikers ook het eindpunt van de id-provider laten doorlopen /Authorize en hen zich laten aanmelden en toestemming geven. MSAL.NET kunt vervolgens de verificatiecode inwisselen en een token ophalen.

U kunt bijvoorbeeld in Visual Studio electron-toepassingen (bijvoorbeeld Visual Studio Feedback) gebruiken WithCustomWebUi om de webinteractie te bieden, maar laat het aan MSAL.NET om het meeste werk uit te voeren. U kunt ook gebruiken WithCustomWebUi als u ui-automatisering wilt bieden.

In openbare clienttoepassingen gebruikt MSAL.NET de PKCE-standaard (Proof Key for Code Exchange) om ervoor te zorgen dat de beveiliging wordt gerespecteerd. Alleen MSAL.NET kan de code inwisselen. Zie RFC 7636 - Proof Key for Code Exchange by OAuth Public Clients voor meer informatie.

using Microsoft.Identity.Client.Extensions;
Gebruiken metCustomWebUI

Voer de volgende stappen uit om te gebruiken WithCustomWebUI:

  1. Implementeer de ICustomWebUi-interface. Zie deze GitHub-pagina voor meer informatie.

  2. Implementeer één AcquireAuthorizationCodeAsyncmethode en accepteer de URL van de autorisatiecode die MSAL.NET berekeningen.

  3. Laat de gebruiker de interactie met de id-provider doorlopen en de URL retourneren die de id-provider heeft gebruikt om uw implementatie terug te roepen, samen met de autorisatiecode. Als u problemen ondervindt, moet uw implementatie een MsalExtensionException uitzondering genereren om samen te werken met MSAL.

  4. Gebruik in uw AcquireTokenInteractive aanroep de .WithCustomUI() wijzigingsfunctie door het exemplaar van uw aangepaste webgebruikersinterface door te geven:

    result = await app.AcquireTokenInteractive(scopes)
                      .WithCustomWebUi(yourCustomWebUI)
                      .ExecuteAsync();
    

Het MSAL.NET team heeft de UI-tests herschreven om dit uitbreidbaarheidsmechanisme te gebruiken. Als u geïnteresseerd bent, bekijkt u de SeleniumWebUI-klasse in de MSAL.NET broncode.

Een geweldige ervaring bieden met SystemWebViewOptions

Vanuit MSAL.NET 4.1 SystemWebViewOptionskunt u het volgende opgeven:

  • De URI naar (BrowserRedirectError) of het HTML-fragment om weer te geven (HtmlMessageError) als aanmeldings- of toestemmingsfouten worden weergegeven in de webbrowser van het systeem.
  • De URI om naar (BrowserRedirectSuccess) of het HTML-fragment te gaan om weer te geven (HtmlMessageSuccess) als aanmelden of toestemming is geslaagd.
  • De actie die moet worden uitgevoerd om de systeembrowser te starten. U kunt uw eigen implementatie opgeven door de OpenBrowserAsync gedelegeerde in te stellen. De klasse biedt ook een standaard implementatie voor twee browsers: OpenWithEdgeBrowserAsync voor Microsoft Edge en OpenWithChromeEdgeBrowserAsync voor Microsoft Edge op Chromium.

Als u deze structuur wilt gebruiken, schrijft u iets zoals in het volgende voorbeeld:

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();

Andere optionele parameters

Zie AcquireTokenInteractiveParameterBuilder voor meer informatie over de andere optionele parameters voorAcquireTokenInteractive.

Volgende stappen

Ga verder met het volgende artikel in dit scenario, Een web-API aanroepen vanuit de desktop-app.