تمكين خيارات المصادقة في تطبيق ويب باستخدام Azure AD B2C

توضح هذه المقالة كيفية تمكين تجربة مصادقة Azure Active Directory B2C (Azure AD B2C) وتخصيصها وتحسينها لتطبيق الويب لديك.

قبل البدء، من المهم التعرف على المقالات التالية:

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

باستخدام custom domain، يمكنك وضع علامة تجارية كاملة على عنوان URL للمصادقة. من منظور المستخدم، يظل المستخدمون في المجال الخاص بك أثناء عملية المصادقة، بدلاً من إعادة توجيههم إلى اسم مجال Microsoft Azure Active Directory B2C b2clogin.com.

لإزالة كافة الإشارات إلى "b2c" في عنوان URL، يمكنك أيضاً استبدال اسم مستأجر B2C الخاص بك، contoso.onmicrosoft.com، في عنوان URL لطلب المصادقة مع معرف المستأجر GUID. على سبيل المثال، يمكنك تغيير https://fabrikamb2c.b2clogin.com/contoso.onmicrosoft.com/ إلى https://account.contosobank.co.uk/<tenant ID GUID>/.

لاستخدام مجال مخصص ومعرف المستأجر في عنوان URL للمصادقة، اتبع الإرشادات الموجودة في تمكين المجالات المخصصة. ضمن المجلد الجذر للمشروع، افتح ملف appsettings.json. يحتوي هذا الملف على معلومات حول موفر هوية Azure AD B2C لديك.

افتح الملف appsettings.json ونفّذ ما يلي:

يعرض JSON التالي إعدادات التطبيق قبل التغيير:

"AzureAdB2C": {
  "Instance": "https://contoso.b2clogin.com",
  "Domain": "tenant-name.onmicrosoft.com",
  ...
}

يعرض JSON التالي إعدادات التطبيق بعد التغيير:

"AzureAdB2C": {
  "Instance": "https://login.contoso.com",
  "Domain": "00000000-0000-0000-0000-000000000000",
  ...
}

دعم السيناريوهات المتقدمة

يتيح الأسلوب AddMicrosoftIdentityWebAppAuthentication في واجهة برمجة تطبيقات النظام الأساسي للهوية من Microsoft للمطورين إضافة رمز لسيناريوهات المصادقة المتقدمة أو الاشتراك في أحداث OpenIdConnect. على سبيل المثال، يمكنك الاشتراك في OnRedirectToIdentityProvider، والذي يمكنك من خلاله تخصيص طلب المصادقة الذي يرسله تطبيقك إلى Azure AD B2C.

لدعم السيناريوهات المتقدمة ، افتح الملف Startup.cs، وفي الدالة ConfigureServices، استبدل AddMicrosoftIdentityWebAppAuthentication بالقصاصة البرمجية التالية:

// Configuration to sign-in users with Azure AD B2C

//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
{
    Configuration.Bind("AzureAdB2C", options);
    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});

تضيف التعليمات البرمجية السابقة الحدث OnRedirectToIdentityProvider بمرجع إلى الأسلوب OnRedirectToIdentityProviderFunc. أضف القصاصة البرمجية التالية إلى الفئة Startup.cs.

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Custom code here
    
    // Don't remove this line
    await Task.CompletedTask.ConfigureAwait(false);
}

يمكنك تمرير المعلمات بين وحدة التحكم والدالة OnRedirectToIdentityProvider باستخدام معلمات السياق.

ملء اسم تسجيل الدخول مسبقًا

أثناء قيام المستخدم بتسجيل الدخول، قد يستهدف تطبيقك مستخدماً معيناً. عندما يستهدف أحد التطبيقات مستخدماً، يمكنه تحديد معلمة طلب البحث login_hint في طلب التفويض باسم تسجيل دخول المستخدم. يملأ Microsoft Azure Active Directory B2C اسم تسجيل الدخول تلقائياً، ويحتاج المستخدم إلى توفير كلمة المرور فقط.

لملء اسم تسجيل الدخول مسبقاً، قم بما يلي:

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

  2. أكمل إجراء دعم السيناريوهات المتقدمة.

  3. أضف السطر التالي من التعليمات البرمجية إلى الأسلوب OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.LoginHint = "emily@contoso.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

حدد موفر الهوية مسبقًا

إذا قمت بتكوين رحلة «sign-in» لتطبيقك من أجل تضمين الحسابات الاجتماعية، مثل Facebook أو LinkedIn أو Google، يمكنك تحديد المعلمة domain_hint. توفر معلمة الاستعلام تلميح إلى Azure AD B2C حول موفر الهوية الاجتماعية التي يجب استخدامها لـ «sign-in». على سبيل المثال، إذا حدد التطبيق domain_hint=facebook.com، ينتقل تدفق تسجيل الدخول مباشرة إلى صفحة تسجيل الدخول إلى Facebook.

لإعادة توجيه المستخدمين إلى موفر هوية خارجي، قم بما يلي:

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

  2. أكمل إجراء دعم السيناريوهات المتقدمة.

  3. في الدالة OnRedirectToIdentityProviderFunc، أضف السطر التالي من التعليمات البرمجية إلى الدالة OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.DomainHint = "facebook.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

تحديد لغة واجهة المستخدم

يتيح تخصيص اللغة في Microsoft Azure Active Directory B2C تدفق المستخدم لاستيعاب مجموعة متنوعة من اللغات لتناسب احتياجات عملائك. لمزيد من المعلومات، راجع تخصيص اللغة.

لتعيين اللغة المفضلة، قم بما يلي:

  1. تكوين تخصيص اللغة.

  2. أكمل إجراء دعم السيناريوهات المتقدمة.

  3. أضف السطر التالي من التعليمات البرمجية إلى الأسلوب OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.UiLocales = "es";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

تمرير معلمة سلسلة استعلام مخصصة

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

لتمرير معلمة سلسلة طلب بحث مخصصة، قم بما يلي:

  1. تكوينعنصر ContentDefinitionParameters.

  2. أكمل إجراء دعم السيناريوهات المتقدمة.

  3. أضف السطر التالي من التعليمات البرمجية إلى الأسلوب OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.Parameters.Add("campaignId", "123");
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

تمرير تلميح رمز مميز لمعرّف

يمكن لتطبيق الطرف المعتمد إرسال رمز ويب JSON وارد (JWT) كجزء من طلب تفويض OAuth2. الرمز المميز الوارد هو تلميح حول المستخدم أو طلب التفويض. يتحقق Microsoft Azure Active Directory B2C من صحة الرمز المميز ثم يستخرج المطالبة.

لتضمين تلميح رمز مميز للمعرّف في طلب المصادقة، قم بما يلي:

  1. أكمل إجراء دعم السيناريوهات المتقدمة.

  2. في النهج المخصص، حدد ملف تعريف تقني لتلميح الرمز المميز للمعرف.

  3. أضف السطر التالي من التعليمات البرمجية إلى الأسلوب OnRedirectToIdentityProvider:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      // The idTokenHint variable holds your ID token 
      context.ProtocolMessage.IdTokenHint = idTokenHint
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

وحدة تحكم الحساب

إذا كنت ترغب في تخصيص إجراءات SignIn أو SignUp أو SignOut، فإننا نشجعك على إنشاء وحدة التحكم لديك. يتيح لك امتلاك وحدة التحكم تمرير المعلمات بين وحدة التحكم لديك ومكتبة المصادقة. يُعد AccountController جزءًا من Microsoft.Identity.Web.UI في حزمة NuGet، التي تتعامل مع إجراءات تسجيل الدخول والخروج. يمكنك العثور على تطبيقه في مكتبة Microsoft Identity Web.

إضافة وحدة تحكم الحساب

في مشروع Visual Studio، انقر بزر الماوس الأيمن فوق المجلد Controllers، ثم أضف Controllerجديدة . حدد MVC - Empty Controller، ثم قم بتوفير اسم MyAccountController.cs.

توضح قصاصة التعليمات البرمجية التالية MyAccountController مخصصًا باستخدام إجراء SignIn.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;


namespace mywebapp.Controllers
{
    [AllowAnonymous]
    [Area("MicrosoftIdentity")]
    [Route("[area]/[controller]/[action]")]
    public class MyAccountController : Controller
    {

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme)
        {
            scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
            var redirectUrl = Url.Content("~/");
            var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
            return Challenge(properties, scheme);
        }

    }
}

في طريقة العرض _LoginPartial.cshtml، قم بتغيير ارتباط تسجيل الدخول في وحدة التحكم لديك.

<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">

تمرير معرف نهج Azure AD B2C

توضح قصاصة التعليمات البرمجية التالية MyAccountController مخصصًا باستخدام إجراء SignIn وSignUp. يقوم الإجراء بإدخال معلمة بالاسم policy إلى مكتبة المصادقة. يتيح لك ذلك توفير معرف نهج Azure AD B2C الصحيح للإجراء المحدد.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    return Challenge(properties, scheme);
}

public IActionResult SignUp([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignUp";
    return Challenge(properties, scheme);
}

في طريقة العرض _LoginPartial.cshtml، قم بتغيير القيمة asp-controller إلى MyAccountController لأي ارتباطات المصادقة الأخرى مثل الاشتراك أو تحرير ملف التعريف.

تمرير المعلمات المخصصة

توضح قصاصة التعليمات البرمجية التالية MyAccountController مخصصًا باستخدام إجراء SignIn. يقوم الإجراء بإدخال معلمة بالاسم campaign_id إلى مكتبة المصادقة.

public IActionResult SignIn([FromRoute] string scheme)
{
    scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    var redirectUrl = Url.Content("~/");
    var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
    properties.Items["policy"] = "B2C_1_SignIn";
    properties.Items["campaign_id"] = "1234";
    return Challenge(properties, scheme);
}

أكمل الإجراء سيناريوهات متقدمة الدعم ثم في الأسلوب OnRedirectToIdentityProvider، اقرأ المعلمة المخصصة:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Read the custom parameter
    var campaign_id = context.Properties.Items.FirstOrDefault(x => x.Key == "campaign_id").Value;

    // Add your custom code here
    if (campaign_id != null)
    {
        // Send parameter to authentication request
        context.ProtocolMessage.SetParameter("campaign_id", campaign_id);
    }
    
    await Task.CompletedTask.ConfigureAwait(false);
}

تأمين إعادة توجيه تسجيل الخروج

بعد تسجيل الخروج، تتم إعادة توجيه المستخدم إلى URI المحدد في المعلمة post_logout_redirect_uri، بغض النظر عن عناوين URL الخاصة بالرد التي تم تحديدها للتطبيق. ومع ذلك، إذا تم تمرير id_token_hint صالح وتم تشغيل الرمز المميز لمعرف الطلب في طلبات تسجيل الخروج ، يتحقق Azure AD B2C من أن قيمة post_logout_redirect_uri تطابق أحد عناوين URI لإعادة التوجيه المهيأة للتطبيق قبل تنفيذ إعادة توجيه. إذا لم يتم تكوين عنوان URL مطابق للرد للتطبيق، فستُعرض رسالة خطأ ولن تتم إعادة توجيه المستخدم.

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

  1. في وحدة التحكم MyAccountController.cs، أضف الإجراء SignOut باستخدام القصاصة البرمجية التالي:

    [HttpGet("{scheme?}")]
    public async Task<IActionResult> SignOutAsync([FromRoute] string scheme)
    {
        scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
    
        //obtain the id_token
        var idToken = await HttpContext.GetTokenAsync("id_token");
        //send the id_token value to the authentication middleware
        properties.Items["id_token_hint"] = idToken;            
    
        return SignOut(properties,CookieAuthenticationDefaults.AuthenticationScheme,scheme);
    }
    
  2. في الفئة Startup.cs وزّع القيمة id_token_hint وألحق القيمة بطلب المصادقة. توضح القصاصة البرمجية التالية كيفية تمرير القيمة id_token_hint إلى طلب المصادقة:

    private async Task OnRedirectToIdentityProviderForSignOutFunc(RedirectContext context)
    {
        var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value;
        if (id_token_hint != null)
        {
            // Send parameter to authentication request
            context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint);
        }
    
        await Task.CompletedTask.ConfigureAwait(false);
    }
    
  3. في الدالة ConfigureServices، أضف الخيار SaveTokens لـوحدات التحكم التي تتمتع بإمكانية الوصول إلى القيمة id_token:

    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
        {
            Configuration.Bind("AzureAdB2C", options);
            options.Events ??= new OpenIdConnectEvents();        
            options.Events.OnRedirectToIdentityProviderForSignOut += OnRedirectToIdentityProviderForSignOutFunc;
            options.SaveTokens = true;
        });
    
  4. في ملف التكوين appsettings.json، أضف مسار URI لإعادة توجيه تسجيل الخروج إلى مفتاح SignedOutCallbackPath.

    "AzureAdB2C": {
      "Instance": "https://<your-tenant-name>.b2clogin.com",
      "ClientId": "<web-app-application-id>",
      "Domain": "<your-b2c-domain>",
      "SignedOutCallbackPath": "/signout/<your-sign-up-in-policy>",
      "SignUpSignInPolicyId": "<your-sign-up-in-policy>"
    }
    

في المثال أعلاه، سيكونpost_logout_redirect_uri الذي تم تمريره في طلب تسجيل الخروج بالتنسيق: https://your-app.com/signout/<your-sign-up-in-policy>. يجب إضافة عنوان URL هذا إلى عناوين URL للرد على تسجيل التطبيق.

التحكم في الوصول استنادًا إلى الدور

باستخدام التفويض في ASP.NET Core، يمكنك التحقق لمعرفة ما إذا كان المستخدمون مصرح لهم بالوصول إلى مورد محمي باستخدام إحدى الأساليب التالية:

في الأسلوب ConfigureServices، أضف الأسلوب AddAuthorization الذي يضيف نموذج التخويل. ينشئ المثال التالي نهجًا يُسمى EmployeeOnly. يتحقق النهج من وجود مطالبة EmployeeNumber. يجب أن تكون قيمة المطالبة أحد المعرفات التالية: 1 أو 2 أو 3 أو 4 أو 5.

services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy =>
              policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });

يمكنك التحكم في التخويل في ASP.NET Core باستخدام AuthorizeAttribute ومعلماتها المتنوعة. في أبسط أشكالها، يؤدي تطبيق السمة Authorize على وحدة تحكم أو إجراء أو Razor Page إلى تقييد الوصول إلى المستخدمين المصادق عليهم لهذا المكون.

يمكنك تطبيق النُهج على وحدات التحكم باستخدام السمة Authorize مع اسم النهج. تقيد التعليمات البرمجية التالية الوصول إلى الإجراء Claims للمستخدمين المصرح لهم بواسطة النهج EmployeeOnly:

[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
    return View();
}

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