Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Viktigt!
Från och med den 1 maj 2025 är Azure AD B2C inte längre tillgängligt att köpa för nya kunder. Läs mer i våra vanliga frågor och svar.
Innan du börjar använder du väljaren Välj en principtyp överst på den här sidan 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 kod 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 autentiseringsuppgifter för användare, 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 verifieras, men programhemligheten verifieras inte.
När du använder ROPC-flödet bör du tänka på följande begränsningar:
- ROPC fungerar inte när det uppstår avbrott i autentiseringsflödet som behöver användarinteraktion. När ett lösenord till exempel upphör 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+, X, AD-FS eller Facebook.
- Sessionshantering, inklusive håll mig inloggad (KMSI), är inte tillämpbart.
Registrera en app
Om du vill registrera ett program i din Azure AD B2C-klientorganisation kan du använda vår nya enhetliga upplevelse för appregistreringar eller vår äldre upplevelse för Applikationer (Äldre). Läs mer om den nya upplevelsen.
- Logga in på Azure-portalen.
- Kontrollera att du använder katalogen som innehåller din Azure AD B2C-klientorganisation:
- Välj ikonen Kataloger + prenumerationer i portalens verktygsfält.
- I portalinställningarna | Sidan Kataloger + prenumerationer, leta upp din Azure AD B2C-katalog i listan Katalognamn och välj sedan Växla.
- I Azure-portalen söker du efter och väljer Azure AD B2C-
- Välj Appregistreringaroch välj sedan Ny registrering.
- Ange ett namn för programmet. Till exempel ROPC_Auth_app.
- Lämna de andra värdena som de är och välj sedan Registrera.
- Registrera program-ID (klient)-ID:t för användning i ett senare steg.
- Under Hantera väljer du Autentisering.
- Välj Prova den nya upplevelsen (om det visas).
- Under Avancerade inställningaroch avsnittet Aktivera följande mobil- och skrivbordsflödenväljer du Ja för att behandla programmet som en offentlig klient. Den här inställningen krävs för ROPC-flödet.
- Välj Spara.
- I den vänstra menyn väljer du Manifest för att öppna manifestredigeraren.
- Ange attributet oauth2AllowImplicitFlow till true. Om attributet inte finns lägger du till det:
"oauth2AllowImplicitFlow": true, - Välj Spara.
Skapa ett användarflöde för resursägare
- Logga in på Azure-portalen som administratör för externt ID-användarflöde för din Azure AD B2C-klient.
- Om du har åtkomst till flera klientorganisationer väljer du ikonen Inställningar på den översta menyn för att växla till din Azure AD B2C-klientorganisation från menyn Kataloger + prenumerationer.
- I Azure Portal söker du efter och väljer Azure AD B2C.
- Välj Användarflödenoch välj Nytt användarflöde.
- Välj Logga in med hjälp av autentiseringsuppgifter för resursägares lösenord (ROPC).
- Under Versionkontrollerar du att Förhandsversion är markerat och välj sedan Skapa.
- Ange ett namn för användarflödet, till exempel ROPC_Auth.
- Under Ansökanskrav, välj Visa mer.
- Välj de anspråk du behöver för din applikation, till exempel visningsnamn, e-postadress och identitetsleverantör.
- Välj OK, och välj Skapa.
Förutsättning
Om du inte har gjort det lär du dig hur du använder startpaketet för anpassad princip i Kom igång med anpassade principer i Active Directory B2C.
Skapa en princip för resursägare
Öppna filen TrustFrameworkExtensions.xml.
Under elementet BuildingBlocks letar du upp elementet ClaimsSchema och lägger sedan till följande anspråkstyper:
<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>Efter ClaimsSchemalägger du till ett ClaimsTransformations-element 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>Leta upp elementet ClaimsProvider som har ett DisplayName-
Local Account SignInoch 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 ProxyIdentityExperienceFramework-programmet som du skapade i förhandskravshandledningen. Ersätt sedan DefaultValue för resource_id med program-ID:t för IdentityExperienceFramework-programmet som du också skapade i förkunskapsguiden.
Lägg till följande ClaimsProvider--element med deras tekniska profiler i ClaimsProviders--elementet:
<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>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>På sidan Anpassade principer i din Azure AD B2C-klient väljer du Ladda upp princip.
Aktivera Skriv över principen om den finnsoch bläddra sedan till och välj filen TrustFrameworkExtensions.xml.
Välj Ladda upp.
Skapa en förlitande partfil
Uppdatera sedan filen för den förlitande parten som initierar den användarresa som du skapade:
Gör en kopia av SignUpOrSignin.xml filen i arbetskatalogen och byt namn på den till ROPC_Auth.xml.
Öppna den nya filen och ändra värdet för attributet PolicyId för TrustFrameworkPolicy till ett unikt värde. Policy-ID är namnet på din policy. Till exempel B2C_1A_ROPC_Auth.
Ändra värdet för attributet ReferenceId i DefaultUserJourney till
ResourceOwnerPasswordCredentials.Ändra elementet OutputClaims 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="" />På sidan Anpassade principer i din Azure AD B2C-klient väljer du Ladda upp princip.
Aktivera Skriv över policyn om den finnsoch bläddra sedan till och välj filenROPC_Auth.xml.
Välj Ladda upp.
Testa ROPC-flödet
Använd ditt favorit-API-utvecklingsprogram för att generera en API-förfrågan och granska svaret från API-anropet för att felsöka din policy. 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_Authmed det fullständiga namnet på principen för lösenordsuppgifter för resursägaren.
| Nyckel | Värde |
|---|---|
| användarnamn | user-account |
| lösenord | password1 |
| tilldelningstyp | lösenord |
| omfattning | OpenID application-id offline_access |
| klient-id | application-id |
| respons_typ | Token id_token |
- Ersätt
user-accountmed namnet på ett användarkonto i klientorganisationen. - Ersätt
password1med lösenordet för användarkontot. - Ersätt
application-idmed 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+00001111-aaaa-2222-bbbb-3333cccc4444+offline_access&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&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 förnyelsetoken
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_Authmed det fullständiga namnet på principen för lösenordsuppgifter för resursägaren.
| Nyckel | Värde |
|---|---|
| tilldelningstyp | uppdateringstoken |
| respons_typ | identitets_token |
| klient-id | application-id |
| resurs | application-id |
| uppdateringstoken | refresh-token |
- Ersätt
application-idmed program-ID:t från ROPC_Auth_app-registreringen. - Ersätt
refresh-tokenmed 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.
-
Resolution: När du skapar din appregistrering i Azure AD B2C måste du manuellt redigera programmanifestet och ange värdet för egenskapen
oauth2AllowImplicitFlowtilltrue. När du har konfigurerat egenskapenoauth2AllowImplicitFlowkan det ta några minuter (vanligtvis inte fler än fem) innan ändringen börjar gälla.
Använd en inbyggd 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 för OAuth 2.0 och OpenID Connect som implementerar moderna metodtips.