تطبيق Azure المدار بهوية مدارة

إشعار

دعم الهوية المدارة لتطبيقات Azure المدارة قيد المعاينة حاليا. يرجى استخدام إصدار واجهة برمجة التطبيقات 2018-09-01-preview للاستفادة من الهوية المدارة.

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

يمكن منح طلبك نوعين من الهويات:

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

كيفية استخدام الهوية المدارة

تمكن الهوية المدارة العديد من السيناريوهات للتطبيقات المدارة. بعض السيناريوهات الشائعة التي يمكن حلها هي كما يلي:

  • نشر تطبيق مدار مرتبط بموارد Azure الموجودة. مثال على ذلك هو نشر جهاز ظاهري Azure (VM) داخل التطبيق المدار المرفق بواجهة شبكة موجودة.
  • منح التطبيق المدار ووصول الناشر إلى موارد Azure خارج مجموعة الموارد المدارة.
  • توفير هوية تشغيلية للتطبيقات المدارة ل Activity Log والخدمات الأخرى داخل Azure.

إضافة هوية مدارة

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

{
  "identity": {
    "type": "SystemAssigned, UserAssigned",
    "userAssignedIdentities": {
      "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity": {}
    }
  }
}

هناك طريقتان شائعتان لإنشاء تطبيق مدار باستخدام identity: createUiDefinition.json وقوالب Azure Resource Manager. بالنسبة لسيناريوهات الإنشاء الفردية البسيطة، يجب استخدام createUiDefinition لتمكين الهوية المدارة، لأنها توفر تجربة أكثر ثراء. ومع ذلك، عند التعامل مع الأنظمة المتقدمة أو المعقدة التي تتطلب عمليات نشر تطبيقات مدارة تلقائية أو متعددة، يمكن استخدام القوالب.

استخدام createUiDefinition

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

"outputs": {
  "managedIdentity": { "Type": "SystemAssigned" }
}

متى تستخدم createUiDefinition للهوية المدارة

فيما يلي بعض التوصيات حول وقت استخدام createUiDefinition لتمكين هوية مدارة على التطبيقات المدارة.

  • يمر إنشاء التطبيق المدار عبر مدخل Microsoft Azure أو Azure Marketplace.
  • تتطلب الهوية المدارة إدخالا معقدا للمستهلك.
  • الهوية المدارة مطلوبة عند إنشاء التطبيق المدار.

التحكم في الهوية المدارة createUiDefinition

يدعم createUiDefinition.json عنصر تحكم هوية مدار مضمن.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [],
    "steps": [
      {
        "name": "applicationSettings",
        "label": "Application Settings",
        "subLabel": {
          "preValidation": "Configure your application settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Application Settings",
        "elements": [
          {
            "name": "appName",
            "type": "Microsoft.Common.TextBox",
            "label": "Managed application Name",
            "toolTip": "Managed application instance name",
            "visible": true
          },
          {
            "name": "appIdentity",
            "type": "Microsoft.ManagedIdentity.IdentitySelector",
            "label": "Managed Identity Configuration",
            "toolTip": {
              "systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
              "userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
            },
            "defaultValue": {
              "systemAssignedIdentity": "Off"
            },
            "options": {
              "hideSystemAssignedIdentity": false,
              "hideUserAssignedIdentity": false,
              "readOnlySystemAssignedIdentity": false
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "applicationResourceName": "[steps('applicationSettings').appName]",
      "location": "[location()]",
      "managedIdentity": "[steps('applicationSettings').appIdentity]"
    }
  }
}

Screenshot of the application settings for system-assigned managed identity and user-assigned managed identity

استخدام قوالب Azure Resource Manager

إشعار

يتم إنشاء قوالب التطبيقات المدارة من Marketplace تلقائيا للعملاء الذين يمرون بتجربة إنشاء مدخل Microsoft Azure. بالنسبة لهذه السيناريوهات، managedIdentity يجب استخدام مفتاح الإخراج على createUiDefinition لتمكين الهوية.

يمكن أيضا تمكين الهوية المدارة من خلال قوالب Azure Resource Manager. تمكن العينة التالية هوية مدارة معينة من قبل النظام على التطبيق المدار. يمكن تكوين عناصر هوية أكثر تعقيدًا باستخدام معلمات قالب Azure Resource Manager لتوفير المدخلات. يمكن استخدام هذه المدخلات لإنشاء تطبيقات مدارة بهوية مدارة يعينها المستخدم.

متى تستخدم قوالب Azure Resource Manager للهوية المدارة

فيما يلي بعض التوصيات حول وقت استخدام قوالب Azure Resource Manager لتمكين الهوية المدارة على التطبيقات المدارة.

  • يمكن نشر التطبيقات المدارة برمجيا استنادا إلى قالب.
  • هناك حاجة إلى تعيينات دور مخصصة للهوية المدارة لتوفير التطبيق المدار.
  • لا يحتاج التطبيق المدار إلى مدخل Microsoft Azure وتدفق إنشاء Marketplace.

قالب معين عن طريق النظام

قالب Azure Resource Manager أساسي ينشر تطبيقا مدارا بهوية مدارة يعينها النظام.

"resources": [
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "SystemAssigned"
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

قالب معين من جانب المستخدم

قالب Azure Resource Manager أساسي ينشر تطبيقا مدارا بهوية مدارة يعينها المستخدم.

"resources": [
  {
    "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
    "name": "[parameters('managedIdentityName')]",
    "apiVersion": "2018-11-30",
    "location": "[parameters('location')]"
  },
  {
    "type": "Microsoft.Solutions/applications",
    "name": "[parameters('applicationName')]",
    "apiVersion": "2018-09-01-preview",
    "location": "[parameters('location')]",
    "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
            "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities/',parameters('managedIdentityName'))]": {}
        }
    },
    "properties": {
        "ManagedResourceGroupId": "[parameters('managedByResourceGroupId')]",
        "parameters": { }
    }
  }
]

إدارة الوصول إلى موارد Azure

بمجرد منح تطبيق مدار هوية، يمكن منحه حق الوصول إلى موارد Azure الموجودة عن طريق إنشاء تعيين دور.

للقيام بذلك، ابحث عن وحدد اسم التطبيق المدار أو الهوية المدارة المعينة من قبل المستخدم، ثم حدد Access control (IAM). للحصول على خطوات تفصيلية، راجع تعيين أدوار Azure باستخدام مدخل Azure.

ربط موارد Azure الحالية

إشعار

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

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

تأليف createUiDefinition مع مورد مرتبط

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

نموذج createUiDefinition.json يتطلب إدخالين: معرف مورد واجهة الشبكة ومعرف مورد هوية مدار معين من قبل المستخدم.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [
      {}
    ],
    "steps": [
      {
        "name": "managedApplicationSetting",
        "label": "Managed Application Settings",
        "subLabel": {
          "preValidation": "Managed Application Settings",
          "postValidation": "Done"
        },
        "bladeTitle": "Managed Application Settings",
        "elements": [
          {
            "name": "networkInterfaceId",
            "type": "Microsoft.Common.TextBox",
            "label": "Network interface resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.Network/networkInterfaces/existingnetworkinterface",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.Network/networkInterfaces/networkinterface1",
            "visible": true
          },
          {
            "name": "userAssignedId",
            "type": "Microsoft.Common.TextBox",
            "label": "User-assigned managed identity resource ID",
            "defaultValue": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/testRG/providers/Microsoft.ManagedIdentity/userassignedidentites/myuserassignedidentity",
            "toolTip": "Must represent the identity as an Azure Resource Manager resource identifer format ex. /subscriptions/sub1/resourcegroups/myGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/identity1",
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "existingNetworkInterfaceId": "[steps('managedApplicationSetting').networkInterfaceId]",
      "managedIdentity": "[parse(concat('{\"Type\":\"UserAssigned\",\"UserAssignedIdentities\":{',string(steps('managedApplicationSetting').userAssignedId),':{}}}'))]"
    }
  }
}

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

Screenshot of a sample createUiDefinition.json with two inputs: a network interface resource ID and a user-assigned managed identity resource ID.

تأليف القالب الرئيسي باستخدام مورد مرتبط

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

نموذج قالب رئيسي يعين ملف تعريف الشبكة إلى واجهة شبكة موجودة يوفرها createUiDefinition.json.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "existingNetworkInterfaceId": { "type": "string" }
  },
  "variables": {
  },
  "resources": [
    {
      "apiVersion": "2016-04-30-preview",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "myLinkedResourceVM",
      "location": "[resourceGroup().location]",
      "properties": {
        …,
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[parameters('existingNetworkInterfaceId')]"
            }
          ]
        }
      }
    }
  ]
}

استهلاك التطبيق المدار مع مورد مرتبط

بمجرد إنشاء حزمة التطبيق المدارة، يمكن استهلاك التطبيق المدار من خلال مدخل Microsoft Azure. قبل أن يتم استهلاكه، هناك عدة خطوات أساسية.

الوصول إلى الرمز المميز للهوية المدارة

يمكن الآن الوصول إلى الرمز المميز للتطبيق المدار من خلال listTokens واجهة برمجة التطبيقات من مستأجر الناشر. قد يبدو طلب المثال كما يلي:

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}/listTokens?api-version=2018-09-01-preview HTTP/1.1

{
  "authorizationAudience": "https://management.azure.com/",
  "userAssignedIdentities": [
      "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{userAssignedIdentityName}"
  ]
}

طلب معلمات النص الأساسي على نحو ما يلي:

المعلمة المطلوب ‏‏الوصف
authorizationAudience no URI معرف التطبيق للمورد المستهدف. وهي أيضًا مطالبة (الجمهور) audبالرمز الذي تم إصداره. القيمة الافتراضية هي "https://management.azure.com/"
userAssignedIdentities no قائمة الهويات المُدارة المعينة من قبل المستخدم لاسترداد رمز مميز لـ. إذا لم يتم تحديده، listTokens فسترجع الرمز المميز للهوية المدارة المعينة من قبل النظام.

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

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

{
  "value": [
    {
      "access_token": "eyJ0eXAi…",
      "expires_in": "2…",
      "expires_on": "1557…",
      "not_before": "1557…",
      "authorizationAudience": "https://management.azure.com/",
      "resourceId": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Solutions/applications/{applicationName}",
      "token_type": "Bearer"
    }
  ]
}

تحتوي الاستجابة على صفيف من الرموز المميزة ضمن الخاصية value :

المعلمة ‏‏الوصف‬
access_token رمز الوصول المميز المطلوب.
expires_in عدد الثوانى التي يكون فيها الرمز المميز للوصول صالحا.
expires_on الفترة الزمنية التي تنتهي فيها صلاحية رمز الوصول. يتم تمثيل هذه القيمة على أنها عدد الثوان من الفترة.
not_before الفترة الزمنية التي يصبح فيها رمز الوصول ساري المفعول. يتم تمثيل هذه القيمة على أنها عدد الثوان من الفترة.
authorizationAudience (الجمهور) aud الذي تم طلب رمز الوصول له. هذه القيمة هي نفس ما تم توفيره listTokens في الطلب.
resourceId معرف مورد Azure للرمز الذي تم إصداره. هذه القيمة هي إما معرف التطبيق المدار أو معرف الهوية المدارة المعين من قبل المستخدم.
token_type فئة الرمز المميز.

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