OAuth 2.0-autorisatiecodestroom in Azure Active Directory B2C

U kunt de OAuth 2.0-autorisatiecode verlenen in apps die op een apparaat zijn geïnstalleerd om toegang te krijgen tot beveiligde resources, zoals web-API's. Met behulp van de Implementatie van Azure Active Directory B2C (Azure AD B2C) van OAuth 2.0 kunt u registratie-, aanmeldings- en andere identiteitsbeheertaken toevoegen aan uw apps met één pagina, mobiel en bureaublad. Dit artikel is taalonafhankelijk. In het artikel beschrijven we hoe u HTTP-berichten verzendt en ontvangt zonder opensource-bibliotheken te gebruiken. Indien mogelijk raden we u aan de ondersteunde Microsoft Authentication Libraries (MSAL) te gebruiken. Bekijk de voorbeeld-apps die GEBRUIKMAKEN van MSAL.

De OAuth 2.0-autorisatiecodestroom wordt beschreven in sectie 4.1 van de OAuth 2.0-specificatie. U kunt deze gebruiken voor verificatie en autorisatie in de meeste toepassingstypen, waaronder webtoepassingen, toepassingen met één pagina en systeemeigen geïnstalleerde toepassingen. U kunt de OAuth 2.0-autorisatiecodestroom gebruiken om veilig toegangstokens te verkrijgen en tokens te vernieuwen voor uw toepassingen, die kunnen worden gebruikt voor toegang tot resources die worden beveiligd door een autorisatieserver. Met het vernieuwingstoken kan de client nieuwe toegangstokens verkrijgen (en vernieuwen) zodra het toegangstoken is verlopen, meestal na één uur.

Dit artikel is gericht op de OAuth 2.0-autorisatiecodestroom van openbare clients . Een openbare client is een clienttoepassing die niet kan worden vertrouwd om de integriteit van een geheim wachtwoord veilig te behouden. Dit omvat toepassingen met één pagina, mobiele apps, bureaubladtoepassingen en in feite elke toepassing die niet op een server wordt uitgevoerd.

Notitie

Als u identiteitsbeheer wilt toevoegen aan een web-app met behulp van Azure AD B2C, gebruikt u OpenID Connect in plaats van OAuth 2.0.

Azure AD B2C breidt de standaard OAuth 2.0-stromen uit om meer dan eenvoudige verificatie en autorisatie uit te voeren. De gebruikersstroom wordt geïntroduceerd. Met gebruikersstromen kunt u OAuth 2.0 gebruiken om gebruikerservaringen toe te voegen aan uw toepassing, zoals registratie, aanmelding en profielbeheer. Id-providers die gebruikmaken van het OAuth 2.0-protocol zijn Amazon, Azure Active Directory, Facebook, GitHub, Google en LinkedIn.

Ga als volgt te werk om de HTTP-aanvragen in dit artikel uit te proberen:

  1. Vervang {tenant} door de naam van uw Azure AD B2C-tenant.
  2. Vervang 90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 door de app-id van een toepassing die u eerder hebt geregistreerd in uw Azure AD B2C-tenant.
  3. Vervang {policy} bijvoorbeeld door de naam van een beleid dat u in uw tenant b2c_1_sign_inhebt gemaakt.

Configuratie van omleidings-URI vereist voor apps met één pagina

Voor de autorisatiecodestroom voor toepassingen met één pagina is extra installatie vereist. Volg de instructies voor het maken van uw toepassing met één pagina om uw omleidings-URI correct te markeren als ingeschakeld voor CORS. Als u een bestaande omleidings-URI wilt bijwerken om CORS in te schakelen, klikt u op de migratieprompt in de sectie Web van het tabblad Verificatie van de app-registratie. U kunt ook de App-registraties manifesteditor openen en het type veld instellen voor uw omleidings-URI spa in de replyUrlsWithType sectie.

Het spa omleidingstype is achterwaarts compatibel met de impliciete stroom. Apps die momenteel gebruikmaken van de impliciete stroom om tokens op te halen, kunnen zonder problemen naar het spa omleidings-URI-type worden verplaatst en de impliciete stroom blijven gebruiken.

1. Een autorisatiecode ophalen

De autorisatiecodestroom begint met de client die de gebruiker naar het /authorize eindpunt leidt. Dit is het interactieve deel van de stroom, waarbij de gebruiker actie onderneemt. In deze aanvraag geeft de client in de scope parameter de machtigingen aan die de client moet verkrijgen van de gebruiker. In de volgende voorbeelden (met regeleinden voor leesbaarheid) ziet u hoe u een autorisatiecode kunt verkrijgen. Als u deze GET HTTP-aanvraag test, gebruikt u uw browser.

GET https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?
client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6
&response_type=code
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&response_mode=query
&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6%20offline_access%20https://{tenant-name}/{app-id-uri}/{scope}
&state=arbitrary_data_you_can_receive_in_the_response
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256
Parameter Vereist? Beschrijving
{tenant} Vereist Naam van uw Azure AD B2C-tenant
{policy} Vereist De gebruikersstroom die moet worden uitgevoerd. Geef de naam op van een gebruikersstroom die u hebt gemaakt in uw Azure AD B2C-tenant. Bijvoorbeeld: b2c_1_sign_in, b2c_1_sign_up, of b2c_1_edit_profile.
client_id Vereist De toepassings-id die is toegewezen aan uw app in de Azure Portal.
response_type Vereist Het antwoordtype, dat moet zijn opgenomen code voor de autorisatiecodestroom. U kunt een id-token ontvangen als u het opneemt in het antwoordtype, zoals code+id_token, en in dit geval moet het bereik worden opgenomen openid.
redirect_uri Vereist De omleidings-URI van uw app, waar verificatiereacties worden verzonden en ontvangen door uw app. Deze moet exact overeenkomen met een van de omleidings-URI's die u hebt geregistreerd in de portal, behalve dat deze URL-gecodeerd moet zijn.
scope Vereist Een door spaties gescheiden lijst met bereiken. Het openid bereik geeft een machtiging aan om de gebruiker aan te melden en gegevens over de gebruiker op te halen in de vorm van id-tokens. Het offline_access bereik is optioneel voor webtoepassingen. Het geeft aan dat uw toepassing een vernieuwingstoken nodig heeft voor uitgebreide toegang tot resources. De client-id geeft aan dat het uitgegeven token is bedoeld voor gebruik door Azure AD B2C geregistreerde client. Hiermee https://{tenant-name}/{app-id-uri}/{scope} wordt een machtiging aangegeven voor beveiligde resources, zoals een web-API. Zie Een toegangstoken aanvragen voor meer informatie.
response_mode Aanbevolen De methode die u gebruikt om de resulterende autorisatiecode terug te sturen naar uw app. Het kan zijn query, form_postof fragment.
staat Aanbevolen Een waarde die is opgenomen in de aanvraag die een tekenreeks kan zijn van alle inhoud die u wilt gebruiken. Meestal wordt een willekeurig gegenereerde unieke waarde gebruikt om vervalsingsaanvallen op meerdere sites te voorkomen. De status wordt ook gebruikt om informatie over de status van de gebruiker in de app te coderen voordat de verificatieaanvraag is opgetreden. De pagina waarop de gebruiker zich bevond, of de gebruikersstroom die werd uitgevoerd.
Prompt Optioneel Het type gebruikersinteractie dat vereist is. Momenteel is loginde enige geldige waarde, waardoor de gebruiker zijn referenties op die aanvraag moet invoeren. Eenmalige aanmelding wordt niet van kracht.
code_challenge aanbevolen/vereist Wordt gebruikt om autorisatiecode te beveiligen via Proof Key for Code Exchange (PKCE). Vereist indien code_challenge_method inbegrepen. U moet logica toevoegen in uw toepassing om de code_verifier en code_challengete genereren. Het code_challenge is een BASE64-URL-gecodeerde SHA256-hash van de code_verifier. U slaat de code_verifier toepassing op voor later gebruik en verzendt de code_challenge samen met de autorisatieaanvraag. Zie de PKCE RFC voor meer informatie. Dit wordt nu aanbevolen voor alle toepassingstypen: systeemeigen apps, SPA's en vertrouwelijke clients, zoals web-apps.
code_challenge_method aanbevolen/vereist De methode die wordt gebruikt om de code_verifiercode_challenge parameter te coderen. Dit moet zijn S256, maar de specificatie staat het gebruik toe van plain als om een of andere reden de client sha256 niet kan ondersteunen.

Als u de code_challenge_method, maar nog steeds de , dan code_challengewordt ervan uitgegaan dat het code_challenge tekst zonder opmaak is. Microsoft identity platform ondersteunt zowel plain als S256. Zie de PKCE RFC voor meer informatie. Dit is vereist voor apps met één pagina met behulp van de autorisatiecodestroom.
login_hint Nee Kan worden gebruikt om het aanmeldingsnaamveld van de aanmeldingspagina vooraf in te vullen. Zie De aanmeldingsnaam vooraf vullen voor meer informatie.
domain_hint Nee Biedt een hint voor Azure AD B2C over de id-provider voor sociale netwerken die moet worden gebruikt voor aanmelding. Als er een geldige waarde is opgenomen, gaat de gebruiker rechtstreeks naar de aanmeldingspagina van de id-provider. Zie Aanmelden omleiden naar een sociale provider voor meer informatie.
Aangepaste parameters Nee Aangepaste parameters die kunnen worden gebruikt met aangepast beleid. Bijvoorbeeld dynamische aangepaste pagina-inhouds-URI of sleutel-waarde claim resolvers.

Op dit moment wordt de gebruiker gevraagd de werkstroom van de gebruikersstroom te voltooien. Dit kan betekenen dat de gebruiker zijn gebruikersnaam en wachtwoord invoert, zich aanmeldt met een sociale identiteit, zich registreert voor de directory of een ander aantal stappen. Gebruikersacties zijn afhankelijk van de wijze waarop de gebruikersstroom wordt gedefinieerd.

Nadat de gebruiker de gebruikersstroom heeft voltooid, retourneert Azure AD een antwoord op uw app op de waarde die u hebt gebruikt voor redirect_uri. Hierbij wordt de methode gebruikt die is opgegeven in de response_mode parameter. Het antwoord is precies hetzelfde voor elk van de gebruikersactiescenario's, onafhankelijk van de gebruikersstroom die is uitgevoerd.

Een geslaagd antwoord dat gebruikmaakt response_mode=query , ziet er als volgt uit:

GET urn:ietf:wg:oauth:2.0:oob?
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...        // the authorization_code, truncated
&state=arbitrary_data_you_can_receive_in_the_response                // the value provided in the request
Parameter Beschrijving
code De autorisatiecode die de app heeft aangevraagd. De app kan de autorisatiecode gebruiken om een toegangstoken aan te vragen voor een doelresource. Autorisatiecodes zijn zeer kortstondig. Normaal gesproken verlopen ze na ongeveer 10 minuten.
staat Zie de volledige beschrijving in de tabel in de vorige sectie. Als een state parameter is opgenomen in de aanvraag, moet dezelfde waarde worden weergegeven in het antwoord. De app moet controleren of de state waarden in de aanvraag en het antwoord identiek zijn.

Foutreacties kunnen ook worden verzonden naar de omleidings-URI, zodat de app deze op de juiste manier kan verwerken:

GET urn:ietf:wg:oauth:2.0:oob?
error=access_denied
&error_description=The+user+has+cancelled+entering+self-asserted+information
&state=arbitrary_data_you_can_receive_in_the_response
Parameter Beschrijving
fout Een foutcodetekenreeks die u kunt gebruiken om de typen fouten te classificeren die optreden. U kunt de tekenreeks ook gebruiken om te reageren op fouten.
error_description Een specifiek foutbericht waarmee u de hoofdoorzaak van een verificatiefout kunt identificeren.
staat Zie de volledige beschrijving in de voorgaande tabel. Als een state parameter is opgenomen in de aanvraag, moet dezelfde waarde worden weergegeven in het antwoord. De app moet controleren of de state waarden in de aanvraag en het antwoord identiek zijn.

2. Een toegangstoken ophalen

Nu u een autorisatiecode hebt verkregen, kunt u het code voor een token inwisselen naar de beoogde resource door een POST-aanvraag naar het /token eindpunt te verzenden. In Azure AD B2C kunt u zoals gebruikelijk toegangstokens aanvragen voor andere API's door hun bereik(en) in de aanvraag op te geven.

U kunt ook een toegangstoken aanvragen voor de eigen back-endweb-API van uw app volgens de conventie van het gebruik van de client-id van de app als het aangevraagde bereik (wat resulteert in een toegangstoken met die client-id als de doelgroep):

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&redirect_uri=urn:ietf:wg:oauth:2.0:oob&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong 
Parameter Vereist? Beschrijving
{tenant} Vereist Naam van uw Azure AD B2C-tenant
{policy} Vereist De gebruikersstroom die is gebruikt om de autorisatiecode te verkrijgen. U kunt in deze aanvraag geen andere gebruikersstroom gebruiken.
client_id Vereist De toepassings-id die is toegewezen aan uw app in de Azure Portal.
client_secret Ja, in Web Apps Het toepassingsgeheim dat is gegenereerd in de Azure Portal. Clientgeheimen worden gebruikt in deze stroom voor web-app-scenario's, waarbij de client veilig een clientgeheim kan opslaan. Voor systeemeigen app-scenario's (openbare client) kunnen clientgeheimen niet veilig worden opgeslagen en worden daarom niet gebruikt in deze aanroep. Als u een clientgeheim gebruikt, wijzigt u dit periodiek.
grant_type Vereist Het type subsidie. Voor de autorisatiecodestroom moet het toekenningstype zijn authorization_code.
scope Vereist Een door spaties gescheiden lijst met bereiken. Eén bereikwaarde geeft aan dat Azure AD beide machtigingen die worden aangevraagd. Het gebruik van de client-id als het bereik geeft aan dat uw app een toegangstoken nodig heeft dat kan worden gebruikt voor uw eigen service of web-API, vertegenwoordigd door dezelfde client-id. Het offline_access bereik geeft aan dat uw app een vernieuwingstoken nodig heeft voor langdurige toegang tot resources. U kunt ook het openid bereik gebruiken om een id-token aan te vragen van Azure AD B2C.
code Vereist De autorisatiecode die u hebt verkregen van het /authorize eindpunt.
redirect_uri Vereist De omleidings-URI van de toepassing waar u de autorisatiecode hebt ontvangen.
code_verifier Aanbevolen Hetzelfde code_verifier dat wordt gebruikt om de autorisatiecode te verkrijgen. Vereist als PKCE is gebruikt in de aanvraag voor het verlenen van autorisatiecode. Zie de PKCE RFC voor meer informatie.

Als u deze POST HTTP-aanvraag test, kunt u elke HTTP-client, zoals Microsoft PowerShell of Postman, gebruiken.

Een geslaagd tokenantwoord ziet er als volgt uit:

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
Parameter Beschrijving
not_before Het tijdstip waarop het token als geldig wordt beschouwd, in tijdsperiode.
token_type De waarde van het tokentype. Het enige type dat Azure AD ondersteunt, is Bearer.
access_token Het ondertekende JSON Web Token (JWT) dat u hebt aangevraagd.
scope De bereiken waarvoor het token geldig is. U kunt ook bereiken gebruiken om tokens op te cachen voor later gebruik.
expires_in De tijdsduur waarop het token geldig is (in seconden).
refresh_token Een OAuth 2.0-vernieuwingstoken. De app kan dit token gebruiken om extra tokens te verkrijgen nadat het huidige token is verlopen. Vernieuwingstokens hebben een lange levensduur. U kunt ze gebruiken om de toegang tot resources gedurende langere tijd te behouden. Zie de referentie Azure AD B2C-token voor meer informatie.

Foutreacties zien er als volgt uit:

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
Parameter Beschrijving
fout Een tekenreeks met foutcodes die u kunt gebruiken om de typen fouten te classificeren die optreden. U kunt de tekenreeks ook gebruiken om te reageren op fouten.
error_description Een specifiek foutbericht waarmee u de hoofdoorzaak van een verificatiefout kunt identificeren.

3. Het token gebruiken

Nu u een toegangstoken hebt verkregen, kunt u het token gebruiken in aanvragen voor uw back-endweb-API's door dit op te slaan in de Authorization header:

GET /tasks
Host: mytaskwebapi.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...

4. Het token vernieuwen

Toegangstokens en id-tokens zijn kortstondige. Nadat ze zijn verlopen, moet u ze vernieuwen om toegang te blijven krijgen tot resources. Wanneer u het toegangstoken vernieuwt, retourneert Azure AD B2C een nieuw token. Het vernieuwde toegangstoken heeft de claimwaarden bijgewerkt nbf (niet eerder), iat (uitgegeven op) en exp (vervaldatum). Alle andere claimwaarden zijn hetzelfde als het oorspronkelijk uitgegeven toegangstoken.

Als u het token wilt vernieuwen, dient u een andere POST-aanvraag in bij het /token eindpunt. Geef deze keer het refresh_token volgende op in plaats van het codevolgende:

POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&client_id=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6&scope=90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access&refresh_token=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...&redirect_uri=urn:ietf:wg:oauth:2.0:oob
Parameter Vereist? Beschrijving
{tenant} Vereist Naam van uw Azure AD B2C-tenant
{policy} Vereist De gebruikersstroom die is gebruikt om het oorspronkelijke vernieuwingstoken te verkrijgen. U kunt in deze aanvraag geen andere gebruikersstroom gebruiken.
client_id Vereist De toepassings-id die is toegewezen aan uw app in de Azure Portal.
client_secret Ja, in Web Apps Het toepassingsgeheim dat is gegenereerd in de Azure Portal. Clientgeheimen worden gebruikt in deze stroom voor web-app-scenario's, waarbij de client veilig een clientgeheim kan opslaan. Voor scenario's met systeemeigen apps (openbare client) kunnen clientgeheimen niet veilig worden opgeslagen en worden daarom niet gebruikt in deze aanroep. Als u een clientgeheim gebruikt, wijzigt u dit periodiek.
grant_type Vereist Het type subsidie. Voor dit deel van de autorisatiecodestroom moet het toekenningstype zijn refresh_token.
scope Aanbevolen Een door spaties gescheiden lijst met bereiken. Eén bereikwaarde geeft aan Azure AD beide machtigingen die worden aangevraagd. Het gebruik van de client-id als het bereik geeft aan dat uw app een toegangstoken nodig heeft dat kan worden gebruikt voor uw eigen service of web-API, vertegenwoordigd door dezelfde client-id. Het offline_access bereik geeft aan dat uw app een vernieuwingstoken nodig heeft voor langdurige toegang tot resources. U kunt het openid bereik ook gebruiken om een id-token aan te vragen van Azure AD B2C.
redirect_uri Optioneel De omleidings-URI van de toepassing waar u de autorisatiecode hebt ontvangen.
refresh_token Vereist Het oorspronkelijke vernieuwingstoken dat u in het tweede deel van de stroom hebt verkregen.

Een geslaagd tokenantwoord ziet er als volgt uit:

{
    "not_before": "1442340812",
    "token_type": "Bearer",
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
    "scope": "90c0fe63-bcf2-44d5-8fb7-b8bbc0b29dc6 offline_access",
    "expires_in": "3600",
    "refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
Parameter Beschrijving
not_before Het tijdstip waarop het token als geldig wordt beschouwd, in epoch time.
token_type De waarde van het tokentype. Het enige type dat Azure AD ondersteunt, is Bearer.
access_token De ondertekende JWT die u hebt aangevraagd.
scope De bereiken waarvoor het token geldig is. U kunt ook de bereiken gebruiken om tokens op te cachen voor later gebruik.
expires_in De tijdsduur waarop het token geldig is (in seconden).
refresh_token Een OAuth 2.0-vernieuwingstoken. De app kan dit token gebruiken om extra tokens te verkrijgen nadat het huidige token is verlopen. Vernieuwingstokens zijn langdurig en kunnen worden gebruikt om de toegang tot resources gedurende langere tijd te behouden. Zie de referentie Azure AD B2C-token voor meer informatie.

Foutreacties zien er als volgt uit:

{
    "error": "access_denied",
    "error_description": "The user revoked access to the app.",
}
Parameter Beschrijving
fout Een tekenreeks met foutcodes die u kunt gebruiken om typen fouten te classificeren die optreden. U kunt de tekenreeks ook gebruiken om te reageren op fouten.
error_description Een specifiek foutbericht waarmee u de hoofdoorzaak van een verificatiefout kunt identificeren.

Uw eigen Azure AD B2C-directory gebruiken

Voer de volgende stappen uit om deze aanvragen zelf uit te proberen. Vervang de voorbeeldwaarden die we in dit artikel hebben gebruikt door uw eigen waarden.

  1. Maak een Azure AD B2C-map. Gebruik de naam van uw map in de aanvragen.
  2. Maak een toepassing om een toepassings-id en een omleidings-URI te verkrijgen. Neem een systeemeigen client op in uw app.
  3. Maak uw gebruikersstromen om uw gebruikersstroomnamen op te halen.