Kata pengantar
Kelanjutan siklus bekerja dengan Azure B2C. Dalam artikel ini saya akan berbicara tentang hal yang paling sulit dan tidak jelas, yaitu Kerangka Kerja Pengalaman Identitas.Tujuan utamanya adalah untuk mengumpulkan gambar bagi mereka yang tidak sama sekali dalam subjek dan membantu mengatur beberapa fitur dasar.Tautan ke pos terkaitPengaturan dasar
Sebelum memulai pengaturan dasar, saya ingin memberi tahu Anda bagaimana proses memuat aturan baru terjadi:- Pergi ke Kerangka Kerja Pengalaman Identitas
- Klik kirim kebijakan pengguna
- Pilih file (jangan lupa klik "Timpa kebijakan khusus, jika sudah ada")
- Kami kirim
Bahkan, tidak ada yang berubah dari terakhir kali, TAPI:Jika Anda mengubah file TrustFrameworkExtension.xml atau TrustFrameworkBase.xml - unduh file secara berkala yang merujuk padanya.
Terkadang, ketika Anda membuat perubahan pada salah satu file ini, Anda menguji, itu terjadi bahwa perubahan Anda tidak muncul. Ini disebabkan oleh fakta bahwa
Anda mengubah sesuatu di file dasar sehingga selama verifikasi file anak akan menghasilkan kesalahan.
Dalam artikel terakhir, kami memutuskan bahwa kami telah menambahkan file berikut:a.TrustFrameworkBase.xml
b.TrustFrameworkExtensions.xml
c.SignUpOrSignin. XML
d.ProfileEdit. XML
e.PasswordReset. XML
Sekarang saya ingin menceritakan secara terperinci tentang masing-masing dari mereka.TrustFrameworkBase.xmlFile ini berisi pengaturan dasar. Sebenarnya, ini adalah dasar dari dasar-dasarnya, tetapi dalam tutorial mereka kebanyakan mengatakan "Lebih baik tidak menyentuh file ini." Ini sebagian benar, tetapi ada beberapa poin yang tidak dibicarakan:- Setiap tutorial yang mengatakan untuk membuat perubahan pada TrustFrameworkExtensions.xml pada dasarnya menulis ulang aturan dari TrustFrameworkBase.xml
- Ada situasi ketika lebih mudah untuk mengubah sesuatu di TrustFrameworkBase.xml .
- Jika Anda menemukan di file lain tautan ke objek yang tidak ada di file-file ini, maka itu terletak 100% di TrustFrameworkBase.xml dan Anda dapat membukanya dan melihat
Dari pengalaman saya, saya akan mengatakan - Saya hanya mengubah dua hal dalam file ini (Pelokalan dan menghapus satu bidang).TrustFrameworkExtension.xmlDengan file ini Anda akan menghabiskan banyak waktu bersama. Sebenarnya, ini adalah file utama untuk pengaturan Anda. Dia terus-menerus disebutkan dalam tutorial.SignUpOrSignin. XML, ProfileEdit. XML, PasswordReset. XMLFile-file ini adalah halaman daun. Anda mungkin ingin menambahkan milik Anda. Mereka akan memiliki jumlah perubahan paling sedikit.Sekarang mari kita bicara tentang struktur file. Semua file memiliki struktur yang sama, jadi saya akan menjelaskannya berdasarkan file TrustFrameworkExtension.xml .File ini dibagi menjadi beberapa blok utama<TrustFrameworkPolicy>
<BasePolicy>
<TenantId>customtenant.onmicrosoft.com</TenantId>
<PolicyId>B2C_1A_TrustFrameworkBase</PolicyId>
</BasePolicy>
<BuildingBlocks>
</BuildingBlocks>
<ClaimsProviders>
</ClaimsProviders>
<UserJourneys>
</UserJourneys>
</TrustFrameworkPolicy>
Sekarang tentang setiap blok secara terpisah.Blok bangunan
Di blok ini kita menambahkan "alat" yang bisa kita gunakan dalam pekerjaan di masa depan.ClaimsSchemaelemen ClaimsSchema menentukan jenis laporan, yang dapat dirujuk dalam kebijakan tersebut. <BuildingBlocks>
<ClaimsSchema>
<ClaimType Id="picture">
<DisplayName>Picture</DisplayName>
<DataType>string</DataType>
</ClaimType>
<ClaimType Id="country">
<DisplayName>Country</DisplayName>
<DataType>string</DataType>
<UserInputType>DropdownSingleSelect</UserInputType>
<Restriction>
<Enumeration Text="Russia" Value="russia" SelectByDefault="false" />
<Enumeration Text="Other" Value="other" SelectByDefault="false" />
</Restriction>
</ClaimType>
...
</ClaimsSchema>
PredikatPredikat dan elemen validasi predikat memungkinkan validasi untuk memastikan bahwa hanya data yang dibentuk dengan benar dimasukkan ke klien Azure Active Directory B2C (Azure AD B2C). <Predicates>
<Predicate Id="LengthRange" Method="IsLengthRange">
<UserHelpText>The password must be between 6 and 64 characters.</UserHelpText>
<Parameters>
<Parameter Id="Minimum">6</Parameter>
<Parameter Id="Maximum">64</Parameter>
</Parameters>
</Predicate>
<Predicate Id="Lowercase" Method="IncludesCharacters">
<UserHelpText>a lowercase letter</UserHelpText>
<Parameters>
<Parameter Id="CharacterSet">a-z</Parameter>
</Parameters>
</Predicate>
...
</Predicates>
PredicateValidations.Sementara predikat menentukan apakah jenis pernyataan divalidasi, PredicateValidations mengelompokkan seperangkat predikat untuk membentuk cek input pengguna yang cocok dengan jenis pernyataan. <PredicateValidations>
<PredicateValidation Id="CustomPassword">
<PredicateGroups>
<PredicateGroup Id="LengthGroup">
<PredicateReferences MatchAtLeast="1">
<PredicateReference Id="LengthRange" />
</PredicateReferences>
</PredicateGroup>
<PredicateGroup Id="CharacterClasses">
<UserHelpText>The password must have at least 1 of the following:</UserHelpText>
<PredicateReferences MatchAtLeast="2">
<PredicateReference Id="Lowercase" />
<PredicateReference Id="Uppercase" />
...
</PredicateReferences>
</PredicateGroup>
</PredicateGroups>
</PredicateValidation>
</PredicateValidations>
ClaimsTransformationselemen ClaimsTransformations berisi daftar fungsi pernyataan transformasi yang dapat digunakan di jalan interaksi pengguna sebagai bagian dari kebijakan kustom. <ClaimsTransformations>
<ClaimsTransformation Id="GenerateSendGridRequestBody" TransformationMethod="GenerateJson">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.to.0.email" />
<InputClaim ClaimTypeReferenceId="otp" TransformationClaimType="personalizations.0.dynamic_template_data.otp" />
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="personalizations.0.dynamic_template_data.email" />
</InputClaims>
<InputParameters>
<InputParameter Id="template_id" DataType="string" Value="d-b0000000000000000000000000000000" />
<InputParameter Id="from.email" DataType="string" Value="custom@email.com" />
<InputParameter Id="personalizations.0.dynamic_template_data.subject" DataType="string" Value="Welcome to Habr!"/>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="sendGridReqBody" TransformationClaimType="outputClaim" />
</OutputClaims>
</ClaimsTransformation>
...
</ClaimsTransformations>
ContentDefinitionsMemungkinkan Anda menentukan template untuk setiap halaman Anda. <ContentDefinitions>
<ContentDefinition Id="api.signuporsignin">
<LoadUri>https://azure.blob.core.windows.net/yourblobstorage/pagelayoutfile.html</LoadUri>
<RecoveryUri>~/common/default_page_error.html</RecoveryUri>
<DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:1.2.0</DataUri>
</ContentDefinition>
...
</ContentDefinitions>
DisplayControlsKontrol Display adalah elemen antarmuka pengguna yang memiliki fitur khusus dan berinteraksi dengan layanan server Azure Active Directory B2C (Azure AD B2C) <DisplayControls>
<DisplayControl Id="emailVerificationControl" UserInterfaceControlType="VerificationControl">
<DisplayClaims>
<DisplayClaim ClaimTypeReferenceId="email" Required="true" />
<DisplayClaim ClaimTypeReferenceId="verificationCode" ControlClaimType="VerificationCode" Required="true" />
</DisplayClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" />
</OutputClaims>
<Actions>
<Action Id="SendCode">
<ValidationClaimsExchange>
<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="GenerateOtp" />
<ValidationClaimsExchangeTechnicalProfile TechnicalProfileReferenceId="SendGrid" />
</ValidationClaimsExchange>
</Action>
...
</Actions>
</DisplayControl>
...
</DisplayControls>
</BuildingBlocks>
Pemberi Klaim
Dalam blok ini, kita akan membuat halaman sendiri, atau lebih tepatnya isinya. Di sini kami akan menunjukkan apa halaman memiliki input dan output data.ClaimsProvider menautkan profil teknis ke penyedia klaim. <ClaimsProviders>
<ClaimsProvider>
<DisplayName>Self Asserted</DisplayName>
Elemen TechnicalProfiles berisi sekumpulan profil teknis yang didukung oleh penyedia klaim. <TechnicalProfiles>
<TechnicalProfile Id="SelfAsserted-Social">
<DisplayName>User ID signup</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.selfasserted</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="givenName" />
<InputClaim ClaimTypeReferenceId="surname" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="objectId" />
<OutputClaim ClaimTypeReferenceId="newUser" />
<OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
<OutputClaim ClaimTypeReferenceId="givenName" Required="true"/>
<OutputClaim ClaimTypeReferenceId="surname" Required="true"/>
<OutputClaim ClaimTypeReferenceId="country" Required="true"/>
</OutputClaims>
</TechnicalProfile>
</ClaimsProvider>
Contoh menambahkan penyedia identitas Facebook <ClaimsProvider>
<DisplayName>Facebook</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Facebook-OAUTH">
<Metadata>
<Item Key="client_id">FACEBOOK_ID</Item>
<Item Key="scope">email public_profile</Item>
<Item Key="ClaimsEndpoint">https://graph.facebook.com/me?fields=id,first_name,last_name,name,email,picture</Item>
</Metadata>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="picture" PartnerClaimType="picture" />
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
TrustFrameworkBase.xml
<ClaimsProvider>
<Domain>facebook.com</Domain>
<DisplayName>Facebook</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="Facebook-OAUTH">
<DisplayName>Facebook</DisplayName>
<Protocol Name="OAuth2" />
<Metadata>
<Item Key="ProviderName">facebook</Item>
<Item Key="authorization_endpoint">https://www.facebook.com/dialog/oauth</Item>
<Item Key="AccessTokenEndpoint">https://graph.facebook.com/oauth/access_token</Item>
<Item Key="HttpBinding">GET</Item>
<Item Key="UsePolicyInRedirectUri">0</Item>
<Item Key="AccessTokenResponseFormat">json</Item>
</Metadata>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_FacebookSecret" />
</CryptographicKeys>
<InputClaims />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id" />
<OutputClaim ClaimTypeReferenceId="givenName" PartnerClaimType="first_name" />
<OutputClaim ClaimTypeReferenceId="surname" PartnerClaimType="last_name" />
<OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
<OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="facebook.com" AlwaysUseDefaultValue="true" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" AlwaysUseDefaultValue="true" />
</OutputClaims>
<OutputClaimsTransformations>
<OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
<OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
<OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
</OutputClaimsTransformations>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
Userjourneys
The pengguna UserJourneys menunjukkan jalur eksplisit melalui mana kebijakan memungkinkan aplikasi klaim berbasis untuk memberikan pengguna dengan klaim yang diperlukan.Di bawah ini saya menambahkan beberapa hal sederhana, sisanya mudah ditemukan di tutorial yang akan saya tambahkan di bawah ini. <UserJourneys>
<UserJourney Id="SignUp">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange" ContentDefinitionReferenceId="api.localaccountsignup">
<ClaimsExchanges>
<ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonEmail-2" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
<ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>
<UserJourney Id="PasswordReset">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="NewCredentials" TechnicalProfileReferenceId="LocalAccountWritePasswordUsingObjectId" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
<ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>
...
</UserJourneys>
Contoh Pertukaran Klaim ExchangeClaimsExchanges .
<ClaimsProviderSelections>
<ClaimsProviderSelection TargetClaimsExchangeId="FacebookExchange" />
<ClaimsProviderSelection TargetClaimsExchangeId="GoogleExchange" />
<ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
</ClaimsProviderSelections>
<ClaimsExchanges>
<ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Email" />
</ClaimsExchanges>
Tugas Khas
Sebagai hasil dari hal di atas, akan lebih mudah bagi Anda untuk memahami tutorial di bawah ini.SignUpOrSignin.XML, ProfileEdit.XML, PasswordReset.XML
Ini adalah file terakhir tempat Anda dapat menimpa \ tambahkan BuildingBlocks dan tempat kami menunjukkan data apa yang akan ditambahkan ke token. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<TrustFrameworkPolicy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.microsoft.com/online/cpim/schemas/2013/06" PolicySchemaVersion="0.3.0.0" TenantId="antekesd.onmicrosoft.com" PolicyId="B2C_1A_signup_signin" PublicPolicyUri="http://antekesd.onmicrosoft.com/B2C_1A_signup_signin">
<BasePolicy>
<TenantId>antekesd.onmicrosoft.com</TenantId>
<PolicyId>B2C_1A_TrustFrameworkExtensions</PolicyId>
</BasePolicy>
<BuildingBlocks>
<ContentDefinitions>
<ContentDefinition Id="api.signuporsignin">
<LoadUri>https://some.blob.core.windows.net/some/some.html</LoadUri>
<RecoveryUri>~/common/default_page_error.html</RecoveryUri>
<DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:1.2.0</DataUri>
</ContentDefinition>
</ContentDefinitions>
</BuildingBlocks>
<RelyingParty>
<DefaultUserJourney ReferenceId="SignUpOrSignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="email"/>
<OutputClaim ClaimTypeReferenceId="givenName" Required="true"/>
<OutputClaim ClaimTypeReferenceId="surname" Required="true"/>
<OutputClaim ClaimTypeReferenceId="email" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
<OutputClaim ClaimTypeReferenceId="identityProvider" />
<OutputClaim ClaimTypeReferenceId="tenantId" AlwaysUseDefaultValue="true" DefaultValue="{Policy:TenantObjectId}" />
<OutputClaim ClaimTypeReferenceId="picture" />
<OutputClaim ClaimTypeReferenceId="country" Required="true"/>
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
</TrustFrameworkPolicy>
Pengujian
Untuk menguji perubahan terbaru yang Anda butuhkan:- Pergi ke Kerangka Kerja Pengalaman Identitas
- Pilih Kebijakan yang ingin Anda uji.
- Klik "Jalankan Sekarang"

Kesimpulan
Akibatnya, Anda akan menerima formulir otorisasi yang sepenuhnya (atau hampir) memenuhi persyaratan / pelanggan Anda.Terimakasih atas perhatiannya!