Как использовать microsoft graph api для назначения роли пользователю в Azure Ad

Я создал роль в app registration manifest:

"appRoles": [
   {
      "allowedMemberTypes": [
        "User"
      ],
      "displayName": "Student",
      "id": "d1c2ade8-98f8-45fd-aa4a-6d06b947c66f",
      "isEnabled": true,
      "description": "Student",
      "value": "Student"
    }
  ],

Теперь я использую appRoleAssignment api для назначения роли пользователю. Я следую этому документация. На этой странице говорится, что нам нужно использовать нижеприведенный api с телом json:

POST https://graph.microsoft.com/v1.0/servicePrincipals/{id}/appRoleAssignments
Content-Type: application/json
Content-Length: 110

{
  "principalId": "principalId-value",
  "resourceId": "resourceId-value",
  "appRoleId": "appRoleId-value"
}

Я не могу понять, что мне следует использовать в principalId, resourceId и appRoleId. На этой странице говорится, что:

principalId: The id of the client service principal to which you are assigning the app role.
resourceId: The id of the resource servicePrincipal (the API) which has defined the app role (the application permission).
appRoleId: The id of the appRole (defined on the resource service principal) to assign to the client service principal.

Но я понял, что principalId is the ID of the user I have in the active directory for which I want to assign the role.

который в моем случае является ObjectId на фото ниже:

введите описание изображения здесь

это верно.?

resourceId - это идентификатор арендатора, а appRoleId - это идентификатор, который я использовал при создании роли приложения, указанной выше, это d1c2ade8-98f8-45fd-aa4a-6d06b947c66f

Собираем все вместе, если я сделаю запрос на Python

token = get_token()
headers = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}

user_data = {
    "principalId": "1bc79085-12qw-4fad-8da8-647f4b4b2927",  
    "resourceId": "c01b6482-3ccd-4533-8c98-a7c5e8067cc8",   
    "appRoleId": "d1c2ade8-98f8-45fd-aa4a-6d06b947c66f"  
}
j_data = json.dumps(user_data)
conn = http.client.HTTPSConnection('graph.microsoft.com')
conn.request("POST", "/v1.0/servicePrincipals/1bc79085-12qw-4fad-8da8-647f4b4b2927/appRoleAssignments", j_data, headers)
response = conn.getresponse()
rdata = response.read()

Я получаю ответ ниже:

{
  "error": {
    "code": "Request_ResourceNotFound",
    "message": "Resource '1bc79085-12qw-4fad-8da8-647f4b4b2927' does not exist or one of its queried reference-property objects are not present.",
    "innerError": {
      "date": "2020-10-26T05:16:35",
      "request-id": "1c87a140-7bc9-499d-82dd-bc1dcb54e075",
      "client-request-id": "1c87a140-7bc9-499d-82dd-bc1dcb54e075"
    }
  }
}

Может ли кто-нибудь помочь мне отладить это. Пожалуйста помоги. Спасибо

РЕДАКТИРОВАТЬ:

Ошибка:

{
    "error": {
        "code": "Request_ResourceNotFound",
        "message": "Resource '261eda4b-6eee-45ba-a176-259960603409' does not exist or one of its queried reference-property objects are not present.",
        "innerError": {
            "date": "2020-10-26T07:09:38",
            "request-id": "8dc2ea73-63e5-45b5-8127-445df777c1e1",
            "client-request-id": "8dc2ea73-63e5-45b5-8127-445df777c1e1"
        }
    }
}

Json:

{
    "principalId": "f923e078-ca9d-4611-a80e-bebb712ad7d1",  
    "resourceId": "261eda4b-6eee-45ba-a176-259960603409",   
    "appRoleId": "d1c2ade8-98f8-45fd-aa4a-6d06b947c66f"  
}

URL сообщения: https://graph.microsoft.com/v1.0/servicePrincipals/261eda4b-6eee-45ba-a176-259960603409/appRoleAssignments

GET URL для получения идентификатора объекта: https://graph.microsoft.com/v1.0/serviceprincipals?$select=id&$filter=displayName eq '{useracces}'

введите описание изображения здесь


person S Andrew    schedule 26.10.2020    source источник


Ответы (1)


POST https://graph.microsoft.com/v1.0/servicePrincipals/{id}/appRoleAssignedTo
Content-Type: application/json
Content-Length: 110

{
  "principalId": "principalId-value",
  "resourceId": "resourceId-value",
  "appRoleId": "appRoleId-value"
}

В этом примере {id} и {resourceId-value} будут идентификаторами объекта субъекта-службы ресурсов, который представляет собой корпоративное приложение, связанное с приложением Azure AD, в котором вы создали appRoles.

И {principalId-value} будет идентификатором объекта пользователя.

{appRoleId-value} - это идентификатор роли приложения, созданной вами в манифесте.

ОБНОВЛЕНИЕ:

Шаги, которые вы получите для идентификатора объекта субъекта-службы, верны.

Если вы хотите получить его с помощью Graph API, вы можете сделать это так:

GET https://graph.microsoft.com/v1.0/serviceprincipals?$select=id&$filter=displayName eq '{app name}'
person Allen Wu    schedule 26.10.2020
comment
Спасибо. Чтобы получить object id, я вошел в регистрацию приложений, затем щелкнул соответствующее приложение и из обзора приложения скопировал идентификатор объекта. Это правильно или нам нужно получить идентификатор объекта откуда-то еще. - person S Andrew; 26.10.2020
comment
Если мои шаги по получению идентификатора объекта верны, я не уверен, почему я все еще получаю ту же ошибку Request_ResourceNotFound. И используя упомянутый вами api, я получаю этот ответ { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(id)", "value": [] } - person S Andrew; 26.10.2020
comment
@SAndrew Пожалуйста, поделитесь завершенной Request_ResourceNotFound ошибкой, которую вы получили сейчас. И поделитесь полным запросом /serviceprincipals?$select=id&$filter=displayName eq '{app name}'. - person Allen Wu; 26.10.2020
comment
@SAndrew Итак, 261eda4b-6eee-45ba-a176-259960603409 - это идентификатор объекта вашего принципала службы, верно? Не могли бы вы предоставить снимок экрана, где вы его получили на портале Azure? - person Allen Wu; 26.10.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Allen Wu; 26.10.2020