Nastavení toku přihlašovacích údajů vlastníka prostředku v Azure Active Directory B2C

Než začnete, pomocí selektoru Zvolit typ zásady zvolte typ zásady, kterou nastavujete. Azure Active Directory B2C nabízí dvě metody pro definování způsobu interakce uživatelů s vašimi aplikacemi: prostřednictvím předdefinovaných toků uživatelů nebo prostřednictvím plně konfigurovatelných vlastních zásad. Kroky vyžadované v tomto článku se pro každou metodu liší.

V Azure Active Directory B2C (Azure AD B2C) je tok hesla vlastníka prostředku (ROPC) standardní ověřovací tok OAuth. V tomto toku si aplikace, označovaná také jako předávající strana, vyměňuje platné přihlašovací údaje pro tokeny. Přihlašovací údaje zahrnují ID uživatele a heslo. Vrácené tokeny jsou token ID, přístupový token a obnovovací token.

Upozorňující

Doporučujeme nepoužívat tok ROPC. Ve většině scénářů jsou k dispozici a doporučeny bezpečnější alternativy. Tento tok vyžaduje velmi vysoký stupeň důvěryhodnosti v aplikaci a nese rizika, která nejsou přítomna v jiných tocích. Tento tok byste měli použít jenom v případě, že jiné bezpečnější toky nejsou přijatelné.

Poznámky k toku ROPC

V Azure Active Directory B2C (Azure AD B2C) jsou podporované následující možnosti:

  • Nativní klient: Interakce uživatele během ověřování nastane, když se kód spustí na zařízení na straně uživatele. Zařízení může být mobilní aplikace, která běží v nativním operačním systému, jako je Android a iOS.
  • Tok veřejného klienta: Ve volání rozhraní API se odesílají pouze přihlašovací údaje uživatele, které shromažďuje aplikace. Přihlašovací údaje aplikace se neodesílají.
  • Přidání nových deklarací identity: Obsah tokenu ID lze změnit a přidat nové deklarace identity.

Následující toky nejsou podporované:

  • Server-to-server: Systém ochrany identit potřebuje v rámci interakce spolehlivou IP adresu shromážděnou od volajícího (nativního klienta). Při volání rozhraní API na straně serveru se používá pouze IP adresa serveru. Pokud dojde k překročení dynamické prahové hodnoty neúspěšných ověřování, může systém ochrany identit identifikovat opakovanou IP adresu jako útočníka.
  • Důvěrný tok klienta: ID klienta aplikace se ověří, ale tajný klíč aplikace se neověří.

Při použití toku ROPC zvažte následující:

Registrace aplikace

K registraci aplikace v tenantovi Azure AD B2C můžete použít naše nové jednotné prostředí Registrace aplikací nebo naše prostředí Starší verze aplikací (starší verze). Další informace o novém prostředí.

  1. Přihlaste se k portálu Azure.
  2. Ujistěte se, že používáte adresář, který obsahuje vašeho tenanta Azure AD B2C:
    1. Na panelu nástrojů portálu vyberte ikonu Adresáře a předplatná .
    2. V nastavení portálu | Adresářů a stránka předplatných , vyhledejte adresář Azure AD B2C v seznamu názvů adresářů a pak vyberte Přepnout.
  3. Na webu Azure Portal vyhledejte a vyberte Azure AD B2C.
  4. Vyberte Registrace aplikací a pak vyberte Nová registrace.
  5. Zadejte název aplikace. Například ROPC_Auth_app.
  6. Ponechte ostatní hodnoty tak, jak jsou, a pak vyberte Zaregistrovat.
  7. Poznamenejte si ID aplikace (klienta) pro použití v pozdějším kroku.
  8. V části Spravovat vyberte Ověřování.
  9. Vyberte Vyzkoušet nové prostředí (pokud se zobrazí).
  10. V části Upřesnit nastavení a v části Povolit následující mobilní a desktopové toky vyberte Ano , pokud chcete aplikaci považovat za veřejného klienta. Toto nastavení se vyžaduje pro tok ROPC.
  11. Zvolte Uložit.
  12. V nabídce vlevo vyberte Manifest a otevřete editor manifestu.
  13. Nastavte atribut oauth2AllowImplicitFlow na true:
    "oauth2AllowImplicitFlow": true,
    
  14. Zvolte Uložit.

Vytvoření toku uživatele vlastníka prostředku

  1. Přihlaste se k webu Azure Portal jako globální správce tenanta Azure AD B2C.
  2. Pokud máte přístup k více tenantům, v horní nabídce vyberte ikonu Nastavení a v nabídce Adresáře a předplatná přepněte do svého tenanta Azure AD B2C.
  3. Na webu Azure Portal vyhledejte a vyberte Azure AD B2C.
  4. Vyberte Toky uživatele a vyberte Nový tok uživatele.
  5. Vyberte Přihlásit se pomocí přihlašovacích údajů vlastníka prostředku (ROPC).
  6. V části Verze se ujistěte, že je vybraná možnost Náhled , a pak vyberte Vytvořit.
  7. Zadejte název toku uživatele, například ROPC_Auth.
  8. V části Deklarace identity aplikace vyberte Zobrazit více.
  9. Vyberte deklarace identity aplikace, které potřebujete pro vaši aplikaci, například zobrazované jméno, e-mailovou adresu a zprostředkovatele identity.
  10. Zvolte OK a pak vyberte Vytvořit.

Předpoklad

Pokud jste to neudělali, přečtěte si informace o úvodním balíčku vlastních zásad v tématu Začínáme s vlastními zásadami ve službě Active Directory B2C.

Vytvoření zásady vlastníka prostředku

  1. Otevřete soubor TrustFrameworkExtensions.xml.

  2. Pokud ještě neexistuje, přidejte element ClaimsSchema a jeho podřízené elementy jako první prvek v elementu 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. Za ClaimsSchema přidejte ClaimsTransformations element a jeho podřízené elementy Do BuildingBlocks element:

    <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. Vyhledejte element ClaimsProvider, který má DisplayName z Local Account SignIn a přidat následující technický 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>
    

    Nahraďte defaultValueclient_id ID aplikace proxyIdentityExperienceFramework, kterou jste vytvořili v požadovaném kurzu. Potom nahraďte DefaultValue resource_id ID aplikace IdentityExperienceFramework, kterou jste vytvořili také v požadovaném kurzu.

  5. Do elementu ClaimsProviders přidejte následující elementy ClaimsProvider s jejich technickými profily:

    <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. Přidejte element UserJourneys a jeho podřízené elementy do elementu 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. Na stránce Vlastní zásady ve vašem tenantovi Azure AD B2C vyberte Nahrát zásadu.

  8. Povolte přepsat zásadu, pokud existuje, a pak přejděte a vyberte soubor TrustFrameworkExtensions.xml .

  9. Vyberte Odeslat.

Vytvoření souboru předávající strany

Dále aktualizujte soubor předávající strany, který zahájí cestu uživatele, kterou jste vytvořili:

  1. Vytvořte kopii souboru SignUpOrSignin.xml v pracovním adresáři a přejmenujte ho na ROPC_Auth.xml.

  2. Otevřete nový soubor a změňte hodnotu atributu PolicyId pro TrustFrameworkPolicy na jedinečnou hodnotu. ID zásady je název vaší zásady. Například B2C_1A_ROPC_Auth.

  3. Změňte hodnotu atributu ReferenceId v DefaultUserJourney na ResourceOwnerPasswordCredentials.

  4. Změňte element OutputClaims tak, aby obsahoval pouze následující deklarace identity:

    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="displayName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="givenName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="surname" DefaultValue="" />
    
  5. Na stránce Vlastní zásady ve vašem tenantovi Azure AD B2C vyberte Nahrát zásadu.

  6. Povolte přepsat zásadu, pokud existuje, a pak přejděte a vyberte soubor ROPC_Auth.xml .

  7. Vyberte Odeslat.

Testování toku ROPC

Pomocí oblíbené vývojové aplikace API vygenerujte volání rozhraní API a zkontrolujte odpověď na ladění zásad. Vytvořte volání podobné tomuto příkladu s následujícími informacemi jako text požadavku POST:

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

  • Nahraďte <tenant-name> názvem vašeho tenanta Azure AD B2C.
  • Nahraďte B2C_1A_ROPC_Auth úplným názvem zásady přihlašovacích údajů vlastníka prostředku.
Key Hodnota
username user-account
Heslo password1
typ grantu Heslo
rozsah openid application-id offline_access
client_id application-id
response_type id_token tokenu
  • Nahraďte user-account názvem uživatelského účtu ve vašem tenantovi.
  • Nahraďte password1 heslem uživatelského účtu.
  • Nahraďte application-id ID aplikace z registrace ROPC_Auth_app .
  • Offline_access je nepovinný, pokud chcete získat obnovovací token.

Skutečný požadavek POST vypadá jako v následujícím příkladu:

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

Úspěšná odpověď s offline přístupem vypadá jako v následujícím příkladu:

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

Uplatnění obnovovacího tokenu

Vytvořte volání POST, jako je volání, které je zde zobrazeno. Jako text požadavku použijte informace v následující tabulce:

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

  • Nahraďte <tenant-name> názvem vašeho tenanta Azure AD B2C.
  • Nahraďte B2C_1A_ROPC_Auth úplným názvem zásady přihlašovacích údajů vlastníka prostředku.
Key Hodnota
typ grantu refresh_token
response_type id_token
client_id application-id
resource application-id
refresh_token refresh-token
  • Nahraďte application-id ID aplikace z registrace ROPC_Auth_app .
  • Nahraďte refresh-token refresh_token, která byla odeslána zpět v předchozí odpovědi.

Úspěšná odpověď vypadá jako v následujícím příkladu:

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

Řešení problému

Poskytnutá aplikace není nakonfigurovaná tak, aby umožňovala implicitní tok OAuth.

  • Příznak – Spustíte tok ROPC a zobrazí se následující zpráva: AADB2C90057: Zadaná aplikace není nakonfigurovaná tak, aby umožňovala implicitní tok OAuth.
  • Možné příčiny – Implicitní tok není pro vaši aplikaci povolený.
  • Řešení: Při vytváření registrace aplikace v Azure AD B2C musíte ručně upravit manifest aplikace a nastavit hodnotu oauth2AllowImplicitFlow vlastnosti na true. Jakmile vlastnost nakonfigurujete oauth2AllowImplicitFlow , může trvat několik minut (obvykle ne více než pět), než se změna projeví.

Použití nativní sady SDK nebo app-Auth

Azure AD B2C splňuje standardy OAuth 2.0 pro přihlašovací údaje vlastníka veřejných prostředků klienta a měly by být kompatibilní s většinou klientských sad SDK. Nejnovější informace najdete v tématu Nativní sada App SDK pro OAuth 2.0 a OpenID Připojení implementaci moderních osvědčených postupů.

Další kroky

Stáhněte si pracovní ukázky nakonfigurované pro použití s Azure AD B2C z GitHubu pro Android a pro iOS.