Konfigurera ett flöde för lösenordsautentiseringsuppgifter för resursägare i Azure Active Directory B2C

Innan du börjar använder du väljaren Välj en principtyp för att välja den typ av princip som du konfigurerar. Azure Active Directory B2C erbjuder två metoder för att definiera hur användare interagerar med dina program: via fördefinierade användarflöden eller genom fullständigt konfigurerbara anpassade principer. De steg som krävs i den här artikeln skiljer sig åt för varje metod.

I Azure Active Directory B2C (Azure AD B2C) är ropc-flödet (resource owner password credentials) ett OAuth-standardautentiseringsflöde. I det här flödet utbyter ett program, även kallat den förlitande parten, giltiga autentiseringsuppgifter för token. Autentiseringsuppgifterna innehåller ett användar-ID och lösenord. De token som returneras är en ID-token, åtkomsttoken och en uppdateringstoken.

Varning

Vi rekommenderar att du inte använder ROPC-flödet. I de flesta scenarier är säkrare alternativ tillgängliga och rekommenderas. Det här flödet kräver en mycket hög grad av förtroende för programmet och medför risker som inte finns i andra flöden. Du bör bara använda det här flödet när andra säkrare flöden inte är livskraftiga.

ROPC-flödesanteckningar

I Azure Active Directory B2C (Azure AD B2C) stöds följande alternativ:

  • Intern klient: Användarinteraktion under autentisering sker när koden körs på en enhet på användarsidan. Enheten kan vara ett mobilprogram som körs i ett internt operativsystem, till exempel Android och iOS.
  • Offentligt klientflöde: Endast användarautentiseringsuppgifter som samlas in av ett program skickas i API-anropet. Programmets autentiseringsuppgifter skickas inte.
  • Lägg till nya anspråk: Innehållet i ID-token kan ändras för att lägga till nya anspråk.

Följande flöden stöds inte:

  • Server-till-server: Identitetsskyddssystemet behöver en tillförlitlig IP-adress som samlats in från anroparen (den interna klienten) som en del av interaktionen. I ett API-anrop på serversidan används endast serverns IP-adress. Om ett dynamiskt tröskelvärde för misslyckade autentiseringar överskrids kan identitetsskyddssystemet identifiera en upprepad IP-adress som angripare.
  • Konfidentiellt klientflöde: Programklient-ID:t verifieras, men programhemligheten verifieras inte.

Tänk på följande när du använder ROPC-flödet:

  • ROPC fungerar inte när det uppstår avbrott i autentiseringsflödet som behöver användarinteraktion. När ett lösenord till exempel har upphört att gälla eller behöver ändras krävs multifaktorautentisering , eller när mer information måste samlas in under inloggningen (till exempel användarmedgivande).
  • ROPC stöder endast lokala konton. Användare kan inte logga in med federerade identitetsprovidrar som Microsoft, Google+, Twitter, AD-FS eller Facebook.
  • Sessionshantering, inklusive håll mig inloggad (KMSI) är inte tillämpligt.

Registrera en app

Om du vill registrera ett program i din Azure AD B2C-klientorganisation kan du använda vår nya enhetliga appregistreringsupplevelse eller vår äldre programupplevelse. Läs mer om den nya upplevelsen

  1. Logga in på Azure-portalen.
  2. Kontrollera att du använder katalogen som innehåller din Azure AD B2C-klientorganisation:
    1. Välj ikonen Kataloger + prenumerationer i portalens verktygsfält.
    2. I portalinställningarna | Sidan Kataloger + prenumerationer, leta upp din Azure AD B2C-katalog i listan Katalognamn och välj sedan Växla.
  3. I Azure-portalen söker du efter och väljer Azure AD B2C
  4. Välj Appregistreringar och välj sedan Ny registrering.
  5. Ange ett namn för programmet. Till exempel ROPC_Auth_app.
  6. Lämna de andra värdena som de är och välj sedan Registrera.
  7. Registrera program-ID :t (klient) för användning i ett senare steg.
  8. Under Hantera väljer du Autentisering.
  9. Välj Prova den nya upplevelsen (om den visas).
  10. Under Avancerade inställningar och avsnittet Aktivera följande mobil- och skrivbordsflöden väljer du Ja för att behandla programmet som en offentlig klient. Den här inställningen krävs för ROPC-flödet.
  11. Välj Spara.
  12. I den vänstra menyn väljer du Manifest för att öppna manifestredigeraren.
  13. Ange attributet oauth2AllowImplicitFlow till true:
    "oauth2AllowImplicitFlow": true,
    
  14. Välj Spara.

Skapa ett användarflöde för resursägare

  1. Logga in på Azure-portalen som global administratör för din Azure AD B2C-klientorganisation.
  2. Om du har åtkomst till flera klienter väljer du ikonen Inställningar på den översta menyn för att växla till din Azure AD B2C-klient från menyn Kataloger + prenumerationer.
  3. I Azure-portalen söker du efter och väljer Azure AD B2C.
  4. Välj Användarflöden och välj Nytt användarflöde.
  5. Välj Logga in med autentiseringsuppgifter för resursägarens lösenord (ROPC).
  6. Under Version kontrollerar du att förhandsversionen är markerad och väljer sedan Skapa.
  7. Ange ett namn för användarflödet, till exempel ROPC_Auth.
  8. Under Programanspråk väljer du Visa mer.
  9. Välj de programanspråk som du behöver för ditt program, till exempel visningsnamn, e-postadress och identitetsprovider.
  10. Välj OK, och välj Stäng.

Förutsättningar

Om du inte har gjort det kan du läsa mer om startpaketet för anpassad princip i Kom igång med anpassade principer i Active Directory B2C.

Skapa en princip för resursägare

  1. Öppna filen TrustFrameworkExtensions.xml.

  2. Om det inte redan finns lägger du till ett ClaimsSchema-element och dess underordnade element som det första elementet under elementet 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. Efter ClaimsSchema lägger du till elementet ClaimsTransformations och dess underordnade element i elementet 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. Leta upp elementet ClaimsProvider som har ett DisplayName för Local Account SignIn och lägg till följande tekniska profil:

    <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>
    

    Ersätt DefaultValue för client_id med program-ID:t för programmet ProxyIdentityExperienceFramework som du skapade i den nödvändiga självstudien. Ersätt sedan DefaultValue för resource_id med program-ID:t för IdentityExperienceFramework-programmet som du också skapade i den nödvändiga självstudien.

  5. Lägg till följande ClaimsProvider-element med sina tekniska profiler i elementet 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. Lägg till ett UserJourneys-element och dess underordnade element i elementet 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. På sidan Anpassade principer i din Azure AD B2C-klient väljer du Ladda upp princip.

  8. Aktivera Skriv över principen om den finns och bläddra sedan till och välj filen TrustFrameworkExtensions.xml .

  9. Välj överför.

Skapa en förlitande partfil

Uppdatera sedan den förlitande partfilen som initierar användarresan som du skapade:

  1. Skapa en kopia av filen SignUpOrSignin.xml i arbetskatalogen och byt namn på den till ROPC_Auth.xml.

  2. Öppna den nya filen och ändra värdet för attributet PolicyId för TrustFrameworkPolicy till ett unikt värde. Princip-ID:t är namnet på principen. Till exempel B2C_1A_ROPC_Auth.

  3. Ändra värdet för attributet ReferenceId i DefaultUserJourney till ResourceOwnerPasswordCredentials.

  4. Ändra outputClaims-elementet så att det endast innehåller följande anspråk:

    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="displayName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="givenName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="surname" DefaultValue="" />
    
  5. På sidan Anpassade principer i din Azure AD B2C-klient väljer du Ladda upp princip.

  6. Aktivera Skriv över principen om den finns och bläddra sedan till och välj filen ROPC_Auth.xml .

  7. Välj överför.

Testa ROPC-flödet

Använd ditt favorit-API-utvecklingsprogram för att generera ett API-anrop och granska svaret för att felsöka din princip. Skapa ett anrop som det här exemplet med följande information som brödtext för POST-begäran:

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

  • Ersätt <tenant-name> med namnet på din Azure AD B2C-klientorganisation.
  • Ersätt B2C_1A_ROPC_Auth med det fullständiga namnet på principen för lösenordsautentiseringsuppgifter för resursägaren.
Tangent Värde
användarnamn user-account
password password1
grant_type password
omfattning openid application-id offline_access
client_id application-id
response_type token id_token
  • Ersätt user-account med namnet på ett användarkonto i din klientorganisation.
  • Ersätt password1 med lösenordet för användarkontot.
  • Ersätt application-id med program-ID:t från ROPC_Auth_app-registreringen .
  • Offline_access är valfritt om du vill ta emot en uppdateringstoken.

Den faktiska POST-begäran ser ut som i följande exempel:

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

Ett lyckat svar med offlineåtkomst ser ut som i följande exempel:

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

Lösa in en uppdateringstoken

Skapa ett POST-anrop som det som visas här. Använd informationen i följande tabell som brödtext för begäran:

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

  • Ersätt <tenant-name> med namnet på din Azure AD B2C-klientorganisation.
  • Ersätt B2C_1A_ROPC_Auth med det fullständiga namnet på principen för lösenordsautentiseringsuppgifter för resursägaren.
Tangent Värde
grant_type refresh_token
response_type id_token
client_id application-id
resource application-id
refresh_token refresh-token
  • Ersätt application-id med program-ID:t från ROPC_Auth_app-registreringen .
  • Ersätt refresh-token med refresh_token som skickades tillbaka i föregående svar.

Ett lyckat svar ser ut som i följande exempel:

{
    "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
}

Felsökning

Det angivna programmet är inte konfigurerat för att tillåta implicit OAuth-flöde

  • Symptom – Du kör ROPC-flödet och får följande meddelande: AADB2C90057: Det angivna programmet är inte konfigurerat för att tillåta implicit OAuth-flöde.
  • Möjliga orsaker – Det implicita flödet tillåts inte för ditt program.
  • Lösning: När du skapar din appregistrering i Azure AD B2C måste du manuellt redigera programmanifestet och ange värdet för oauth2AllowImplicitFlow egenskapen till true. När du har konfigurerat oauth2AllowImplicitFlow egenskapen kan det ta några minuter (vanligtvis inte mer än fem) innan ändringen påverkar.

Använda en intern SDK eller App-Auth

Azure AD B2C uppfyller OAuth 2.0-standarder för lösenordsautentiseringsuppgifter för offentliga klientresurser och bör vara kompatibla med de flesta klient-SDK:er. Den senaste informationen finns i Native App SDK for OAuth 2.0 och OpenID Anslut implementering av moderna metodtips.

Nästa steg

Ladda ned arbetsexempel som har konfigurerats för användning med Azure AD B2C från GitHub, för Android och för iOS.