استخدام التحكم في الوصول استنادا إلى دور مستوى البيانات مع Azure Cosmos DB ل NoSQL

ينطبق على: NoSQL

رسم تخطيطي للموقع الحالي ('التحكم في الوصول استنادا إلى الدور') في تسلسل دليل التوزيع.

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

تلميح

تفضل بزيارة معرض العينات الجديد للحصول على أحدث العينات لإنشاء تطبيقات جديدة

تتناول هذه المقالة خطوات منح هوية الوصول لإدارة البيانات في Azure Cosmos DB لحساب NoSQL.

هام

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

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

  • حساب Azure مع اشتراك نشط. أنشئ حساباً مجاناً.
  • حساب Azure Cosmos DB ل NoSQL موجود.
  • هوية واحدة أو أكثر موجودة في معرف Microsoft Entra.

إعداد تعريف الدور

أولا، يجب إعداد تعريف دور مع قائمة dataActions لمنح حق الوصول لقراءة البيانات والاستعلام عنها وإدارتها في Azure Cosmos DB ل NoSQL.

هام

يتطلب الحصول على تعريف دور مستوى بيانات موجود أذونات وحدة التحكم هذه:

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read

لمزيد من المعلومات، راجع منح الوصول المستند إلى الدور لمستوى التحكم.

سرد جميع تعريفات الدور المقترنة بحساب Azure Cosmos DB الخاص بك ل NoSQL باستخدام az cosmosdb sql role definition list. راجع الإخراج وحدد موقع تعريف الدور المسمى Cosmos DB Built-in Data Contributor. يحتوي الإخراج على المعرف الفريد لتعريف الدور في الخاصية id . سجل هذه القيمة كما هو مطلوب لاستخدامها في خطوة التعيين لاحقا في هذا الدليل.

az cosmosdb sql role definition list \
    --resource-group "<name-of-existing-resource-group>" \
    --account-name "<name-of-existing-nosql-account>"
[
  ...,
  {
    "assignableScopes": [
      "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    ],
    "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002",
    "name": "00000000-0000-0000-0000-000000000002",
    "permissions": [
      {
        "dataActions": [
          "Microsoft.DocumentDB/databaseAccounts/readMetadata",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*",
          "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*"
        ],
        "notDataActions": []
      }
    ],
    "resourceGroup": "msdocs-identity-example",
    "roleName": "Cosmos DB Built-in Data Contributor",
    "type": "Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions",
    "typePropertiesType": "BuiltInRole"
  }
  ...
]

إشعار

في هذا المثال، id ستكون /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002القيمة . يستخدم هذا المثال بيانات وهمية وسيكون المعرف الخاص بك مميزا عن هذا المثال.

استخدم Get-AzCosmosDBSqlRoleDefinition لسرد جميع تعريفات الأدوار المقترنة بحساب Azure Cosmos DB ل NoSQL. راجع الإخراج وحدد موقع تعريف الدور المسمى Cosmos DB Built-in Data Contributor. يحتوي الإخراج على المعرف الفريد لتعريف الدور في الخاصية Id . سجل هذه القيمة كما هو مطلوب لاستخدامها في خطوة التعيين لاحقا في هذا الدليل.

$parameters = @{
    ResourceGroupName = "<name-of-existing-resource-group>"
    AccountName = "<name-of-existing-nosql-account>"
}
Get-AzCosmosDBSqlRoleDefinition @parameters
Id                         : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002
RoleName                   : Cosmos DB Built-in Data Contributor
Type                       : BuiltInRole
AssignableScopes           : {/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccountsmsdocs-identity-example-nosql}
Permissions.DataActions    : {Microsoft.DocumentDB/databaseAccounts/readMetadata, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*, Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*}
Permissions.NotDataActions : 

إشعار

في هذا المثال، Id ستكون /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql/sqlRoleDefinitions/00000000-0000-0000-0000-000000000002القيمة . يستخدم هذا المثال بيانات وهمية وسيكون المعرف الخاص بك مميزا عن هذا المثال. ومع ذلك، فإن المعرف (00000000-0000-0000-0000-000000000002) فريد عبر جميع تعريفات الأدوار في حسابك.

تعيين دور للهوية

الآن، قم بتعيين الدور المحدد حديثا إلى هوية بحيث يمكن للتطبيقات الخاصة بك الوصول إلى البيانات في Azure Cosmos DB ل NoSQL.

هام

يتطلب إنشاء تعيين دور مستوى بيانات جديد أذونات وحدة التحكم هذه:

  • Microsoft.DocumentDB/databaseAccounts/sqlRoleDefinitions/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/read
  • Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments/write

لمزيد من المعلومات، راجع منح الوصول المستند إلى الدور لمستوى التحكم.

  1. استخدم az cosmosdb show للحصول على المعرف الفريد لحسابك الحالي.

    az cosmosdb show \
        --resource-group "<name-of-existing-resource-group>" \
        --name "<name-of-existing-nosql-account>" \
        --query "{id:id}"
    
  2. لاحظ إخراج الأمر السابق. سجل قيمة الخاصية id لهذا الحساب كما هو مطلوب للاستخدام في الخطوة التالية.

    {
      "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }
    

    إشعار

    في هذا المثال، id ستكون /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosqlالقيمة . يستخدم هذا المثال بيانات وهمية وسيكون المعرف الخاص بك مميزا عن هذا المثال.

  3. تعيين الدور الجديد باستخدام az cosmosdb sql role assignment create. استخدم معرفات تعريف الدور المسجلة مسبقا للوسيطة --role-definition-id ، والمعرف الفريد لهويتك للوسيطة --principal-id . وأخيرا، استخدم معرف حسابك للوسيطة --scope .

    az cosmosdb sql role assignment create \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>" \
        --role-definition-id "<id-of-new-role-definition>" \
        --principal-id "<id-of-existing-identity>" \
        --scope "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    
  4. استخدم az cosmosdb sql role assignment list لسرد جميع تعيينات الأدوار لحساب Azure Cosmos DB الخاص بك ل NoSQL. راجع الإخراج للتأكد من إنشاء تعيين الدور الخاص بك.

    az cosmosdb sql role assignment list \
        --resource-group "<name-of-existing-resource-group>" \
        --account-name "<name-of-existing-nosql-account>"
    
  1. إنشاء ملف Bicep جديد لتعريف تعيين الدور الخاص بك. قم بتسمية الملف data-plane-role-assignment.bicep.

    metadata description = 'Assign RBAC role for data plane access to Azure Cosmos DB for NoSQL.'
    
    @description('Name of the Azure Cosmos DB for NoSQL account.')
    param accountName string
    
    @description('Id of the role definition to assign to the targeted principal in the context of the account.')
    param roleDefinitionId string
    
    @description('Id of the identity/principal to assign this role in the context of the account.')
    param identityId string
    
    resource account 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' existing = {
      name: accountName
    }
    
    resource assignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = {
      name: guid(roleDefinitionId, identityId, account.id)
      parent: account
      properties: {
        principalId: identityId
        roleDefinitionId: roleDefinitionId
        scope: account.id
      }
    }
    
    output assignmentId string = assignment.id
    
  2. إنشاء ملف معلمات Bicep جديد يسمى data-plane-role-assignment.bicepparam. في ملف المعلمات هذا، قم بتعيين اسم حساب Azure Cosmos DB الحالي ل NoSQL إلى accountName المعلمة، ومعرفات تعريف الدور المسجلة مسبقا إلى roleDefinitionId المعلمة، والمعرف الفريد لهويتك إلى المعلمة identityId .

    using './data-plane-role-assignment.bicep'
    
    param accountName = '<name-of-existing-nosql-account>'
    param roleDefinitionId = '<id-of-new-role-definition>'
    param identityId = '<id-of-existing-identity>'
    
  3. انشر قالب Bicep باستخدام az deployment group create.

    az deployment group create \
        --resource-group "<name-of-existing-resource-group>" \
        --parameters data-plane-role-assignment.bicepparam \
        --template-file data-plane-role-assignment.bicep
    
  4. كرر هذه الخطوات لمنح حق الوصول إلى الحساب من أي هويات أخرى ترغب في استخدامها.

    تلميح

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

  1. استخدم Get-AzCosmosDBAccount للحصول على بيانات التعريف لحسابك الحالي.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        Name = "<name-of-existing-nosql-account>"
    }    
    Get-AzCosmosDBAccount @parameters | Select -Property Id
    
  2. لاحظ إخراج الأمر السابق. سجل قيمة الخاصية Id لهذا الحساب كما هو مطلوب للاستخدام في الخطوة التالية.

    Id
    --    
    /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql
    

    إشعار

    في هذا المثال، Id ستكون /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosqlالقيمة . يستخدم هذا المثال بيانات وهمية وسيكون المعرف الخاص بك مميزا عن هذا المثال.

  3. استخدم New-AzCosmosDBSqlRoleAssignment لتعيين الدور الجديد. استخدم معرفات تعريف الدور المسجلة مسبقا إلى المعلمة RoleDefinitionId ، والمعرف الفريد لهويتك إلى المعلمة PrincipalId . وأخيرا، استخدم معرف حسابك للمعلمة Scope .

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
        RoleDefinitionId = "<id-of-new-role-definition>"
        PrincipalId = "<id-of-existing-identity>"
        Scope = "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-identity-example/providers/Microsoft.DocumentDB/databaseAccounts/msdocs-identity-example-nosql"
    }    
    New-AzCosmosDBSqlRoleAssignment @parameters
    
  4. سرد جميع تعيينات الأدوار لحساب Azure Cosmos DB الخاص بك ل NoSQL باستخدام Get-AzCosmosDBSqlRoleAssignment. راجع الإخراج للتأكد من إنشاء تعيين الدور الخاص بك.

    $parameters = @{
        ResourceGroupName = "<name-of-existing-resource-group>"
        AccountName = "<name-of-existing-nosql-account>"
    }
    Get-AzCosmosDBSqlRoleAssignment @parameters
    

التحقق من صحة الوصول إلى مستوى البيانات في التعليمات البرمجية

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

using Azure.Core;
using Azure.Identity;
using Microsoft.Azure.Cosmos;

string endpoint = "<account-endpoint>";

TokenCredential credential = new DefaultAzureCredential();

CosmosClient client = new(endpoint, credential);

هام

يستخدم نموذج التعليمات البرمجية Microsoft.Azure.Cosmos هذا المكتبات و Azure.Identity من NuGet.