إعداد تدفق الاشتراك وتسجيل الدخول لحساب محلي باستخدام نهج Azure Active Directory B2C المخصص

في مقالة النهج المخصص إنشاء حساب مستخدم وقراءته باستخدام نهج Azure Active Directory B2C، يقوم المستخدم بإنشاء حساب مستخدم جديد ولكنه لا يسجل الدخول إليه.

في هذه المقالة، ستتعلم كيفية كتابة نهج مخصص ل Azure Active Directory B2C (Azure AD B2C) يسمح للمستخدم إما بإنشاء حساب محلي لمتاجرة عمل-مستهلك في Azure AD أو تسجيل الدخول إلى حساب. يشير الحساب المحلي إلى حساب تم إنشاؤه في مستأجر Azure AD B2C عندما يقوم مستخدم بالتسجيل في التطبيق الخاص بك.

نظرة عامة

يستخدم Azure AD B2C بروتوكول مصادقة OpenID الاتصال للتحقق من بيانات اعتماد المستخدم. في Azure AD B2C، يمكنك إرسال بيانات اعتماد المستخدم جنبا إلى جنب مع معلومات أخرى إلى نقطة نهاية آمنة، والتي تحدد بعد ذلك ما إذا كانت بيانات الاعتماد صالحة أم لا. باختصار، عند استخدام تنفيذ Azure AD B2C الاتصال OpenID، يمكنك الاستعانة بمصادر خارجية للتسجيل وتسجيل الدخول وتجارب إدارة الهوية الأخرى في تطبيقات الويب الخاصة بك إلى معرف Microsoft Entra.

يوفر نهج Azure AD B2C المخصص ملف تعريف تقني OpenID الاتصال، والذي تستخدمه لإجراء مكالمة إلى نقطة نهاية Microsoft آمنة. تعرف على المزيد حول OpenID الاتصال ملف التعريف الفني.

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

إشعار

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

الخطوة 1 - تكوين OpenID الاتصال ملف التعريف الفني

لتكوين ملف تعريف تقني OpenID الاتصال، تحتاج إلى تنفيذ ثلاث خطوات:

  • الإعلان عن المزيد من المطالبات.
  • تسجيل التطبيقات في مدخل Microsoft Azure.
  • وأخيرا، قم بتكوين OpenID الاتصال Technical Profile نفسه

الخطوة 1.1 - الإعلان عن المزيد من المطالبات

في ContosoCustomPolicy.XML الملف، حدد موقع قسم ClaimsSchema ، ثم أضف المزيد من المطالبات باستخدام التعليمات البرمجية التالية:

    <!--<ClaimsSchema>-->
        ...
        <ClaimType Id="grant_type">
            <DisplayName>grant_type</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="scope">
            <DisplayName>scope</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="nca">
            <DisplayName>nca</DisplayName>
            <DataType>string</DataType>
            <UserHelpText>Special parameter passed for local account authentication to login.microsoftonline.com.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="client_id">
            <DisplayName>client_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
        
        <ClaimType Id="resource_id">
            <DisplayName>resource_id</DisplayName>
            <DataType>string</DataType>
            <AdminHelpText>Special parameter passed to EvoSTS.</AdminHelpText>
            <UserHelpText>Special parameter passed to EvoSTS.</UserHelpText>
        </ClaimType>
    <!--</ClaimsSchema>-->

الخطوة 1.2 - تسجيل تطبيقات إطار عمل تجربة الهوية

يتطلب Azure AD B2C تسجيل تطبيقين يستخدمهما للتسجيل وتسجيل الدخول للمستخدمين باستخدام حسابات محلية: IdentityExperienceFramework، واجهة برمجة تطبيقات ويب ، و ProxyIdentityExperienceFramework، تطبيق أصلي بإذن مفوض إلى تطبيق IdentityExperienceFramework.

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

  1. استخدم الخطوات في تسجيل تطبيق IdentityExperienceFramework لتسجيل تطبيق إطار عمل تجربة الهوية. انسخ معرف التطبيق (العميل)، appID، لتسجيل تطبيق Identity Experience Framework للاستخدام في الخطوة التالية.

  2. استخدم الخطوات الواردة في تسجيل تطبيق ProxyIdentityExperienceFramework لتسجيل تطبيق إطار عمل تجربة هوية الوكيل. انسخ معرف التطبيق (العميل)، proxyAppID، لتسجيل تطبيق إطار عمل تجربة هوية الوكيل للاستخدام في الخطوة التالية.

الخطوة 1.3 - تكوين OpenID الاتصال ملف التعريف الفني

في ContosoCustomPolicy.XML الملف، حدد موقع قسم ClaimsProviders، ثم أضف عنصر Claims Provider الذي يحتوي على OpenID الاتصال Technical Profile باستخدام التعليمات البرمجية التالية:

    <!--<ClaimsProviders>-->
        ...
        <ClaimsProvider>
            <DisplayName>OpenID Connect Technical Profiles</DisplayName>
            <TechnicalProfiles>
                <TechnicalProfile Id="SignInUser">
                    <DisplayName>Sign in with Local Account</DisplayName>
                    <Protocol Name="OpenIdConnect" />
                    <Metadata>
                        <Item Key="UserMessageIfClaimsPrincipalDoesNotExist">We didn't find this account</Item>
                        <Item Key="UserMessageIfInvalidPassword">Your password or username is incorrect</Item>
                        <Item Key="UserMessageIfOldPasswordUsed">You've used an old password.</Item>
                        <Item Key="ProviderName">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>
                        <!-- Policy Engine Clients -->
                        <Item Key="UsePolicyInRedirectUri">false</Item>
                        <Item Key="HttpBinding">POST</Item>
                        <Item Key="client_id">proxyAppID</Item>
                        <Item Key="IdTokenAudience">appID</Item>
                    </Metadata>
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="email" PartnerClaimType="username" Required="true" />
                        <InputClaim ClaimTypeReferenceId="password" PartnerClaimType="password" Required="true" />
                        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="password" />
                        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="openid" />
                        <InputClaim ClaimTypeReferenceId="nca" PartnerClaimType="nca" DefaultValue="1" />
                        <InputClaim ClaimTypeReferenceId="client_id" DefaultValue="proxyAppID" />
                        <InputClaim ClaimTypeReferenceId="resource_id" PartnerClaimType="resource" DefaultValue="appID" />
                    </InputClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="oid" />
                    </OutputClaims>
                </TechnicalProfile>
            </TechnicalProfiles>
        </ClaimsProvider>
    <!--</ClaimsProviders>-->

استبدل كلا المثيلين من:

  • معرف التطبيق مع معرف التطبيق (العميل) لتطبيق إطار عمل تجربة الهوية الذي نسخته في الخطوة 1.2.

  • proxyAppID مع معرف التطبيق (العميل) لتطبيق Proxy Identity Experience Framework الذي نسخته في الخطوة 1.2.

الخطوة 2 - تكوين واجهة مستخدم تسجيل الدخول

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

  • تكوين ملف تعريف فني مؤكد ذاتيا، والذي يعرض نموذج تسجيل الدخول للمستخدم.
  • تكوين تعريف المحتوى لواجهة مستخدم تسجيل الدخول.

الخطوة 2.1 - تكوين ملف تعريف تقني لواجهة مستخدم تسجيل الدخول

في ContosoCustomPolicy.XML الملف، حدد موقع SignInUser ملف التعريف الفني وأضف ملف تعريف تقني SelfAsserted بعده باستخدام التعليمات البرمجية التالية:

    <TechnicalProfile Id="UserSignInCollector">
        <DisplayName>Local Account Signin</DisplayName>
        <Protocol Name="Proprietary"
            Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        <Metadata>
            <Item Key="setting.operatingMode">Email</Item>
            <Item Key="SignUpTarget">AccountTypeInputCollectorClaimsExchange</Item>
        </Metadata>
        <DisplayClaims>
            <DisplayClaim ClaimTypeReferenceId="email" Required="true" />
            <DisplayClaim ClaimTypeReferenceId="password" Required="true" />
        </DisplayClaims>
        <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" />
            <OutputClaim ClaimTypeReferenceId="password"  />
            <OutputClaim ClaimTypeReferenceId="objectId" />
        </OutputClaims>
        <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="SignInUser" />
        </ValidationTechnicalProfiles>
    </TechnicalProfile>

لقد أضفنا ملف تعريف تقني SelfAsserted، UserSignInCollector، الذي يعرض نموذج تسجيل الدخول للمستخدم. لقد قمنا بتكوين ملف التعريف الفني لجمع عنوان البريد الإلكتروني للمستخدم كاسم تسجيل الدخول الخاص به كما هو موضح في setting.operatingMode بيانات التعريف. يتضمن نموذج تسجيل الدخول ارتباط تسجيل، ما يؤدي بالمستخدم إلى نموذج تسجيل كما هو موضح في SignUpTarget بيانات التعريف. سترى كيف قمنا بإعداد SignUpWithLogonEmailExchangeClaimsExchange في خطوات التنسيق.

علاوة على ذلك، أضفنا SignInUser OpenID الاتصال Technical Profile كملف تعريف ValidationTechnicalProfile. لذلك، يتم تنفيذ ملف التعريف التقني SignInUser عندما يحدد المستخدم زر تسجيل الدخول (راجع لقطة الشاشة في الخطوة 5).

في الخطوة التالية (الخطوة 2.2)، نقوم بتكوين تعريف محتوى سنستخدمه في ملف التعريف الفني SelfAsserted هذا.

الخطوة 2.2 - تكوين تعريف محتوى واجهة تسجيل الدخول

في ContosoCustomPolicy.XML الملف، حدد موقع قسم ContentDefinitions ، ثم سجل الدخول تعريف المحتوى باستخدام التعليمات البرمجية التالية:

    <!--<ContentDefinitions>-->
        ...
            <ContentDefinition Id="SignupOrSigninContentDefinition">
                <LoadUri>~/tenant/templates/AzureBlue/unified.cshtml</LoadUri>
                <RecoveryUri>~/common/default_page_error.html</RecoveryUri>
                <DataUri>urn:com:microsoft:aad:b2c:elements:contract:unifiedssp:2.1.7</DataUri>
                <Metadata>
                    <Item Key="DisplayName">Signin and Signup</Item>
                </Metadata>
            </ContentDefinition>
    <!--</ContentDefinitions>-->

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

الخطوة 3 - تحديث خطوات تزامن رحلة المستخدم

في ContosoCustomPolicy.XML الملف، حدد موقع رحلة المستخدم HelloWorldJourney واستبدل جميع مجموعات خطوات التزامن الخاصة بها بالتعليمات البرمجية التالية:

    <!--<OrchestrationSteps>-->
        ...
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="SignupOrSigninContentDefinition">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninEmailExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                <ClaimsExchange Id="LocalAccountSigninEmailExchange" TechnicalProfileReferenceId="UserSignInCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="AccountTypeInputCollectorClaimsExchange" TechnicalProfileReferenceId="AccountTypeInputCollector"/>
            </ClaimsExchanges>
        </OrchestrationStep>

        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
                <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
                  <Value>accountType</Value>
                  <Value>company</Value>
                  <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="GetAccessCodeClaimsExchange" TechnicalProfileReferenceId="AccessCodeInputCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>
        
        <OrchestrationStep Order="4" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="SignUpWithLogonEmailExchange" TechnicalProfileReferenceId="UserInformationCollector" />
            </ClaimsExchanges>
        </OrchestrationStep>  
      
        <OrchestrationStep Order="5" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="AADUserReaderExchange" TechnicalProfileReferenceId="AAD-UserRead"/>
            </ClaimsExchanges>
        </OrchestrationStep>                
        
        <OrchestrationStep Order="6" Type="ClaimsExchange">
            <ClaimsExchanges>
            <ClaimsExchange Id="GetMessageClaimsExchange" TechnicalProfileReferenceId="UserInputMessageClaimGenerator"/>
            </ClaimsExchanges>          
        </OrchestrationStep>                
        
        <OrchestrationStep Order="7" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    <!--</OrchestrationSteps>-->

في خطوات التنسيق من 2 إلى 5، استخدمنا الشروط المسبقة لتحديد ما إذا كان يجب تشغيل خطوة التنسيق. نحتاج إلى تحديد ما إذا كان المستخدم يقوم بتسجيل الدخول أو التسجيل.

عند تشغيل النهج المخصص:

  • خطوة التنسيق 1 - عرض صفحة تسجيل الدخول، بحيث يمكن للمستخدم تسجيل الدخول أو تحديد الارتباط التسجيل الآن . لاحظ أننا نحدد تعريف المحتوى الذي يستخدمه ملف التعريف الفني المؤكد ذاتيا من UserSignInCollector لعرض نموذج تسجيل الدخول.

  • خطوة التزامن 2 - يتم تشغيل هذه الخطوة إذا قام المستخدم بالتسجيل (objectId غير موجود)، لذلك نعرض نموذج تحديد نوع الحساب عن طريق استدعاء ملف التعريف الفني المؤكد ذاتيا AccountTypeInputCollector .

  • خطوة التزامن 3 - يتم تشغيل هذه الخطوة إذا سجل المستخدم (objectId غير موجود)، وأن المستخدم لا يحدد شركة accountType. لذلك علينا أن نطلب من المستخدم إدخال عن accessCode طريق استدعاء ملف التعريف الفني المؤكد ذاتيا في AccessCodeInputCollector .

  • خطوة التزامن 4 - يتم تشغيل هذه الخطوة إذا قام المستخدم بالتسجيل (objectId غير موجود)، لذلك نعرض نموذج التسجيل عن طريق استدعاء ملف التعريف الفني المؤكد ذاتيا ل UserInformationCollector .

  • خطوة التزامن 5 - تقرأ هذه الخطوة معلومات الحساب من معرف Microsoft Entra (نستدعي AAD-UserRead ملف التعريف الفني لمعرف Microsoft Entra)، بحيث يتم تشغيل ما إذا كان المستخدم يقوم بالتسجيل أو تسجيل الدخول.

  • خطوة التنسيق 6 - تستدعي هذه الخطوة ملف التعريف الفني UserInputMessageClaimGenerator لتجميع رسالة الترحيب الخاصة بالمستخدم.

  • خطوة التزامن 7 - وأخيرا، تقوم الخطوة 8 بتجميع وإرجاع رمز JWT المميز في نهاية تنفيذ النهج.

الخطوة 4 - نهج التحميل

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

الخطوة 5 - اختبار النهج

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

screenshot of sign-up or sign-in interface.

يمكنك تسجيل الدخول عن طريق إدخال عنوان البريد الإلكتروني وكلمة المرور لحساب موجود. إذا لم يكن لديك حساب بالفعل، فستحتاج إلى تحديد الارتباط التسجيل الآن لإنشاء حساب مستخدم جديد.

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