المصادقة مع وسيط MQTT باستخدام مصادقة webhook مخصصة

توضح لك هذه المقالة كيفية المصادقة باستخدام مساحات أسماء Azure Event Grid باستخدام خطاف ويب أو دالة Azure.

تسمح مصادقة الإخطار على الويب لنقاط نهاية HTTP الخارجية (خطافات الويب أو الوظائف) بمصادقة اتصالات النقل عن بعد لوضع الرسائل في قائمة انتظار الرسائل (MQTT) ديناميكيا. يستخدم هذا الأسلوب التحقق من صحة رمز الويب JSON لمعرف Microsoft Entra لضمان الوصول الآمن.

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

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

  • مساحة اسم شبكة الأحداث مع هوية مدارة معينة من قبل النظام أو معينة من قبل المستخدم.
  • خطاف ويب خارجي أو دالة Azure.
  • الوصول الممنوح للهوية المدارة لمساحة الاسم Event Grid إلى دالة Azure أو خطاف الويب.

‏‫الخطوات عالية المستوى

لاستخدام مصادقة webhook المخصصة لمساحات الأسماء، اتبع الخطوات التالية:

  1. إنشاء مساحة اسم وتكوين الموارد الفرعية الخاصة بها.
  2. قم بتمكين هوية مدارة في مساحة اسم شبكة الأحداث.
  3. امنح الهوية المدارة حق الوصول إلى وظيفة Azure أو خطاف الويب.
  4. قم بتكوين إعدادات الإخطار على الويب المخصصة على مساحة اسم شبكة الأحداث.
  5. قم بتوصيل عملائك بمساحة اسم Event Grid والحصول على مصادقة عبر خطاف الويب أو الوظيفة.

إنشاء مساحة اسم وتكوين مواردها الفرعية

لإنشاء مساحة اسم وتكوين مواردها الفرعية، اتبع الإرشادات الواردة في التشغيل السريع: نشر رسائل MQTT والاشتراك فيها على مساحة اسم شبكة الأحداث باستخدام مدخل Microsoft Azure. تخطي خطوات إنشاء شهادة وعميل لأن هويات العميل تأتي من الرمز المميز المقدم. تستند سمات العميل إلى المطالبات المخصصة في الرمز المميز للعميل. يتم استخدام سمات العميل في استعلام مجموعة العميل ومتغيرات قالب الموضوع وتكوين إثراء التوجيه.

تمكين هوية مدارة على مساحة اسم شبكة الأحداث

لتمكين هوية مدارة معينة من قبل النظام على مساحة اسم شبكة الأحداث، استخدم الأمر التالي:

az eventgrid namespace update --resource-group <resource group name> --name <namespace name> --identity "{type:systemassigned}" 

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

تطبيقات

الخيار 1: Webhook عبر تنفيذ دالات Azure (تطبيق Microsoft Entra)

يمكن دالات Azure استضافة منطق webhook باستخدام Microsoft.Identity.Web للتحقق من صحة الرمز تلقائيا. تحتاج إلى تسجيل تطبيق Microsoft Entra لواجهة برمجة تطبيقات webhook للتحقق من رموز Event Grid التي تتصل بها. تسجيل التطبيق يحتوي على معرف التطبيق URI لإصدار الرمز. الجانب العميل (شبكة الأحداث) لديه بالفعل هوية مدارة.

الايجابيات:

  • لا يوجد بنية تحتية لإدارتها
  • مساعدو المصادقة المدمجين (Microsoft.Identity.Web)
  • متين، قابل للتوسع، وفعال من حيث التكلفة

يجب أن تقوم الدالة بالعمليات التالية:

  • تحقق من رمز المتصل من هوية Event Grid.
  • تحقق من رمز الويب JSON الخاص بالعميل (JWT).
  • أعيد رد السماح أو رفض رد JSON.

الخيار الثاني: تنفيذ نقطة نهاية HTTPS خارجية

يمكن أن يكون هذا التنفيذ أي نقطة نهاية خارجي (أي سحابة، أي خلفية)، باستخدام التحقق من JWT من Microsoft Entra ID باستخدام Microsoft.IdentityModel المكتبات.

استخدم أي وقت تشغيل: .NET، Node.js، Java، أو Python.

المتطلبات الرئيسية:

  • يجب أن تكون نقطة النهاية HTTPS.

  • يجب أن يتحقق من صحة JWT المتصل.

  • يجب أن يتحقق من صحة الجهاز JWT.

  • يجب أن يستجيب خلال المهلة المستقطعة (يوصى بحوالي 5 ثوان).

    مخطط يوضح تطبيقات مخصصة لwebhook.

منح الهوية المدارة حق الوصول المناسب إلى وظيفة أو خطاف ويب

امنح الهوية المدارة لمساحة اسم Event Grid الوصول المناسب إلى دالة Azure الهدف أو خطاف الويب.

لإعداد مصادقة مخصصة لوظيفة Azure، اتبع الخطوات التالية.

إنشاء تطبيق Microsoft Entra

  1. قم بإنشاء تطبيق Microsoft Entra في معرف Microsoft Entra.

  2. في صفحة نظرة عامة للتطبيق، قم بتدوين قيمة معرف التطبيق (العميل).

    لقطة شاشة تعرض صفحة نظرة عامة لتطبيق معرف Microsoft Entra مع تمييز معرف التطبيق (العميل).

  3. في القائمة اليمنى، حدد عرض واجهة برمجة تطبيقات. بجوار معرف التطبيق URI، حدد إضافة.

  4. قم بتدوين قيمة URI لمعرف التطبيق في جزء تحرير معرف التطبيق URI ، ثم حدد حفظ.

    لقطة شاشة تعرض معرف التطبيق URI لتطبيق Microsoft Entra.

إعداد المصادقة لدالة Azure

إذا كانت لديك دالة Azure أساسية تم إنشاؤها من مدخل Microsoft Azure، فقم بإعداد المصادقة والتحقق من صحة الرمز المميز لمعرف Microsoft Entra الذي تم إنشاؤه باستخدام هوية مدارة.

  1. انتقل إلى تطبيق دالات Azure.

  2. في القائمة اليمنى، حدد Authentication، ثم حدد Add identity provider.

    لقطة شاشة تعرض صفحة المصادقة.

  3. في الصفحة إضافة موفر هوية ، بالنسبة إلى موفر الهوية، حدد Microsoft من القائمة المنسدلة.

  4. في قسم تسجيل التطبيق ، حدد قيما للخصائص التالية:

    1. معرف التطبيق (العميل): أدخل معرف العميل لتطبيق Microsoft Entra الذي لاحظته سابقا.

    2. عنوان URL للجهة المصدرة: أضف عنوان URL للجهة المصدرة في النموذج https://login.microsoftonline.com/<tenantid>/v2.0.

      لقطة شاشة توضح إضافة موفر هوية مع Microsoft كموفر هوية.

  5. في قسم الجماهير المسموح بها بالرمز ، أدخل جماهير الرمز المسموح بها. للتوضيح، أدخل معرف التطبيق URI لتطبيق Microsoft Entra الذي أشرت إليه سابقا. يستخدم جمهور الرمز للتحقق من صحة الرمز الوارد من شبكة الحدث.

  6. في قسم الفحوصات الإضافية ، اتبع هذه الخطوات:

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

    2. لمتطلبات الهوية، اختر السماح بطلبات من أي هوية.

      لقطة شاشة تظهر إضافة مزود هوية مع جمهور الرموز وفحوصات إضافية.

  7. في قسم إعدادات مصادقة خدمة التطبيقات ، اتبع الخطوات التالية:

    1. لتقييد الوصول، حدد طلب المصادقة.

    2. بالنسبة للطلبات غير المصادقة، اختر إرجاع HTTP 401 غير مصرح به.

      لقطة شاشة تظهر إعدادات مصادقة خدمة التطبيقات.

  8. اختر إعدادات أخرى استنادا إلى متطلباتك الخاصة، ثم حدد إضافة.

إنشاء واستخدام رمز Microsoft Entra ID

الآن، قم بإنشاء واستخدام الرمز المميز لمعرف Microsoft Entra.

  1. إنشاء رمز Microsoft Entra ID باستخدام الهوية المدارة مع معرف التطبيق URI (api://<ClientID>) كمورد.
  2. استخدم هذا الرمز المميز لاستدعاء دالة Azure عن طريق تضمينها في عنوان الطلب.

تكوين إعدادات مصادقة إخطار على الويب المخصصة على مساحة اسم شبكة الأحداث

قم بتكوين إعدادات مصادقة الإخطار على الويب المخصصة على مساحة اسم شبكة الأحداث باستخدام مدخل Microsoft Azure وAzure CLI. يمكنك إنشاء مساحة الاسم أولا ثم تحديثها.

استخدام مدخل Microsoft Azure

  1. انتقل إلى مساحة اسم شبكة الأحداث في مدخل Microsoft Azure.

  2. في صفحة Event Grid Namespace ، حدد Configuration في القائمة اليسرى.

  3. في قسم مصادقة الإخطار على الويب المخصصة ، حدد قيما للخصائص التالية:

    1. نوع الهوية المدارة: حدد المستخدم المخصص.
    2. عنوان URL لخطاف الويب: أدخل قيمة نقطة نهاية عنوان URL حيث ترسل خدمة Event Grid طلبات إخطار ويب مصادق عليها باستخدام الهوية المدارة المحددة.
    3. عنوان URL لجمهور الرمز المميز: أدخل قيمة معرف تطبيق Microsoft Entra أو URI للحصول على رمز الوصول المميز ليتم تضمينه كرمز مميز للحامل في طلبات التسليم.
    4. معرف مستأجر معرف Microsoft Entra: أدخل قيمة معرف مستأجر Microsoft Entra المستخدم للحصول على الرمز المميز للحامل لتسليم خطاف الويب المصادق عليه.
  4. حدد تطبيق.

    لقطة شاشة تعرض تكوين مصادقة خطاف الويب لمساحة اسم شبكة الأحداث.

استخدام Azure CLI

لتحديث مساحة الاسم الخاصة بك باستخدام تكوين مصادقة الإخطار على الويب المخصص، استخدم الأمر التالي:

az eventgrid namespace update \ 
    --resource-group <resource-group-name> \ 
    --name <namespace-name> \ 
    --api-version 2025-04-01-preview \ 
    --identity-type UserAssigned \ 
    --identity-user-assigned-identities "/subscriptions/XXXXXXXXXXX/resourcegroups/XXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/XXXXXXXXXXX={}" \ 
    --set properties.isZoneRedundant=true \ 
        properties.topicSpacesConfiguration.state=Enabled \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.identity.type=UserAssigned \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.identity.userAssignedIdentity="/subscriptions/XXXXXXXXXXX/resourcegroups/XXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/XXXXXXXXXXX" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.endpointUrl="https://XXXXXXXXXXX" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.azureActiveDirectoryApplicationIdOrUri="api://XXXXXXXXXXX/.default" \ 
        properties.topicSpacesConfiguration.clientAuthentication.webHookAuthentication.azureActiveDirectoryTenantId="XXXXXXXXXXX" 

استبدل <NAMESPACE_NAME> قيمك الفعلية وبمعها <RESOURCE_GROUP_NAME> . املأ العناصر النائبة في الاشتراك ومجموعة الموارد والهوية ومعرف التطبيق وعنوان URL ومعرف المستأجر. لتحسين أداء وموثوقية المصادقة المعتمدة على webhook لوسيط Event Grid MQTT، نوصي بتفعيل دعم HTTP/2 لنقطة نهاية webhook الخاصة بك.

تفاصيل Webhook API

رؤوس الطلبات

يرسل Azure Event Grid الرؤوس التالية في الطلب إلى webhook:

Authorization: Bearer <token>

الرمز المميز هو رمز Microsoft Entra المميز للهوية المدارة التي تم تكوينها لاستدعاء خطاف الويب.

حمولة الطلب

{
    "clientId": "<string>",
    "userName": "<string>",
    "password": "<base64 encoded bytes>",
    "authenticationMethod": "<string>",
    "authenticationData": "<base64 encoded bytes>",
    "clientCertificate": "<certificate in PEM format>",
    "clientCertificateChain": "<certificates from chain in PEM format>"
}

أوصاف حقل الحمولة

الحقل مطلوب/اختياري الوصف
clientId مطلوب معرف العميل من حزمة MQTT CONNECT.
userName اختياري اسم المستخدم من حزمة MQTT CONNECT.
password اختياري كلمة المرور من حزمة MQTT CONNECT في ترميز Base64.
authenticationMethod اختياري أسلوب المصادقة من حزمة MQTT CONNECT (MQTT5 فقط).
authenticationData اختياري بيانات المصادقة من حزمة MQTT CONNECT في ترميز Base64 (MQTT5 فقط).
clientCertificate اختياري شهادة العميل بصيغة البريد Privacy-Enhanced (PEM).
clientCertificateChain اختياري الشهادات الأخرى التي يقدمها العميل مطلوبة لإنشاء السلسلة من شهادة العميل إلى شهادة المرجع المصدق.

حمولة الاستجابة

استجابة ناجحة

HTTP/1.1 200 OK 
Content-Type: application/json 

{ 
    "decision": "allow", 
    "clientAuthenticationName": "<string>", 
    "attributes": { 
        "attr": "<int/string/array_of_strings>", 
        ... 
    }, 
    "expiration": "<unix time format>" 
} 

الرد مرفوض

HTTP/1.1 200 OK 
Content-Type: application/json 

{ 
    "decision": "deny", 
    "errorReason": "<string>" 
}

رموز الخطأ:

نتيجة المصادقة استجابة الدالة رمز سبب شبكة الأحداث MQTT
رفض صريح للتفويض "decision": "deny" غير مصرح به
رمز غير صالح / منتهية الصلاحية "decision": "deny" غير مصرح به
مهلة الوظيفة غير متوفر الخادم غير متوفر
استثناء الدالة / تعطل غير متوفر الخادم غير متوفر
فشل المنصة المؤقتة غير متوفر الخادم غير متوفر
خطأ في معالجة الوسيط الداخلي غير متوفر الخادم غير متوفر

أوصاف حقل الاستجابة

الحقل النوع مطلوب متى الوصف
decision الوتر (allow | deny) دائما مطلوب قرار المصادقة أعادته الخدمة. القيم المسموح بها هي allow أو deny.
clientAuthenticationName الوتر مطلوب إذا كان decision = allow اسم هوية العميل (على سبيل المثال، معرف الجهاز أو معرف العميل).
attributes كائن (قاموس) اختياري إذا كان decision = allow أزواج القيم الرئيسية تمثل سمات إضافية. يمكن أن تكون القيم int أو string أو مصفوفة سلاسل نصية.
expiration العدد الصحيح (طابع زمني يونكس، ثواني) اختياري إذا كان decision = allow وقت انتهاء صلاحية قرار التفويض، معبرا عنه ب "وقت يونكس" (ثوان منذ الحقبة). مثال:1713782400.
errorReason الوتر اختياري إذا كان decision = deny رسالة خطأ تشرح سبب رفض الطلب. يتم تسجيل هذه القيمة للتشخيص.

أمثلة على أنواع السمات المتوافقة

"num_attr_pos": 1, 
"num_attr_neg": -1, 
"str_attr": "str_value", 
"str_list_attr": [ 
    "str_value_1", 
    "str_value_2" 
] 

يتم استخدام جميع أنواع البيانات الصحيحة (الرقم الذي يناسبك <int32/string/array_of_strings>) كسمات. في المثال، num_attr_posتحتوي المطالبات على أنواع num_attr_negstr_attrstr_list_attrبيانات صحيحة وتستخدم كسمات.