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í:
- FUNKCE ROPC nefunguje, když dojde k přerušení toku ověřování, který vyžaduje interakci uživatele. Pokud například vypršela platnost hesla nebo je potřeba ho změnit, vyžaduje se vícefaktorové ověřování nebo když je potřeba shromáždit další informace při přihlášení (například souhlas uživatele).
- ROPC podporuje jenom místní účty. Uživatelé se nemůžou přihlásit pomocí zprostředkovatelů federovaných identit, jako jsou Microsoft, Google+, Twitter, AD-FS nebo Facebook.
- Správa relací, včetně možnosti zůstat přihlášeni (Služba správy klíčů I), se nedá použít.
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í.
- Přihlaste se k portálu Azure.
- Ujistěte se, že používáte adresář, který obsahuje vašeho tenanta Azure AD B2C:
- Na panelu nástrojů portálu vyberte ikonu Adresáře a předplatná .
- 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.
- Na webu Azure Portal vyhledejte a vyberte Azure AD B2C.
- Vyberte Registrace aplikací a pak vyberte Nová registrace.
- Zadejte název aplikace. Například ROPC_Auth_app.
- Ponechte ostatní hodnoty tak, jak jsou, a pak vyberte Zaregistrovat.
- Poznamenejte si ID aplikace (klienta) pro použití v pozdějším kroku.
- V části Spravovat vyberte Ověřování.
- Vyberte Vyzkoušet nové prostředí (pokud se zobrazí).
- 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.
- Zvolte Uložit.
- V nabídce vlevo vyberte Manifest a otevřete editor manifestu.
- Nastavte atribut oauth2AllowImplicitFlow na true:
"oauth2AllowImplicitFlow": true,
- Zvolte Uložit.
Vytvoření toku uživatele vlastníka prostředku
- Přihlaste se k webu Azure Portal jako globální správce tenanta Azure AD B2C.
- 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.
- Na webu Azure Portal vyhledejte a vyberte Azure AD B2C.
- Vyberte Toky uživatele a vyberte Nový tok uživatele.
- Vyberte Přihlásit se pomocí přihlašovacích údajů vlastníka prostředku (ROPC).
- V části Verze se ujistěte, že je vybraná možnost Náhled , a pak vyberte Vytvořit.
- Zadejte název toku uživatele, například ROPC_Auth.
- V části Deklarace identity aplikace vyberte Zobrazit více.
- Vyberte deklarace identity aplikace, které potřebujete pro vaši aplikaci, například zobrazované jméno, e-mailovou adresu a zprostředkovatele identity.
- 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
Otevřete soubor TrustFrameworkExtensions.xml.
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>
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>
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 defaultValue client_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.
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>
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>
Na stránce Vlastní zásady ve vašem tenantovi Azure AD B2C vyberte Nahrát zásadu.
Povolte přepsat zásadu, pokud existuje, a pak přejděte a vyberte soubor TrustFrameworkExtensions.xml .
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:
Vytvořte kopii souboru SignUpOrSignin.xml v pracovním adresáři a přejmenujte ho na ROPC_Auth.xml.
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.
Změňte hodnotu atributu ReferenceId v DefaultUserJourney na
ResourceOwnerPasswordCredentials
.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="" />
Na stránce Vlastní zásady ve vašem tenantovi Azure AD B2C vyberte Nahrát zásadu.
Povolte přepsat zásadu, pokud existuje, a pak přejděte a vyberte soubor ROPC_Auth.xml .
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 natrue
. Jakmile vlastnost nakonfigurujeteoauth2AllowImplicitFlow
, 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.