Siapkan alur informasi masuk kata sandi pemilik sumber daya di Azure Active Directory B2C

Sebelum memulai, gunakan pemilih Pilih jenis kebijakan untuk memilih jenis kebijakan yang Anda siapkan. Azure Active Directory B2C menawarkan dua metode untuk menentukan cara pengguna berinteraksi dengan aplikasi Anda: melalui alur pengguna yang telah ditentukan sebelumnya atau melalui kebijakan kustom yang sepenuhnya dapat dikonfigurasi. Langkah yang diperlukan dalam artikel ini berbeda untuk setiap metode.

Di Azure Active Directory B2C (Azure AD B2C), alur informasi masuk kata sandi pemilik sumber daya (ROPC) adalah alur autentikasi standar OAuth. Dalam alur ini, suatu aplikasi, juga diketahui sebagai pihak yang mengandalkan, bertukar informasi masuk yang valid untuk token. Informasi masuk termasuk ID pengguna dan kata sandi. Token yang dikembalikan adalah token ID, token akses, dan token refresh.

Peringatan

Kami menyarankan agar Anda tidak menggunakan alur ROPC. Dalam sebagian besar skenario, alternatif yang lebih aman tersedia dan direkomendasikan. Alur ini membutuhkan tingkat kepercayaan yang sangat tinggi dalam aplikasi dan membawa risiko yang tidak ada dalam alur lain. Anda seharusnya hanya menggunakan alur ini saat alur lain yang lebih aman tidak dapat digunakan.

Catatan alur ROPC

Di Azure Active Directory B2C (Azure AD B2C), opsi berikut ini didukung:

  • Klien Asli: Interaksi pengguna selama autentikasi terjadi saat kode berjalan pada perangkat sisi pengguna. Perangkat ini dapat menjadi aplikasi seluler yang berjalan dalam sistem operasi asli, seperti Android dan iOS.
  • Alur klien publik: Hanya informasi masuk pengguna, yang dikumpulkan oleh aplikasi, yang dikirim dalam panggilan API. Kredensial aplikasi tidak dikirim.
  • Menambahkan klaim baru: Konten token ID dapat diubah untuk menambahkan klaim baru.

Alur berikut ini tidak didukung:

  • Server-to-server: Sistem perlindungan identitas membutuhkan alamat IP yang dapat diandalkan, yang dikumpulkan dari penelepon (klien asli), sebagai bagian dari interaksi. Dalam panggilan API sisi server, hanya alamat IP server yang digunakan. Jika ambang dinamis autentikasi yang gagal terlampaui, sistem perlindungan identitas dapat mengidentifikasi alamat IP berulang sebagai penyerang.
  • Alur klien rahasia: ID klien aplikasi divalidasi, tetapi rahasia aplikasi tidak divalidasi.

Saat menggunakan alur ROPC, pertimbangkan hal berikut:

  • ROPC tidak berfungsi ketika ada gangguan pada alur autentikasi yang membutuhkan interaksi pengguna. Misalnya, ketika kata sandi telah kedaluwarsa atau perlu diubah, autentikasi multifaktor diperlukan, atau ketika lebih banyak informasi perlu dikumpulkan selama proses masuk (misalnya, persetujuan pengguna).
  • ROPC hanya mendukung akun lokal. Pengguna tidak dapat login dengan penyedia identitas federasi seperti Microsoft, Google+, Twitter, AD-FS, atau Facebook.
  • Manajemen Sesi, termasuk membuat saya tetap masuk (KMSI), tidak berlaku.

Daftarkan aplikasi

Untuk mendaftarkan aplikasi di penyewa Azure AD B2C, Anda dapat menggunakan pengalaman pendaftaran Aplikasi terpadu kami yang baru atau pengalaman Aplikasi (Warisan) warisan kami. Pelajari lebih lanjut tentang pengalaman baru.

  1. Masuk ke portal Azure.
  2. Pastikan Anda menggunakan direktori yang berisi penyewa Azure AD B2C Anda:
    1. Pilih ikon Direktori + langganan di bilah alat portal.
    2. Pada Setelan portal | Direktori + langganan, temukan direktori Azure AD B2C Anda di daftar Nama direktori, lalu pilih Beralih.
  3. Di portal Azure, cari dan pilih Azure AD B2C
  4. Pilih Pendaftaran aplikasi, lalu pilih Pendaftaran baru.
  5. Masukkan Nama untuk aplikasi. Misalnya, ROPC_Auth_app.
  6. Biarkan nilai lain apa adanya, lalu pilih Daftarkan.
  7. Rekam ID Aplikasi (klien) untuk digunakan di langkah selanjutnya.
  8. Di bagian Kelola, pilih Autentikasi.
  9. Pilih Coba pengalaman baru (jika ditampilkan).
  10. Di bagian Pengaturan tingkat lanjut, dan bagian Aktifkan alur seluler dan desktop berikut, pilih Ya untuk memperlakukan aplikasi sebagai klien publik. Pengaturan ini diperlukan untuk aliran ROPC.
  11. Pilih Simpan.
  12. Di menu sebelah kiri, pilih Manifes untuk membuka editor manifes.
  13. Atur atribut oauth2AllowImplicitFlow ke true:
    "oauth2AllowImplicitFlow": true,
    
  14. Pilih Simpan.

Membuat alur pengguna pemilik sumber daya

  1. Masuk ke portal Azure sebagai administrator globalpenyewa Azure AD B2C Anda.
  2. Jika Anda memiliki akses ke beberapa penyewa, pilih ikon Pengaturan di menu atas untuk beralih ke penyewa Azure AD B2C Anda dari menu Direktori + langganan.
  3. Di portal Microsoft Azure, cari dan pilih AAD B2C.
  4. Pilih Alur pengguna, dan pilih Alur pengguna baru.
  5. Pilih Masuk menggunakan info masuk kata sandi pemilik sumber daya (ROPC).
  6. Di bawah Versi, pastikan Pratinjau dipilih, lalu pilih Buat.
  7. Berikan nama untuk alur pengguna, seperti ROPC_Auth.
  8. Di bawah Klaim aplikasi, klik Tampilkan lainnya.
  9. Pilih klaim aplikasi yang Anda butuhkan untuk aplikasi Anda, seperti Nama Tampilan, Alamat Surel, dan IdP.
  10. Pilih OK, lalu pilih Buat.

Prasyarat

Jika Anda belum melakukannya, pelajari tentang paket starter kebijakan kustom di Mulai dengan kebijakan kustom di Azure Active Directory B2C.

Membuat kebijakan pemilik sumber daya

  1. Buka file TrustFrameworkExtensions.xml.

  2. Jika belum ada, tambahkan elemen ClaimsSchema dan elemen anaknya sebagai elemen pertama di bawah elemen 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. Setelah ClaimsSchema, tambahkan elemen ClaimsTransformations dan elemen anaknya ke elemen 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. Temukan elemen ClaimsProvider yang memiliki DisplayName dari Local Account SignIn dan tambahkan profil teknis berikut:

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

    Ganti DefaultValue dari client_id dengan ID Aplikasi dari aplikasi ProxyIdentityExperienceFramework yang Anda buat dalam tutorial prasyarat. Lalu ganti DefaultValue dari resource_id dengan ID Aplikasi dari aplikasi IdentityExperienceFramework yang juga Anda buat dalam tutorial prasyarat.

  5. Tambahkan elemen ClaimsProvider berikut dengan profil teknis mereka ke elemen 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. Tambahkan elemen UserJourneys dan elemen anaknya ke elemen 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. Pada halaman Kebijakan Kustom di penyewa Azure Active Directory B2C Anda, pilih Unggah Kebijakan.

  8. Aktifkan Timpa kebijakan jika ada, lalu telusuri dan pilih file TrustFrameworkExtensions.xml.

  9. Pilih Unggah.

Membuat file pihak yang mengandalkan

Selanjutnya, perbarui file pihak yang mengandalkan yang memulai perjalanan pengguna yang Anda buat:

  1. Buat salinan file SignUpOrSignin.xml di direktori kerja Anda dan ganti namanya menjadi ROPC_Auth.xml.

  2. Buka file baru dan ubah nilai atribut PolicyId untuk TrustFrameworkPolicy menjadi nilai yang unik. ID kebijakan adalah nama kebijakan Anda. Misalnya, B2C_1A_ROPC_Auth.

  3. Ubah nilai atribut ReferenceId di DefaultUserJourney menjadi ResourceOwnerPasswordCredentials.

  4. Ubah elemen OutputClaims menjadi hanya berisi klaim berikut:

    <OutputClaim ClaimTypeReferenceId="sub" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="displayName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="givenName" DefaultValue="" />
    <OutputClaim ClaimTypeReferenceId="surname" DefaultValue="" />
    
  5. Pada halaman Kebijakan Kustom di penyewa Azure Active Directory B2C Anda, pilih Unggah Kebijakan.

  6. Aktifkan Timpa kebijakan jika ada, lalu telusuri dan pilih file ROPC_Auth.xml.

  7. Pilih Unggah.

Menguji aliran ROPC

Gunakan aplikasi pengembangan API favorit Anda untuk menghasilkan panggilan API, dan tinjau respons untuk men-debug kebijakan Anda. Buat panggilan seperti contoh ini dengan informasi berikut sebagai isi permintaan POST:

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

  • Ganti <tenant-name> dengan nama penyewa Azure AD B2C Anda.
  • Ganti B2C_1A_ROPC_Auth dengan nama lengkap kebijakan info masuk kata sandi pemilik sumber daya Anda.
Tombol Nilai
Nama pengguna user-account
kata sandi password1
grant_type kata sandi
cakupan openid application-id offline_access
client_id application-id
response_type token id_token
  • Ganti user-account dengan nama akun pengguna di penyewa Anda.
  • Ganti password1 dengan kata sandi akun pengguna.
  • Ganti application-id dengan ID Aplikasi dari pendaftaran ROPC_Auth_app.
  • Offline_access opsional jika Anda ingin menerima token refresh.

Permintaan POST yang sebenarnya terlihat seperti contoh berikut:

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

Respons yang berhasil dengan akses offline terlihat seperti contoh berikut:

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

Menukarkan token refresh

Buat panggilan POST seperti yang ditunjukkan di sini. Gunakan informasi dalam tabel berikut ini sebagai isi permintaan:

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

  • Ganti <tenant-name> dengan nama penyewa Azure AD B2C Anda.
  • Ganti B2C_1A_ROPC_Auth dengan nama lengkap kebijakan info masuk kata sandi pemilik sumber daya Anda.
Tombol Nilai
grant_type refresh_token
response_type id_token
client_id application-id
sumber daya application-id
refresh_token refresh-token
  • Ganti application-id dengan ID Aplikasi dari pendaftaran ROPC_Auth_app.
  • Ganti refresh-token dengan refresh_token yang dikirim kembali di respons sebelumnya.

Respons yang berhasil terlihat seperti contoh berikut:

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

Pemecahan Masalah

Aplikasi yang disediakan tidak dikonfigurasi untuk mengizinkan alur Implisit 'OAuth'

  • Gejala - Anda menjalankan alur ROPC, dan mendapatkan pesan berikut: AADB2C90057: Aplikasi yang disediakan tidak dikonfigurasi untuk mengizinkan alur Implisit 'OAuth'.
  • Kemungkinan penyebab - Alur implisit tidak diizinkan untuk aplikasi Anda.
  • Resolusi: Saat membuat registrasi aplikasi di Azure AD B2C, Anda harus mengedit manifes aplikasi secara manual dan mengatur nilai properti oauth2AllowImplicitFlow ke true. Setelah Anda mengonfigurasi properti oauth2AllowImplicitFlow, hal ini dapat memakan waktu beberapa menit (biasanya tidak lebih dari lima menit) agar perubahan diterapkan.

Gunakan SDK asli atau App-Auth

Azure AD B2C memenuhi standar OAuth 2.0 untuk info masuk kata sandi pemilik sumber daya klien publik dan harus kompatibel dengan sebagian besar SDK klien. Untuk informasi terbaru, lihat SDK Aplikasi Asli untuk OAuth 2.0 dan OpenID Connect yang menerapkan praktik terbaik modern.

Langkah berikutnya

Unduh sampel kerja yang telah dikonfigurasi untuk digunakan dengan Azure AD B2C dari GitHub, untuk Android dan untuk iOS.