اكتب أول نهج مخصص ل Azure Active Directory B2C - مرحبًا بالعالم!

في التطبيق الخاص بك، يمكنك استخدام تدفقات المستخدم التي تمكن المستخدمين من التسجيل أو تسجيل الدخول أو إدارة ملف التعريف الخاص بهم. عندما لا تغطي تدفقات المستخدم جميع الاحتياجات الخاصة بعملك، يمكنك استخدام نهج مخصصة.

بينما يمكنك استخدام حزمة بداية النهج المخصصة مسبقة الصنع لكتابة نهج مخصصة، فمن المهم بالنسبة لك فهم كيفية إنشاء نهج مخصص. في هذه المقالة، ستتعلم كيفية إنشاء أول نهج مخصص من البداية.

المتطلبات الأساسية

إشعار

هذه المقالة هي جزء من سلسلة دليل كيفية إنشاء وتشغيل النهج المخصصة الخاصة بك في Azure Active Directory B2C. نوصي ببدء تشغيل هذه السلسلة من المقالة الأولى.

الخطوة 1 - تكوين مفاتيح التوقيع والتشفير

إذا لم تكن قد فعلت ذلك بالفعل، فقم بإنشاء مفاتيح التشفير التالية. لأتمتة التنقل أدناه، تفضل بزيارة تطبيق إعداد IEF واتبع الإرشادات:

  1. استخدم الخطوات الواردة في إضافة مفاتيح التوقيع والتشفير لتطبيقات إطار عمل تجربة الهوية لإنشاء مفتاح التوقيع.

  2. استخدم الخطوات الواردة في إضافة مفاتيح التوقيع والتشفير لتطبيقات إطار عمل تجربة الهوية لإنشاء مفتاح التشفير.

الخطوة 2 - إنشاء ملف النهج المخصص

  1. في VS Code، قم بإنشاء الملف ContosoCustomPolicy.XMLوفتحه .

  2. في ContosoCustomPolicy.XML الملف، أضف التعليمات البرمجية التالية:

        <?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="yourtenant.onmicrosoft.com"
          PolicyId="B2C_1A_ContosoCustomPolicy"
          PublicPolicyUri="http://yourtenant.onmicrosoft.com/B2C_1A_ContosoCustomPolicy">
    
            <BuildingBlocks>
                <!-- Building Blocks Here-->
            </BuildingBlocks>
    
            <ClaimsProviders>
                <!-- Claims Providers Here-->
            </ClaimsProviders>
    
            <UserJourneys>
                <!-- User Journeys Here-->
            </UserJourneys>
    
            <RelyingParty>
                <!-- 
                    Relying Party Here that's your policy’s entry point
                    Specify the User Journey to execute 
                    Specify the claims to include in the token that is returned when the policy runs
                -->
            </RelyingParty>
        </TrustFrameworkPolicy>
    
    

    استبدل yourtenant بجزء النطاق الفرعي من اسم المستأجر الخاص بك، مثل contoso. تعرف على كيفية الحصول على اسم المستأجر لديك.

    تحدد عناصر XML عنصر المستوى TrustFrameworkPolicy الأعلى لملف النهج بمعرف النهج واسم المستأجر الخاص به. يحتوي عنصر TrustFrameworkPolicy على عناصر XML أخرى ستستخدمها في هذه السلسلة.

  3. للإعلان عن مطالبة، أضف التعليمات البرمجية التالية في BuildingBlocks قسم من ContosoCustomPolicy.XML الملف:

      <ClaimsSchema>
        <ClaimType Id="objectId">
            <DisplayName>unique object Id for subject of the claims being returned</DisplayName>
            <DataType>string</DataType>
        </ClaimType>        
        <ClaimType Id="message">
            <DisplayName>Will hold Hello World message</DisplayName>
            <DataType>string</DataType>
        </ClaimType>
      </ClaimsSchema>
    

    المطالبة مثل متغير. يظهر إعلان المطالبة أيضا نوع بيانات المطالبة.

  4. في ClaimsProviders قسم من ContosoCustomPolicy.XML الملف، أضف التعليمات البرمجية التالية:

        <ClaimsProvider>
          <DisplayName>Token Issuer</DisplayName>
          <TechnicalProfiles>
            <TechnicalProfile Id="JwtIssuer">
              <DisplayName>JWT Issuer</DisplayName>
              <Protocol Name="None" />
              <OutputTokenFormat>JWT</OutputTokenFormat>
              <Metadata>
                <Item Key="client_id">{service:te}</Item>
                <Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
                <Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
              </Metadata>
              <CryptographicKeys>
                <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
                <Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer" />
              </CryptographicKeys>
            </TechnicalProfile>
          </TechnicalProfiles>
        </ClaimsProvider>
    
        <ClaimsProvider>
          <!-- The technical profile(s) defined in this section is required by the framework to be included in all custom policies. -->
          <DisplayName>Trustframework Policy Engine TechnicalProfiles</DisplayName>
          <TechnicalProfiles>
            <TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
              <DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
              <Protocol Name="None" />
              <Metadata>
                <Item Key="url">{service:te}</Item>
              </Metadata>
            </TechnicalProfile>
          </TechnicalProfiles>
        </ClaimsProvider>
    

    لقد أعلنا عن مصدر رمز JWT المميز. في CryptographicKeys القسم ، إذا استخدمت أسماء مختلفة لتكوين مفاتيح التوقيع والتشفير في الخطوة 1، فتأكد من استخدام القيمة الصحيحة ل StorageReferenceId.

  5. في UserJourneys قسم من ContosoCustomPolicy.XML الملف، أضف التعليمات البرمجية التالية:

      <UserJourney Id="HelloWorldJourney">
        <OrchestrationSteps>
          <OrchestrationStep Order="1" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
        </OrchestrationSteps>
      </UserJourney>
    

    لقد أضفنا UserJourney. تحدد رحلة المستخدم منطق العمل الذي يمر به المستخدم النهائي أثناء معالجة Azure AD B2C لطلب. تحتوي رحلة المستخدم هذه على خطوة واحدة فقط تصدر رمز JTW المميز مع المطالبات التي ستحددها في الخطوة التالية.

  6. في RelyingParty قسم من ContosoCustomPolicy.XML الملف، أضف التعليمات البرمجية التالية:

      <DefaultUserJourney ReferenceId="HelloWorldJourney"/>
      <TechnicalProfile Id="HelloWorldPolicyProfile">
        <DisplayName>Hello World Policy Profile</DisplayName>
        <Protocol Name="OpenIdConnect" />
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
          <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
        </OutputClaims>
        <SubjectNamingInfo ClaimType="sub" />
      </TechnicalProfile>
    

    قسم RelyingParty هو نقطة الإدخال إلى النهج الخاص بك. يحدد UserJourney لتنفيذ والمطالبات المراد تضمينها في الرمز المميز الذي يتم إرجاعه عند تشغيل النهج.

بعد إكمال الخطوة 2، ContosoCustomPolicy.XML يجب أن يبدو الملف مشابها للتعليمات البرمجية التالية:

    <?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="Contosob2c2233.onmicrosoft.com" PolicyId="B2C_1A_ContosoCustomPolicy" PublicPolicyUri="http://Contosob2c2233.onmicrosoft.com/B2C_1A_ContosoCustomPolicy">
        <BuildingBlocks>
            <ClaimsSchema>
            <ClaimType Id="objectId">
                <DisplayName>unique object Id for subject of the claims being returned</DisplayName>
                <DataType>string</DataType>
            </ClaimType>        
            <ClaimType Id="message">
                <DisplayName>Will hold Hello World message</DisplayName>
                <DataType>string</DataType>
            </ClaimType>
            </ClaimsSchema>
        </BuildingBlocks>
        <ClaimsProviders><!--Claims Providers Here-->
            <ClaimsProvider>
                <DisplayName>Token Issuer</DisplayName>
                <TechnicalProfiles>
                    <TechnicalProfile Id="JwtIssuer">
                        <DisplayName>JWT Issuer</DisplayName>
                        <Protocol Name="None"/>
                        <OutputTokenFormat>JWT</OutputTokenFormat>
                        <Metadata>
                            <Item Key="client_id">{service:te}</Item>
                            <Item Key="issuer_refresh_token_user_identity_claim_type">objectId</Item>
                            <Item Key="SendTokenResponseBodyWithJsonNumbers">true</Item>
                        </Metadata>
                        <CryptographicKeys>
                            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer"/>
                            <Key Id="issuer_refresh_token_key" StorageReferenceId="B2C_1A_TokenEncryptionKeyContainer"/>
                        </CryptographicKeys>
                    </TechnicalProfile>
                </TechnicalProfiles>
            </ClaimsProvider>
    
            <ClaimsProvider>
            <DisplayName>Trustframework Policy Engine TechnicalProfiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="TpEngine_c3bd4fe2-1775-4013-b91d-35f16d377d13">
                <DisplayName>Trustframework Policy Engine Default Technical Profile</DisplayName>
                <Protocol Name="None" />
                <Metadata>
                    <Item Key="url">{service:te}</Item>
                </Metadata>
                </TechnicalProfile>
            </TechnicalProfiles>
            </ClaimsProvider>
        </ClaimsProviders>
      <UserJourneys>
        <UserJourney Id="HelloWorldJourney">
          <OrchestrationSteps>
            <OrchestrationStep Order="1" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
          </OrchestrationSteps>
        </UserJourney>
      </UserJourneys>
        <RelyingParty><!-- 
                Relying Party Here that's your policy’s entry point
                Specify the User Journey to execute 
                Specify the claims to include in the token that is returned when the policy runs
            -->
            <DefaultUserJourney ReferenceId="HelloWorldJourney"/>
            <TechnicalProfile Id="HelloWorldPolicyProfile">
                <DisplayName>Hello World Policy Profile</DisplayName>
                <Protocol Name="OpenIdConnect"/>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" DefaultValue="abcd-1234-efgh-5678-ijkl-etc."/>
                    <OutputClaim ClaimTypeReferenceId="message" DefaultValue="Hello World!"/>
                </OutputClaims>
                <SubjectNamingInfo ClaimType="sub"/>
            </TechnicalProfile>
        </RelyingParty>
    </TrustFrameworkPolicy>

الخطوة 3 - تحميل ملف نهج مخصص

  1. سجل الدخول إلى مدخل Azure.
  2. إذا كان لديك حق الوصول إلى عدة مستأجرين، فحدد رمز الإعدادات في القائمة العلوية للتبديل إلى مستأجر Azure AD B2C من قائمة Directories + subscriptions.
  3. في مدخل Microsoft Azure، ابحث عن Azure AD B2C وحددها.
  4. في القائمة اليسرى، ضمن Policies، حدد Identity Experience Framework.
  5. حدد تحميل نهج مخصص، واستعرض تحديد ثم قم بتحميل ContosoCustomPolicy.XML الملف.

بعد تحميل الملف، يضيف Azure AD B2C البادئة B2C_1A_، بحيث تبدو الأسماء مشابهة B2C_1A_CONTOSOCUSTOMPOLICY.

الخطوة 4 - اختبار النهج المخصص

  1. ضمن نهج مخصصة، حدد B2C_1A_CONTOSOCUSTOMPOLICY.
  2. بالنسبة إلى Select application في صفحة النظرة العامة للنهج المخصص، حدد تطبيق الويب مثل webapp1 الذي قمت بتسجيله مسبقا. تأكد من تعيين قيمة تحديد عنوان URL للرد إلىhttps://jwt.ms.
  3. حدد الزر تشغيل الآن .

بعد انتهاء النهج من التنفيذ، تتم إعادة توجيهك إلى https://jwt.ms، وترى رمز JWT المميز الذي تم فك ترميزه. يبدو مشابها لمقتطف الرمز المميز JWT التالي:

    {
      "typ": "JWT",
      "alg": "RS256",
      "kid": "pxLOMWFg...."
    }.{
      ...
      "sub": "abcd-1234-efgh-5678-ijkl-etc.",
      ...
      "acr": "b2c_1a_contosocustompolicy",
      ...
      "message": "Hello World!"
    }.[Signature]

message لاحظ المطالبات وsub، التي قمنا بتعيينها كمطالبات إخراج في RelyingParty القسم .

الخطوات التالية

في هذه المقالة، تعلمت أربعة أقسام مضمنة في نهج Azure AD B2C المخصص واستخدمتها. تتم إضافة هذه الأقسام كعناصر تابعة للعنصر TrustFrameworkPolicy الجذر:

  • BuildingBlocks
  • ClaimsProviders
  • UserJourneys
  • RelyingParty

بعد ذلك، تعرف على: