【问题标题】:Azure AD: Grant an appRoleAssignment for a service principal is failing with "code": "Request_ResourceNotFound"Azure AD:为服务主体授予 appRoleAssignment 失败并出现“代码”:“Request_ResourceNotFound”
【发布时间】:2020-10-12 08:23:37
【问题描述】:

我正在尝试为应用程序创建“服务主体”,并使用 Microsoft graph API 授予管理员权限。

我按照以下步骤操作:

  1. 使用图形 API 在租户中创建应用程序。我的请求正文是:

    {
      "displayName": "AppWithPermissions",
      "requiredResourceAccess": [
        {
          "resourceAppId": "00000002-0000-0ff1-ce00-000000000000",
          "resourceAccess": [
            {
              "id": "dc890d15-9560-4a4c-9b7f-a736ec74ec40",
              "type": "Role"
            }
          ]
        }
      ]
    }
    
  2. 为上面创建的应用程序创建了一个服务主体。创建成功。

  3. 现在,我想使用图形 API 以编程方式授予管理员同意每个分配的权限。

  4. 为了授予应用程序权限,我在 API 服务主体的 appRoleAssignedTo 集合中创建了一个应用角色分配: 请求如下:

    发布请求:

    https://graph.microsoft.com/v1.0/servicePrincipals/{id}/appRoleAssignedTo
    

    请求正文:

    {
        "principalId": "principal_id",
        "resourceId": "resource_id",
        "appRoleId": "approle_id"
    }
    

这里,

  1. “principal_id”是上述步骤 2 中创建的服务主体的“id”。
  2. "approle_id" 是您要授予的 appRole 的 id。 (从“requiredResourceAccess”中的“resourceAccess”数组中获取“id”值)
  3. http请求url中的“id”和“resource_id”是一样的。 (从“requiredResourceAccess”中获取“resourceAppId”值,对应于上面给出的“approle_id”)

运行查询后,我收到错误 404。 “代码”:“Request_ResourceNotFound” 对于“resource_id”/“id”字段。

  • 添加屏幕截图以便更好地理解:
  1. 应用创建:

  1. 服务主体创建:

  1. 为服务主体授予 appRoleAssignment:

我对在哪里使用哪些 ID 感到困惑,并且没有从文档中得到明确的想法。任何人都可以解决我的问题吗?提前致谢。

【问题讨论】:

    标签: azure-active-directory microsoft-graph-api azure-service-principal


    【解决方案1】:

    您似乎使用的是 appId 而不是 id 值。

    在应用角色分配中,resourceId 是资源应用(在您的情况下为 API)的 servicePrincipalid。在 application 对象的 requiredResourceAccess 中,您使用 appId,这是一个不同的值。

    要查找您知道 appId 的服务主体的 id

    GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '{app-id}'
    

    响应将包含 servicePrincipal 对象的 id 属性,您可以在创建应用角色分配时使用它。

    【讨论】:

    • 谢谢菲利普。让我澄清一下,{resourceId},{principalId} 与 servicePrincipal 对象的 id 属性相同。但我仍然没有得到 {appRoleId} 的值应该是什么?在我对 servicePrincipal 对象的回复中,“appRoles”数组为 NULL。它与“requiredResourceAccess”数组中的值无关?
    • 如果您检索 API 的 servicePrincipal(例如GET .../servicePrincipals?$filter=appId eq '00000003-0000-0000-c000-000000000000'),结果将具有一个 appRoles 属性,该属性将包含为该 API 定义的所有应用角色。但是,在您的情况下,您似乎已经知道 {appRoleId} 值(例如 5b567255-7703-4780-807c-7be8301ae99b、75359482-378d-4052-8f01-80520e7db3cd 等),因此您可以直接使用它。
    • 我无法将这些值(例如 5b567255-7703-4780-807c-7be8301ae99b、75359482-378d-4052-8f01-80520e7db3cd 等)用于 {appRoleId}。我收到此错误:“消息”:“在应用程序中未找到分配的权限”。我们需要在创建时为应用程序定义“appRoles”数组。
    • 您能否更新您的问题以包含您为创建应用角色分配(包括正文)所做的查询?
    • 我已经用步骤和屏幕截图更新了我的问题。请参考他们。
    【解决方案2】:

    document的描述不是很清楚。

    简单来说:

    principalId:通常是您的服务主体 ID。

    resourceId:通常是您的服务主体 ID。

    appRoleId: 对于 appRoleId,您可以通过请求 GET https://graph.microsoft.com/v1.0/servicePrincipals/{id}. 找到它

    为服务主体授予 appRoleAssignment:

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2020-06-05
    相关资源
    最近更新 更多