Een stroom voor wachtwoordreferenties voor de resource-eigenaar instellen in Azure Active Directory B2C

Voordat u begint, gebruikt u de selector Een beleidstype kiezen om het type beleid te kiezen dat u instelt. U kunt in Azure Active Directory B2C op twee manieren definiƫren hoe gebruikers met uw toepassingen communiceren: via vooraf gedefinieerde gebruikersstromen of via volledig configureerbaar aangepast beleid. De stappen die in dit artikel zijn vereist, verschillen voor elke methode.

In Azure Active Directory B2C (Azure AD B2C) is de stroom wachtwoordreferenties van de resource-eigenaar (ROPC) een OAuth-standaardverificatiestroom. In deze stroom wisselt een toepassing, ook wel relying party genoemd, geldige referenties voor tokens uit. De referenties bevatten een gebruikers-id en wachtwoord. De geretourneerde tokens zijn een id-token, toegangstoken en een vernieuwingstoken.

Waarschuwing

U wordt aangeraden de ROPC-stroom niet te gebruiken. In de meeste scenario's zijn veiligere alternatieven beschikbaar en aanbevolen. Deze stroom vereist een zeer hoge mate van vertrouwen in de toepassing en draagt risico's die niet aanwezig zijn in andere stromen. U moet deze stroom alleen gebruiken wanneer andere veiligere stromen niet haalbaar zijn.

ROPC-stroomnotities

In Azure Active Directory B2C (Azure AD B2C) worden de volgende opties ondersteund:

  • Systeemeigen client: gebruikersinteractie tijdens verificatie vindt plaats wanneer code wordt uitgevoerd op een apparaat aan de gebruikerszijde. Het apparaat kan een mobiele toepassing zijn die wordt uitgevoerd in een systeemeigen besturingssysteem, zoals Android en iOS.
  • Openbare clientstroom: alleen gebruikersreferenties, verzameld door een toepassing, worden verzonden in de API-aanroep. De referenties van de toepassing worden niet verzonden.
  • Nieuwe claims toevoegen: de inhoud van het id-token kan worden gewijzigd om nieuwe claims toe te voegen.

De volgende stromen worden niet ondersteund:

  • Server-naar-server: het identiteitsbeveiligingssysteem heeft een betrouwbaar IP-adres nodig dat is verzameld door de beller (de systeemeigen client) als onderdeel van de interactie. In een API-aanroep aan de serverzijde wordt alleen het IP-adres van de server gebruikt. Als een dynamische drempelwaarde voor mislukte verificaties wordt overschreden, kan het identiteitsbeveiligingssysteem een herhaald IP-adres identificeren als aanvaller.
  • Vertrouwelijke clientstroom: de client-id van de toepassing wordt gevalideerd, maar het toepassingsgeheim wordt niet gevalideerd.

Houd rekening met het volgende wanneer u de ROPC-stroom gebruikt:

  • ROPC werkt niet wanneer er onderbrekingen zijn van de verificatiestroom die gebruikersinteractie nodig heeft. Wanneer bijvoorbeeld een wachtwoord is verlopen of moet worden gewijzigd, is meervoudige verificatie vereist of wanneer er meer informatie moet worden verzameld tijdens het aanmelden (bijvoorbeeld toestemming van de gebruiker).
  • ROPC ondersteunt alleen lokale accounts. Gebruikers kunnen zich niet aanmelden met federatieve id-providers zoals Microsoft, Google+, Twitter, AD-FS of Facebook.
  • Sessiebeheer, inclusief aangemeld blijven (KMSI) is niet van toepassing.

Een toepassing registreren

Als u een toepassing wilt registreren in de Azure AD B2C-tenant, kunt u de nieuwe uniforme ervaring voor App-registraties of de oude ervaring Toepassingen (verouderd) gebruiken. Meer informatie over de nieuwe ervaring.

  1. Meld u aan bij de Azure-portal.
  2. Zorg ervoor dat u de map gebruikt die uw Azure AD B2C-tenant bevat:
    1. Selecteer op de portalwerkbalk het pictogram Mappen + abonnementen.
    2. Ga op de pagina Portalinstellingen | Directory's en abonnementen naar uw Azure AD B2C-directory in de lijst Mapnaam en selecteer vervolgens Omzetten.
  3. Zoek en selecteer Azure AD B2C in Azure Portal
  4. Selecteer App-registraties en selecteer vervolgens Nieuwe registratie.
  5. Voer een naam in voor de toepassing. Bijvoorbeeld ROPC_Auth_app.
  6. Laat de andere waarden ongewijzigd en selecteer Registreren.
  7. Noteer de Toepassings-id (client) voor gebruik in een latere stap.
  8. Selecteer Verificatie onder Beheren.
  9. Selecteer De nieuwe ervaring proberen (indien weergegeven).
  10. Selecteer onder Geavanceerde instellingen en de sectie De volgende mobiele en bureaubladstromen inschakelen de optie Ja als u de toepassing als een openbare client wilt behandelen. Deze instelling is vereist voor de ROPC-stroom.
  11. Selecteer Opslaan.
  12. Selecteer Manifest in het linkermenu om de manifesteditor te openen.
  13. Stel het kenmerk oauth2AllowImplicitFlow in op true:
    "oauth2AllowImplicitFlow": true,
    
  14. Selecteer Opslaan.

Een gebruikersstroom voor de resource-eigenaar maken

  1. Meld u aan bij Azure Portal als globale beheerder van uw Azure AD B2C-tenant.
  2. Als u toegang hebt tot meerdere tenants, selecteert u het pictogram Instellingen in het bovenste menu om over te schakelen naar uw Azure AD B2C-tenant in het menu Mappen en abonnementen.
  3. Zoek en selecteer Azure AD B2C in de Azure-portal.
  4. Selecteer Gebruikersstromen en selecteer Nieuwe gebruikersstroom.
  5. Selecteer Aanmelden met wachtwoordreferenties van de resource-eigenaar (ROPC).
  6. Controleer onder Versie of Preview is geselecteerd en selecteer vervolgens Maken.
  7. Geef een naam op voor de gebruikersstroom, zoals ROPC_Auth.
  8. Selecteer onder Toepassingsclaims de optie Meer weergeven.
  9. Selecteer de toepassingsclaims die u nodig hebt voor uw toepassing, zoals weergavenaam, e-mailadres en id-provider.
  10. Selecteer OK en selecteer vervolgens Maken.

Vereiste

Als u dit nog niet hebt gedaan, vindt u meer informatie over aangepast beleid in het starterspakket in Aan de slag met aangepaste beleidsregels in Active Directory B2C.

Een beleid voor resource-eigenaar maken

  1. Open het bestand TrustframeworkExtensions.xml.

  2. Als dit nog niet bestaat, voegt u een ClaimSchema-element en de onderliggende elementen toe als het eerste element onder het element BuildingBlocks :

    <ClaimsSchema>
      <ClaimType Id="logonIdentifier">
        <DisplayName>User name or email address that the user can use to sign in</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="resource">
        <DisplayName>The resource parameter passes to the ROPC endpoint</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="refreshTokenIssuedOnDateTime">
        <DisplayName>An internal parameter used to determine whether the user should be permitted to authenticate again using their existing refresh token.</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
      <ClaimType Id="refreshTokensValidFromDateTime">
        <DisplayName>An internal parameter used to determine whether the user should be permitted to authenticate again using their existing refresh token.</DisplayName>
        <DataType>string</DataType>
      </ClaimType>
    </ClaimsSchema>
    
  3. Voeg na ClaimsSchema een ClaimTransformations-element en de onderliggende elementen toe aan het element BuildingBlocks:

    <ClaimsTransformations>
      <ClaimsTransformation Id="CreateSubjectClaimFromObjectID" TransformationMethod="CreateStringClaim">
        <InputParameters>
          <InputParameter Id="value" DataType="string" Value="Not supported currently. Use oid claim." />
        </InputParameters>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="sub" TransformationClaimType="createdClaim" />
        </OutputClaims>
      </ClaimsTransformation>
    
      <ClaimsTransformation Id="AssertRefreshTokenIssuedLaterThanValidFromDate" TransformationMethod="AssertDateTimeIsGreaterThan">
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" TransformationClaimType="leftOperand" />
          <InputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" TransformationClaimType="rightOperand" />
        </InputClaims>
        <InputParameters>
          <InputParameter Id="AssertIfEqualTo" DataType="boolean" Value="false" />
          <InputParameter Id="AssertIfRightOperandIsNotPresent" DataType="boolean" Value="true" />
        </InputParameters>
      </ClaimsTransformation>
    </ClaimsTransformations>
    
  4. Zoek het claimprovider-element met een DisplayName van Local Account SignIn en voeg het volgende technische profiel toe:

    <TechnicalProfile Id="ResourceOwnerPasswordCredentials-OAUTH2">
      <DisplayName>Local Account SignIn</DisplayName>
      <Protocol Name="OpenIdConnect" />
      <Metadata>
        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We can't seem to find your account</Item>
        <Item Key="UserMessageIfInvalidPassword">Your password is incorrect</Item>
        <Item Key="UserMessageIfOldPasswordUsed">Looks like you used an old password</Item>
        <Item Key="DiscoverMetadataByTokenIssuer">true</Item>
        <Item Key="ValidTokenIssuerPrefixes">https://sts.windows.net/</Item>
        <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/.well-known/openid-configuration</Item>
        <Item Key="authorization_endpoint">https://login.microsoftonline.com/{tenant}/oauth2/token</Item>
        <Item Key="response_types">id_token</Item>
        <Item Key="response_mode">query</Item>
        <Item Key="scope">email openid</Item>
        <Item Key="grant_type">password</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="logonIdentifier" PartnerClaimType="username" Required="true" DefaultValue="{OIDC:Username}"/>
        <InputClaim ClaimTypeReferenceId="password" Required="true" DefaultValue="{OIDC:Password}" />
        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="ProxyIdentityExperienceFrameworkAppId" />
        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="IdentityExperienceFrameworkAppId" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
        <OutputClaim ClaimTypeReferenceId="userPrincipalName" PartnerClaimType="upn" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromObjectID" />
      </OutputClaimsTransformations>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
    

    Vervang de DefaultValue van client_id door de toepassings-id van de ProxyIdentityExperienceFramework-toepassing die u in de vereiste zelfstudie hebt gemaakt. Vervang vervolgens DefaultValue van resource_id door de toepassings-id van de IdentityExperienceFramework-toepassing die u ook hebt gemaakt in de vereiste zelfstudie.

  5. Voeg de volgende ClaimsProvider-elementen met hun technische profielen toe aan het element ClaimsProviders :

    <ClaimsProvider>
      <DisplayName>Azure Active Directory</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="AAD-UserReadUsingObjectId-CheckRefreshTokenDate">
          <Metadata>
            <Item Key="Operation">Read</Item>
            <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item>
          </Metadata>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="objectId" Required="true" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="refreshTokensValidFromDateTime" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="AssertRefreshTokenIssuedLaterThanValidFromDate" />
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromObjectID" />
          </OutputClaimsTransformations>
          <IncludeTechnicalProfile ReferenceId="AAD-Common" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
    <ClaimsProvider>
      <DisplayName>Session Management</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="SM-RefreshTokenReadAndSetup">
          <DisplayName>Trustframework Policy Engine Refresh Token Setup Technical Profile</DisplayName>
          <Protocol Name="None" />
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" />
            <OutputClaim ClaimTypeReferenceId="refreshTokenIssuedOnDateTime" />
          </OutputClaims>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
    <ClaimsProvider>
      <DisplayName>Token Issuer</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="JwtIssuer">
          <Metadata>
            <!-- Point to the redeem refresh token user journey-->
            <Item Key="RefreshTokenUserJourneyId">ResourceOwnerPasswordCredentials-RedeemRefreshToken</Item>
          </Metadata>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
    
  6. Voeg een UserJourneys-element en de onderliggende elementen toe aan het Element TrustFrameworkPolicy :

    <UserJourney Id="ResourceOwnerPasswordCredentials">
      <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
      <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="ResourceOwnerFlow" TechnicalProfileReferenceId="ResourceOwnerPasswordCredentials-OAUTH2" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
    </UserJourney>
    <UserJourney Id="ResourceOwnerPasswordCredentials-RedeemRefreshToken">
      <PreserveOriginalAssertion>false</PreserveOriginalAssertion>
      <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="RefreshTokenSetupExchange" TechnicalProfileReferenceId="SM-RefreshTokenReadAndSetup" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
          <ClaimsExchanges>
            <ClaimsExchange Id="CheckRefreshTokenDateFromAadExchange" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId-CheckRefreshTokenDate" />
          </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
      </OrchestrationSteps>
    </UserJourney>
    
  7. Selecteer Beleid uploaden op de pagina Aangepast beleid in uw Azure AD B2C-tenant.

  8. Schakel het beleid overschrijven in als dit bestaat en blader naar het bestand TrustFrameworkExtensions.xml en selecteer het.

  9. Selecteer Uploaden.

Een Relying Party-bestand maken

Werk vervolgens het relying party-bestand bij waarmee het gebruikerstraject wordt gestart dat u hebt gemaakt:

  1. Maak een kopie van het SignUpOrSignin.xml-bestand in uw werkmap en wijzig de naam ervan in ROPC_Auth.xml.

  2. Open het nieuwe bestand en wijzig de waarde van het kenmerk PolicyId voor TrustFrameworkPolicy in een unieke waarde. De beleids-id is de naam van uw beleid. Bijvoorbeeld B2C_1A_ROPC_Auth.

  3. Wijzig de waarde van het kenmerk ReferenceId in DefaultUserJourney in ResourceOwnerPasswordCredentials.

  4. Wijzig het Element OutputClaims zodat dit alleen de volgende claims bevat:

    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="displayName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="givenName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="surname" DefaultValue="" />
    
  5. Selecteer Beleid uploaden op de pagina Aangepast beleid in uw Azure AD B2C-tenant.

  6. Schakel het beleid overschrijven in als dit bestaat en blader naar het bestand ROPC_Auth.xml .

  7. Selecteer Uploaden.

De ROPC-stroom testen

Gebruik uw favoriete API-ontwikkeltoepassing om een API-aanroep te genereren en bekijk het antwoord om fouten in uw beleid op te sporen. Maak een aanroep zoals in dit voorbeeld met de volgende informatie als de hoofdtekst van de POST-aanvraag:

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token

  • Vervang <tenant-name> door de naam van uw Azure AD B2C-tenant.
  • Vervang B2C_1A_ROPC_Auth door de volledige naam van het wachtwoordreferentiebeleid voor de resource-eigenaar.
Sleutel Waarde
gebruikersnaam user-account
password password1
grant_type password
bereik openid application-id offline_access
client_id application-id
response_type token id_token
  • Vervang user-account door de naam van een gebruikersaccount in uw tenant.
  • Vervang password1 door het wachtwoord van het gebruikersaccount.
  • Vervang application-id door de toepassings-id uit de ROPC_Auth_app-registratie .
  • Offline_access is optioneel als u een vernieuwingstoken wilt ontvangen.

De werkelijke POST-aanvraag ziet eruit als in het volgende voorbeeld:

POST /<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded

username=contosouser.outlook.com.ws&password=Passxword1&grant_type=password&scope=openid+bef22d56-552f-4a5b-b90a-1988a7d634ce+offline_access&client_id=bef22d56-552f-4a5b-b90a-1988a7d634ce&response_type=token+id_token

Een geslaagd antwoord met offlinetoegang ziet eruit als in het volgende voorbeeld:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9YQjNhdTNScWhUQWN6R0RWZDM5djNpTmlyTWhqN2wxMjIySnh6TmgwRlki...",
    "token_type": "Bearer",
    "expires_in": "3600",
    "refresh_token": "eyJraWQiOiJacW9pQlp2TW5pYVc2MUY0TnlfR3REVk1EVFBLbUJLb0FUcWQ1ZWFja1hBIiwidmVyIjoiMS4wIiwiemlwIjoiRGVmbGF0ZSIsInNlciI6Ij...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9YQjNhdTNScWhUQWN6R0RWZDM5djNpTmlyTWhqN2wxMjIySnh6TmgwRlki..."
}

Een vernieuwingstoken inwisselen

Maak een POST-aanroep zoals hier wordt weergegeven. Gebruik de informatie in de volgende tabel als hoofdtekst van de aanvraag:

https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/B2C_1A_ROPC_Auth/oauth2/v2.0/token

  • Vervang <tenant-name> door de naam van uw Azure AD B2C-tenant.
  • Vervang B2C_1A_ROPC_Auth door de volledige naam van het wachtwoordreferentiebeleid voor de resource-eigenaar.
Sleutel Waarde
grant_type refresh_token
response_type id_token
client_id application-id
resource application-id
refresh_token refresh-token
  • Vervang application-id door de toepassings-id uit de ROPC_Auth_app-registratie .
  • Vervang refresh-token door de refresh_token die in het vorige antwoord is teruggestuurd.

Een geslaagd antwoord ziet eruit als in het volgende voorbeeld:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhT...",
    "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQn...",
    "token_type": "Bearer",
    "not_before": 1533672990,
    "expires_in": 3600,
    "expires_on": 1533676590,
    "resource": "bef2222d56-552f-4a5b-b90a-1988a7d634c3",
    "id_token_expires_in": 3600,
    "profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiI1MTZmYzA2NS1mZjM2LTRiOTMtYWE1YS1kNmVlZGE3Y2JhYzgiLCJzdWIiOm51bGwsIm5hbWUiOiJEYXZpZE11IiwicHJlZmVycmVkX3VzZXJuYW1lIjpudWxsLCJpZHAiOiJMb2NhbEFjY291bnQifQ",
    "refresh_token": "eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAi...",
    "refresh_token_expires_in": 1209600
}

Problemen oplossen

De opgegeven toepassing is niet geconfigureerd om de impliciete stroom 'OAuth' toe te staan

  • Symptoom : u voert de ROPC-stroom uit en ontvangt het volgende bericht: AADB2C90057: de opgegeven toepassing is niet geconfigureerd om de impliciete OAuth-stroom toe te staan.
  • Mogelijke oorzaken : de impliciete stroom is niet toegestaan voor uw toepassing.
  • Oplossing: Bij het maken van uw app-registratie in Azure AD B2C moet u het toepassingsmanifest handmatig bewerken en de waarde van de oauth2AllowImplicitFlow eigenschap instellen op true. Nadat u de oauth2AllowImplicitFlow eigenschap hebt geconfigureerd, kan het enkele minuten duren (meestal niet meer dan vijf) voordat de wijziging van invloed is.

Een systeemeigen SDK of app-verificatie gebruiken

Azure AD B2C voldoet aan OAuth 2.0-standaarden voor wachtwoordreferenties voor de eigenaar van openbare clientresources en moet compatibel zijn met de meeste client-SDK's. Zie Native App SDK voor OAuth 2.0 en OpenID Verbinding maken moderne best practices implementeren voor de meest recente informatie.

Volgende stappen

Download werkvoorbeelden die zijn geconfigureerd voor gebruik met Azure AD B2C vanuit GitHub, voor Android en iOS.