جمع مدخلات المستخدم ومعالجتها باستخدام نهج Azure Active Directory B2C المخصص

تسمح لك النهج المخصصة ل Azure Active Directory B2C (Azure AD B2C) بجمع مدخلات المستخدم. يمكنك بعد ذلك استخدام الأساليب المينة لمعالجة مدخلات المستخدم.

في هذه المقالة، ستتعلم كيفية كتابة نهج مخصص يجمع مدخلات المستخدم عبر واجهة مستخدم رسومية. ثم ستصل إلى المدخلات، وتعالجها، ثم تعيدها أخيرا كمطالبات في رمز JWT المميز. لإكمال هذه المهمة، ستقوم ب:

  • الإعلان عن المطالبات. توفر المطالبة تخزينًا مؤقتًا للبيانات أثناء تنفيذ نهج Azure AD B2C. يمكنه تخزين معلومات حول المستخدم، مثل الاسم الأول أو اسم العائلة أو أي مطالبة أخرى تم الحصول عليها من المستخدم أو الأنظمة الأخرى. يمكنك معرفة المزيد حول المطالبات في نظرة عامة على النهج المخصص ل Azure AD B2C.

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

  • تكوين تحويلات المطالبات، والتي تستخدمها لمعالجة المطالبات التي تعلن عنها.

  • تكوين تعريفات المحتوى. يعرف تعريف المحتوى واجهة المستخدم المراد تحميلها. يمكنك لاحقا تخصيص واجهة المستخدم من خلال توفير محتوى HTML المخصص الخاص بك.

  • تكوين واجهات المستخدم وإظهارها للمستخدم باستخدام ملفات التعريف الفنية المؤكدة ذاتيا و DisplayClaims.

  • استدعاء ملفات التعريف الفنية في تسلسل معين باستخدام خطوات التنسيق.

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

إشعار

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

الخطوة 1 - الإعلان عن المطالبات

الإعلان عن مطالبات إضافية جنبا إلى جنب مع objectId والرسالة:

  1. في VS Code، افتح ContosoCustomPolicy.XML الملف.

  2. في ClaimsSchema القسم ، أضف إعلانات ClaimType التالية:

        <ClaimType Id="givenName">
            <DisplayName>Given Name</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Your given name (also known as first name).</UserHelpText>
            <UserInputType>TextBox</UserInputType>
        </ClaimType>
    
        <ClaimType Id="surname">
            <DisplayName>Surname</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Your surname (also known as family name or last name).</UserHelpText>
            <UserInputType>TextBox</UserInputType>
        </ClaimType>
        <ClaimType Id="displayName">
            <DisplayName>Display Name</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Your display name.</UserHelpText>
            <UserInputType>TextBox</UserInputType>
        </ClaimType>
    

لقد أعلنا عن ثلاثة أنواع المطالبات، givenName، اللقب، و displayName. تتضمن DataTypeهذه الإعلانات وعناصر UserInputTypeDisplayName :

  • يحدد DataType نوع بيانات القيمة التي تحتفظ بها المطالبات. تعرف على المزيد حول أنواع البيانات التي تدعمها عناصر DataType.
  • يحدد UserInputType عنصر تحكم واجهة المستخدم الذي يظهر على واجهة المستخدم إذا كنت تريد جمع قيمة المطالبة من المستخدم. تعرف على المزيد حول أنواع إدخال المستخدم التي يدعمها Azure AD B2C.
  • يحدد DisplayName تسمية عنصر تحكم واجهة المستخدم الذي يظهر على واجهة المستخدم إذا كنت تريد جمع قيمة المطالبة من المستخدم.

الخطوة 2 - تحديد تحويلات المطالبات

يحتوي ClaimsTransformation على دالة تستخدمها لتحويل مطالبة معينة إلى مطالبة أخرى. على سبيل المثال، يمكنك تغيير مطالبة سلسلة من أحرف صغيرة إلى أحرف كبيرة. تعرف على المزيد حول تحويلات المطالبات التي يدعمها Azure AD B2C.

  1. في ContosoCustomPolicy.XML الملف، أضف عنصرا <ClaimsTransformations> كعنصر تابع للمقطع BuildingBlocks .

        <ClaimsTransformations>
    
        </ClaimsTransformations>
    
  2. أضف التعليمات البرمجية ClaimsTransformations التالية داخل العنصر :

        <ClaimsTransformation Id="GenerateRandomObjectIdTransformation" TransformationMethod="CreateRandomString">
            <InputParameters>
            <InputParameter Id="randomGeneratorType" DataType="string" Value="GUID"/>
            </InputParameters>
            <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="outputClaim"/>
            </OutputClaims>
        </ClaimsTransformation>
    
        <ClaimsTransformation Id="CreateDisplayNameTransformation" TransformationMethod="FormatStringMultipleClaims">
            <InputClaims>
            <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1"/>
            <InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="inputClaim2"/>
            </InputClaims>
            <InputParameters>
            <InputParameter Id="stringFormat" DataType="string" Value="{0} {1}"/>
            </InputParameters>
            <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim"/>
            </OutputClaims>
        </ClaimsTransformation>
    
        <ClaimsTransformation Id="CreateMessageTransformation" TransformationMethod="FormatStringClaim">
            <InputClaims>
            <InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim"/>
            </InputClaims>
            <InputParameters>
            <InputParameter Id="stringFormat" DataType="string" Value="Hello {0}"/>
            </InputParameters>
            <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="outputClaim"/>
            </OutputClaims>
        </ClaimsTransformation> 
    

    لقد قمنا بتكوين ثلاثة تحويلات للمطالبات:

    • ينشئ GenerateRandomObjectIdTransformation سلسلة عشوائية كما هو محدد بواسطة أسلوب CreateRandomString . يتم تحديث مطالبة objectId بالسلسلة التي تم إنشاؤها كما هو محدد بواسطة OutputClaim العنصر .

    • CreateDisplayNameTransformation تسلسل givenName واللقبلتشكيل displayName.

    • CreateMessageTransformation concatenates Hello and displayName لتشكيل رسالة.

الخطوة 3 - تكوين تعريفات المحتوى

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

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

    <ContentDefinitions>
        <ContentDefinition Id="SelfAssertedContentDefinition">
            <LoadUri>~/tenant/templates/AzureBlue/selfAsserted.cshtml</LoadUri>
            <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
            <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.7</DataUri>
        </ContentDefinition>
    </ContentDefinitions>

الخطوة 4 - تكوين ملفات التعريف الفنية

في نهج مخصص، TechnicalProfile هو العنصر الذي ينفذ الوظائف. الآن بعد أن قمت بتعريف تحويلات المطالبات والمطالبات، تحتاج إلى ملفات تعريف تقنية لتنفيذ تعريفاتك. يتم الإعلان عن ملف تعريف تقني داخل ClaimsProvider العناصر.

يوفر Azure AD B2C مجموعة من ملفات التعريف الفنية. يؤدي كل ملف تعريف تقني دورا محددا. على سبيل المثال، يمكنك استخدام ملف تعريف تقني REST لإجراء مكالمة HTTP إلى نقطة نهاية خدمة. يمكنك استخدام ملف تعريف تقني لتحويل المطالبات لتنفيذ العملية التي تحددها في تحويل المطالبات. تعرف على المزيد حول أنواع ملفات التعريف التقنية التي توفرها نهج Azure AD B2C المخصصة.

تعيين قيم للمطالبات الخاصة بك

لتعيين قيم مطالبات objectId وsplayNameوالرسالة، يمكنك تكوين ملف تعريف تقني ينفذ تحويلات مطالبات GenerateRandomObjectIdTransformation وCreateDisplayNameTransformation وCreateMessageTransformation. يتم تنفيذ تحويلات المطالبات بالترتيب المحدد في OutputClaimsTransformations العنصر . على سبيل المثال، يقوم أولا بإنشاء اسم العرض، ثم الرسالة.

  1. أضف ما يلي ClaimsProvider كتابع للمقطع ClaimsProviders .

        <ClaimsProvider>
    
            <DisplayName>Technical Profiles to generate claims</DisplayName>
        </ClaimsProvider>
    
    
  2. لتعيين قيم objectId وsplayNameومطالبات الرسالة، أضف التعليمات البرمجية التالية داخل العنصر الذي ClaimsProvider قمت بإنشائه للتو:

        <!--<ClaimsProvider>-->
            <TechnicalProfiles>
                <TechnicalProfile Id="ClaimGenerator">
                    <DisplayName>Generate Object ID, displayName and message Claims Technical Profile.</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="objectId"/>
                        <OutputClaim ClaimTypeReferenceId="displayName"/>
                        <OutputClaim ClaimTypeReferenceId="message"/>
                    </OutputClaims>
                    <OutputClaimsTransformations>
                        <OutputClaimsTransformation ReferenceId="GenerateRandomObjectIdTransformation"/>
                        <OutputClaimsTransformation ReferenceId="CreateDisplayNameTransformation"/>
                        <OutputClaimsTransformation ReferenceId="CreateMessageTransformation"/>
                    </OutputClaimsTransformations>
                </TechnicalProfile>
            </TechnicalProfiles>
        <!--</ClaimsProvider>-->
    

جمع مدخلات المستخدم

يمكنك إنشاء مطالبة displayName من givenName والاسم البديل، لذلك تحتاج إلى جمع ثم كمدخلات المستخدم. لتجميع إدخال مستخدم، يمكنك استخدام نوع من ملف التعريف الفني يسمى Self-Asserted. عند تكوين ملف تعريف فني مؤكد ذاتيا، تحتاج إلى الرجوع إلى تعريفات المحتوى لأن ملف التعريف الفني المؤكد ذاتيا مسؤول عن عرض واجهة مستخدم.

  1. أضف ما يلي ClaimsProvider كتابع للمقطع ClaimsProviders .

        <ClaimsProvider>
    
            <DisplayName>Technical Profiles to collect user's details </DisplayName>
        </ClaimsProvider>
    
  2. أضف التعليمات البرمجية التالية داخل العنصر الذي ClaimsProvider أنشأته للتو:

        <TechnicalProfiles>
            <TechnicalProfile Id="UserInformationCollector">
                <DisplayName>Collect User Input Technical Profile</DisplayName>
                <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                <Metadata>
                    <Item Key="ContentDefinitionReferenceId">SelfAssertedContentDefinition</Item>
                </Metadata>
                <DisplayClaims>
                    <DisplayClaim ClaimTypeReferenceId="givenName" Required="true"/>
                    <DisplayClaim ClaimTypeReferenceId="surname" Required="true"/>
                </DisplayClaims>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="givenName"/>
                    <OutputClaim ClaimTypeReferenceId="surname"/>
                </OutputClaims>
            </TechnicalProfile>
        </TechnicalProfiles>
    

    لاحظ المطالبتين المعروضتين للمطالبات givenName وsname. يتم وضع علامة على كلتا المطالبتين كما هو مطلوب، لذلك يجب على المستخدم إدخال القيم قبل إرسال النموذج المعروض لهما. يتم عرض المطالبات على الشاشة بالترتيب المحدد في عنصر DisplayClaims مثل الاسم المعطى ثم اللقب.

الخطوة 5 - تحديد رحلات المستخدم

يمكنك استخدام رحلات المستخدم لتحديد الترتيب الذي يتم به استدعاء ملفات التعريف التقنية. يمكنك استخدام OrchestrationSteps العنصر لتحديد الخطوات في رحلة المستخدم.

استبدل المحتويات الموجودة لرحلة HelloWorldJourney المستخدم بالتعليمات البرمجية التالية:

    <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="GetUserInformationClaimsExchange" TechnicalProfileReferenceId="UserInformationCollector"/>
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="ClaimGenerator"/>
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>
    </OrchestrationSteps>

وفقا لخطوات التنسيق، نقوم بتجميع مدخلات المستخدم، وتعيين قيم objectId، و displayName، ومطالبات الرسالة، وأخيرا إرسال رمز Jwt المميز.

الخطوة 6 - تحديث جهة الاعتماد

استبدل محتويات OutputClaims عنصر RelyingParty المقطع بالتعليمات البرمجية التالية:

    <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub"/>
    <OutputClaim ClaimTypeReferenceId="displayName"/>
    <OutputClaim ClaimTypeReferenceId="message"/>

بعد إكمال الخطوة 6، 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>
        <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>

            <ClaimType Id="givenName">
                <DisplayName>Given Name</DisplayName>
                <DataType>string</DataType>
                <UserHelpText>Your given name (also known as first name).</UserHelpText>
                <UserInputType>TextBox</UserInputType>
            </ClaimType>
            <ClaimType Id="surname">
                <DisplayName>Surname</DisplayName>
                <DataType>string</DataType>
                <UserHelpText>Your surname (also known as family name or last name).</UserHelpText>
                <UserInputType>TextBox</UserInputType>
            </ClaimType>
            <ClaimType Id="displayName">
                <DisplayName>Display Name</DisplayName>
                <DataType>string</DataType>
                <UserHelpText>Your display name.</UserHelpText>
                <UserInputType>TextBox</UserInputType>
            </ClaimType>
        </ClaimsSchema>
        <ClaimsTransformations>
            <ClaimsTransformation Id="GenerateRandomObjectIdTransformation" TransformationMethod="CreateRandomString">
                <InputParameters>
                    <InputParameter Id="randomGeneratorType" DataType="string" Value="GUID"/>
                </InputParameters>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="outputClaim"/>
                </OutputClaims>
            </ClaimsTransformation>

            <ClaimsTransformation Id="CreateDisplayNameTransformation" TransformationMethod="FormatStringMultipleClaims">
                <InputClaims>
                    <InputClaim ClaimTypeReferenceId="givenName" TransformationClaimType="inputClaim1"/>
                    <InputClaim ClaimTypeReferenceId="surname" TransformationClaimType="inputClaim2"/>
                </InputClaims>
                <InputParameters>
                    <InputParameter Id="stringFormat" DataType="string" Value="{0} {1}"/>
                </InputParameters>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="outputClaim"/>
                </OutputClaims>
            </ClaimsTransformation>

            <ClaimsTransformation Id="CreateMessageTransformation" TransformationMethod="FormatStringClaim">
                <InputClaims>
                    <InputClaim ClaimTypeReferenceId="displayName" TransformationClaimType="inputClaim"/>
                </InputClaims>
                <InputParameters>
                    <InputParameter Id="stringFormat" DataType="string" Value="Hello {0}"/>
                </InputParameters>
                <OutputClaims>
                    <OutputClaim ClaimTypeReferenceId="message" TransformationClaimType="outputClaim"/>
                </OutputClaims>
            </ClaimsTransformation> 
        </ClaimsTransformations>
        <ContentDefinitions>
            <ContentDefinition Id="SelfAssertedContentDefinition">
                <LoadUri>~/tenant/templates/AzureBlue/selfAsserted.cshtml</LoadUri>
                <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
                <DataUri>urn:com:microsoft:aad:b2c:elements:contract:selfasserted:2.1.7</DataUri>
            </ContentDefinition>
        </ContentDefinitions>
    </BuildingBlocks>
    <!--Claims Providers Here-->
    <ClaimsProviders>
        <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>

        <ClaimsProvider>
            <DisplayName>Claim Generator Technical Profiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="ClaimGenerator">
                    <DisplayName>Generate Object ID, displayName and  message Claims Technical Profile.</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="objectId"/>
                        <OutputClaim ClaimTypeReferenceId="displayName"/>
                        <OutputClaim ClaimTypeReferenceId="message"/>
                    </OutputClaims>
                    <OutputClaimsTransformations>
                        <OutputClaimsTransformation ReferenceId="GenerateRandomObjectIdTransformation"/>
                        <OutputClaimsTransformation ReferenceId="CreateDisplayNameTransformation"/>
                        <OutputClaimsTransformation ReferenceId="CreateMessageTransformation"/>
                    </OutputClaimsTransformations>
                </TechnicalProfile>
            </TechnicalProfiles>            
        </ClaimsProvider>

        <ClaimsProvider>
            <DisplayName>Technical Profiles to collect user's details</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="UserInformationCollector">
                    <DisplayName>Collect User Input Technical Profile</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
                    <Metadata>
                        <Item Key="ContentDefinitionReferenceId">SelfAssertedContentDefinition</Item>
                    </Metadata>
                    <DisplayClaims>
                        <DisplayClaim ClaimTypeReferenceId="givenName" Required="true"/>
                        <DisplayClaim ClaimTypeReferenceId="surname" Required="true"/>
                    </DisplayClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="givenName"/>
                        <OutputClaim ClaimTypeReferenceId="surname"/>
                    </OutputClaims>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    </ClaimsProviders>

    <UserJourneys>
        <UserJourney Id="HelloWorldJourney">
            <OrchestrationSteps>
                <OrchestrationStep Order="1" Type="ClaimsExchange">
                    <ClaimsExchanges>
                        <ClaimsExchange Id="GetUserInformationClaimsExchange" TechnicalProfileReferenceId="UserInformationCollector"/>
                    </ClaimsExchanges>
                </OrchestrationStep>
                <OrchestrationStep Order="2" Type="ClaimsExchange">
                    <ClaimsExchanges>
                        <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="ClaimGenerator"/>
                    </ClaimsExchanges>
                </OrchestrationStep>
                <OrchestrationStep Order="3" 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"/>
                <OutputClaim ClaimTypeReferenceId="displayName"/>
                <OutputClaim ClaimTypeReferenceId="message"/>
            </OutputClaims>
            <SubjectNamingInfo ClaimType="sub"/>
        </TechnicalProfile>
    </RelyingParty>
</TrustFrameworkPolicy>

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

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

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

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

  1. ضمن نهج مخصصة، حدد B2C_1A_CONTOSOCUSTOMPOLICY.

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

  3. حدد الزر تشغيل الآن .

  4. أدخل الاسم المعطى واللقاب، ثم حدد متابعة.

    screenshot of accepting user inputs in custom policy.

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

    {
      "typ": "JWT",
      "alg": "RS256",
      "kid": "pxLOMWFg...."
    }.{
      ...
      "sub": "c7ae4515-f7a7....",
      ...
      "acr": "b2c_1a_contosocustompolicy",
      ...
      "name": "Maurice Paulet",
      "message": "Hello Maurice Paulet"
    }.[Signature]

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

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