Een REST API aanroepen met behulp van aangepast Azure Active Directory B2C-beleid
Met aangepast azure Active Directory B2C-beleid (Azure AD B2C) kunt u communiceren met toepassingslogica die u buiten Azure AD B2C implementeert. Hiervoor maakt u een HTTP-aanroep naar een eindpunt. Aangepast azure AD B2C-beleid biedt hiervoor RESTful-technisch profiel. Met deze mogelijkheid kunt u functies implementeren die niet beschikbaar zijn in aangepast Azure AD B2C-beleid.
In dit artikel leert u het volgende:
Maak en implementeer een voorbeeld van een Node.js-app voor gebruik als een RESTful-service.
Maak een HTTP-aanroep naar de RESTful-service Node.js met behulp van het RESTful-technische profiel.
Verwerkt of rapporteert een fout die een RESTful-service retourneert naar uw aangepaste beleid.
Overzicht van scenario
In Vertakking maken in gebruikerstraject met behulp van aangepast azure AD B2C-beleid, moeten gebruikers die persoonlijk account selecteren, een geldige toegangscode voor uitnodigingen opgeven om door te gaan. We gebruiken een statische toegangscode, maar echte apps werken niet op deze manier. Als de service die de toegangscodes uitgeeft zich buiten uw aangepaste beleid bevindt, moet u een aanroep naar die service maken en de invoer van de toegangscode doorgeven door de gebruiker voor validatie. Als de toegangscode geldig is, retourneert de service een HTTP-antwoord 200 OK
en geeft Azure AD B2C JWT-token uit. Anders retourneert de service een HTTP-antwoord 409 Conflict
en moet de gebruiker een toegangscode opnieuw invoeren.
Vereisten
Als u er nog geen hebt, maakt u een Azure AD B2C-tenant die is gekoppeld aan uw Azure-abonnement.
Registreer een webtoepassing en schakel impliciete toekenning van id-token in. Gebruik voor de omleidings-URI https://jwt.ms.
U moet Node.js op uw computer hebben geïnstalleerd.
Visual Studio Code (VS Code) moet op uw computer zijn geïnstalleerd.
Voer de stappen uit in Invoer van gebruikers valideren met behulp van aangepast Azure AD B2C-beleid. Dit artikel maakt deel uit van de reeks instructies voor het maken en uitvoeren van uw eigen aangepaste beleidsregels.
Notitie
Dit artikel maakt deel uit van de reeks instructies voor het maken en uitvoeren van uw eigen aangepaste beleidsregels in Azure Active Directory B2C. We raden u aan deze reeks te starten vanuit het eerste artikel.
Stap 1: een Node.js-app maken en implementeren
U moet een app implementeren die fungeert als uw externe app. Uw aangepaste beleid maakt vervolgens een HTTP-aanroep naar deze app.
Stap 1.1: de Node.js-app maken
Maak een map voor het hosten van uw knooppunttoepassing, zoals
access-code-app
.Wijzig in de terminal de map van de Node-app, zoals
cd access-code-app
en voer deze uitnpm init -y
. Met deze opdracht maakt u een standaardbestandpackage.json
voor uw Node.js-project.Voer
npm install express body-parser
uit in uw terminal. Met deze opdracht installeert u het Express-framework en het body-parser-pakket .Maak
index.js
een bestand in uw project.Open het
index.js
bestand in VS Code en voeg de volgende code toe:const express = require('express'); let bodyParser = require('body-parser') //Create an express instance const app = express(); app.use( bodyParser.json() ); // to support JSON-encoded bodies app.use(bodyParser.urlencoded({ // to support URL-encoded bodies extended: true })); app.post('/validate-accesscode', (req, res) => { let accessCode = '88888'; if(accessCode == req.body.accessCode){ res.status(200).send(); }else{ let errorResponse = { "version" :"1.0", "status" : 409, "code" : "errorCode", "requestId": "requestId", "userMessage" : "The access code you entered is incorrect. Please try again.", "developerMessage" : `The provided code ${req.body.accessCode} does not match the expected code for user.`, "moreInfo" :"https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations" }; res.status(409).send(errorResponse); } }); app.listen(80, () => { console.log(`Access code service listening on port !` + 80); });
U kunt zien dat wanneer een gebruiker een verkeerde toegangscode indient, u rechtstreeks vanuit de REST API een fout kunt retourneren. Met aangepast beleid kunt u een HTTP 4xx-foutbericht retourneren, zoals 400 (ongeldige aanvraag) of 409 -antwoordstatuscode met een JSON-antwoordtekst die is opgemaakt in
errorResponse
de variabele. De bron van de accessCode in de app kan worden gelezen uit een database. Meer informatie over het retourneren van een validatiefoutbericht.Als u wilt testen of de app werkt zoals verwacht, gebruikt u de volgende stappen:
- Voer in de terminal de opdracht uit om de
node index.js
app-server te starten. - Als u een POST-aanvraag wilt maken die vergelijkbaar is met de aanvraag die in dit voorbeeld wordt weergegeven, kunt u een HTTP-client zoals Microsoft PowerShell of Postman gebruiken:
POST http://localhost/validate-accesscode HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded accessCode=user-code-code
Vervang
user-code-code
door een invoer van een toegangscode door de gebruiker, zoals54321
. Als u PowerShell gebruikt, voert u het volgende script uit.$accessCode="54321" $endpoint="http://localhost/validate-accesscode" $body=$accessCode $response=Invoke-RestMethod -Method Post -Uri $endpoint -Body $body echo $response
Als u een onjuiste toegangscode gebruikt, lijkt het antwoord op het volgende JSON-fragment:
{ "version": "1.0", "status": 409, "code": "errorCode", "requestId": "requestId", "userMessage": "The access code you entered is incorrect. Please try again.", "developerMessage": "The provided code 54321 does not match the expected code for user.", "moreInfo": "https://docs.microsoft.com/en-us/azure/active-directory-b2c/string-transformations" }
- Voer in de terminal de opdracht uit om de
Op dit moment bent u klaar om uw Node.js-app te implementeren.
Stap 1.2: de Node.js-app implementeren in Azure-app Service
Uw aangepaste beleid moet bereikbaar zijn om uw Node.js-app te bereiken. Daarom moet u het beleid implementeren. In dit artikel implementeert u de app met behulp van Azure-app Service, maar u gebruikt een alternatieve hostingbenadering.
Volg de stappen in Uw app implementeren in Azure om uw Node.js-app in Azure te implementeren. Gebruik voor de naam van de app een beschrijvende naam, zoals custompolicyapi
. Vandaar:
App-URL ziet er ongeveer als
https://custompolicyapi.azurewebsites.net
volgt uit.Service-eindpunt ziet er ongeveer als
https://custompolicyapi.azurewebsites.net/validate-accesscode
volgt uit.
U kunt de app testen die u hebt geïmplementeerd met behulp van een HTTP-client zoals Microsoft PowerShell of Postman. Gebruik deze keer https://custompolicyapi.azurewebsites.net/validate-accesscode
de URL als het eindpunt.
Stap 2: de REST API aanroepen
Nu uw app wordt uitgevoerd, moet u een HTTP-aanroep uitvoeren vanuit uw aangepaste beleid. Aangepast Azure AD B2C-beleid biedt een RESTful-technisch profiel dat u gebruikt om een externe service aan te roepen.
Stap 2.1: een RESTful-technisch profiel definiëren
Zoek in het ContosoCustomPolicy.XML
bestand de ClaimsProviders
sectie en definieer een nieuw RESTful-technisch profiel met behulp van de volgende code:
<!--<ClaimsProviders>-->
<ClaimsProvider>
<DisplayName>HTTP Request Technical Profiles</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="ValidateAccessCodeViaHttp">
<DisplayName>Check that the user has entered a valid access code by using Claims Transformations</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ServiceUrl">https://custompolicyapi.azurewebsites.net/validate-accesscode</Item>
<Item Key="SendClaimsIn">Body</Item>
<Item Key="AuthenticationType">None</Item>
<Item Key="AllowInsecureAuthInProduction">true</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="accessCode" PartnerClaimType="accessCode" />
</InputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<!--</ClaimsProviders>-->
Vanuit het protocol kunt u zien dat we het technische profiel zo configureren dat de RestfulProvider wordt gebruikt. U kunt ook de volgende informatie bekijken in de sectie met metagegevens:
Het
ServiceUrl
vertegenwoordigt het API-eindpunt. De waarde ishttps://custompolicyapi.azurewebsites.net/validate-accesscode
. Als u uw Node.js-app hebt geïmplementeerd met een alternatieve methode, moet u de eindpuntwaarde bijwerken.SendClaimsIn
geeft aan hoe de invoerclaims worden verzonden naar de RESTful-claimprovider. Mogelijke waarden:Body (default)
,Form
, ,Header
ofQueryString
Url
. Wanneer uBody
, zoals in dit artikel, de POST HTTP-term aanroept en de gegevens die u naar de API verzendt als deze zijn opgemaakt als sleutel, waardeparen in de hoofdtekst van de aanvraag. Meer informatie over het aanroepen van het GET HTTP-werkwoord en het doorgeven van gegevens als querytekenreeks.AuthenticationType
geeft het type verificatie op dat de RESTful-claimprovider uitvoert. Onze RESTful-claimprovider roept een niet-beveiligd eindpunt aan, dus stellen we onzeAuthenticationType
in op Geen. Als u het verificatietypeBearer
instelt op, moet u een Cryptografischekeys-element toevoegen, waarmee de opslag voor uw toegangstoken wordt opgegeven. Meer informatie over de typen verificatie die door de RESTful-claimprovider worden ondersteund.Het kenmerk PartnerClaimType in de
InputClaim
geeft aan hoe u uw gegevens in de API ontvangt.
Stap 2.2: technisch profiel voor validatie bijwerken
In Vertakking maken in gebruikerstraject met behulp van aangepast Azure AD B2C-beleid hebt u de accessCode gevalideerd met behulp van een claimtransformatie. In dit artikel valideert u de toegangscode door een HTTP-aanroep naar een externe service uit te voeren. Daarom moet u uw aangepaste beleid bijwerken om de nieuwe benadering weer te geven.
Zoek het technische profiel AccessCodeInputCollector en werk de ReferenceId van het element ValidationTechnicalProfile bij naar ValidateAccessCodeViaHttp:
Van:
<ValidationTechnicalProfile ReferenceId="CheckAccessCodeViaClaimsTransformationChecker"/>
in:
<ValidationTechnicalProfile ReferenceId="ValidateAccessCodeViaHttp"/>
Op dit moment is het technische profiel met Id
CheckAccessCodeViaClaimsTransformationChecker niet nodig en kan het worden verwijderd.
Stap 3: Aangepast beleidsbestand uploaden
Zorg ervoor dat uw Node.js-app wordt uitgevoerd en volg de stappen in het aangepaste beleidsbestand uploaden om uw beleidsbestand te uploaden. Als u een bestand met dezelfde naam uploadt als het bestand dat zich al in de portal bevindt, moet u het aangepaste beleid overschrijven selecteren als dit al bestaat.
Stap 4: het aangepaste beleid testen
Volg de stappen in Het aangepaste beleid testen om uw aangepaste beleid te testen:
- Voor accounttype selecteert u Persoonlijk account
- Voer de rest van de details in zoals vereist en selecteer Vervolgens Doorgaan. U ziet een nieuw scherm.
- Voor toegangscode voert u 88888 in en selecteert u Doorgaan. Nadat het beleid is uitgevoerd, wordt u omgeleid naar
https://jwt.ms
en ziet u een gedecodeerd JWT-token. Als u de procedure herhaalt en een andere toegangscode invoert dan 88888, ziet u een foutmelding: De ingevoerde toegangscode is onjuist. Probeer het opnieuw.
Stap 5: foutopsporingsmodus inschakelen
In ontwikkeling wilt u mogelijk gedetailleerde fouten zien die door de API worden verzonden, zoals developerMessage en moreInfo. In dit geval moet u de foutopsporingsmodus inschakelen in uw RESTful-technische provider.
Zoek de technische provider ValidateAccessCodeViaHttp en voeg het volgende item toe aan de technische provider
metadata
:<Item Key="DebugMode">true</Item>
Sla de wijzigingen op en upload het beleidsbestand.
Test uw aangepaste beleid. Zorg ervoor dat u een verkeerde invoer voor uw toegangscode gebruikt. Er wordt een fout weergegeven die vergelijkbaar is met de fout die in deze schermafbeelding wordt weergegeven:
JSON-nettoladingen van complexe aanvragen verwerken
Als voor de REST API die u aanroept, een complexe JSON-nettolading moet worden verzonden, kunt u de nettolading maken met behulp van transformaties van GenerateJson JSON-claims. Zodra u de nettolading hebt gegenereerd, kunt u de optie metagegevens gebruiken ClaimUsedForRequestPayload
om de naam van de claim met de JSON-nettolading te gebruiken.
Gebruik bijvoorbeeld de volgende claimtransformatie om een JSON-nettolading te genereren:
<ClaimsTransformation Id="GenerateRequestBodyClaimsTransformation" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="customerEntity.email" />
<InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="customerEntity.userObjectId" />
<InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="customerEntity.firstName" />
<InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="customerEntity.lastName" />
<InputClaim ClaimTypeReferenceId="accessCode" TransformationClaimType="customerEntity.accessCode" />
</InputClaims>
<InputParameters>
<InputParameter Id="customerEntity.role.name" DataType="string" Value="Administrator" />
<InputParameter Id="customerEntity.role.id" DataType="long" Value="1" />
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="requestBodyPayload" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
De ClaimsTransformation genereert het volgende JSON-object:
{
"customerEntity":{
"email":"john.s@contoso.com",
"userObjectId":"01234567-89ab-cdef-0123-456789abcdef",
"firstName":"John",
"lastName":"Smith",
"accessCode":"88888",
"role":{
"name":"Administrator",
"id": 1
}
}
}
Werk vervolgens de metagegevens, InputClaimsTransformations en InputClaims van uw RESTful-technische provider bij, zoals hieronder wordt weergegeven:
<Metadata>
<Item Key="ClaimUsedForRequestPayload">requestBodyPayload</Item>
<!--Other Metadata items -->
</Metadata>
<!--Execute your InputClaimsTransformations to generate your request Payload-->
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="GenerateRequestBodyClaimsTransformation" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="requestBodyPayload" />
</InputClaims>
Gegevens ontvangen van REST API
Als uw REST API gegevens retourneert die u wilt opnemen als claims in uw beleid, kunt u deze ontvangen door claims op te geven in het OutputClaims
element van het RESTful-technische profiel. Als de naam van de claim die in uw beleid is gedefinieerd, verschilt van de naam die is gedefinieerd in de REST API, moet u deze namen toewijzen met behulp van het PartnerClaimType
kenmerk.
Gebruik de stappen in Ontvangen van gegevens om te leren hoe u de gegevens opmaakt die door het aangepaste beleid worden verwacht, hoe null-waarden moeten worden verwerkt en hoe u REST de geneste JSON-hoofdtekst van de API kunt parseren.
Volgende stappen
Vervolgens leert u: