0

我正在尝试为 OAuth 创建一个 Azure AD 应用程序并尝试为其分配权限。该应用程序已成功创建,但我没有看到正确分配的权限。

以下是我创建应用程序所遵循的步骤。

  1. 使用设备代码流获取访问令牌。(https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-device-code

  2. 使用以下 C# 代码创建应用程序

    public async Task CallPostWebApiAndProcessResultAsync(string webApiUrl, string accessToken, string body, Action<JObject> processResult)
    {
        if (!string.IsNullOrEmpty(accessToken))
        {
            var defaultRequetHeaders = HttpClient.DefaultRequestHeaders;
            if (defaultRequetHeaders.Accept == null || !defaultRequetHeaders.Accept.Any(m => m.MediaType == "application/json"))
            {
                HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            }
            defaultRequetHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
    
            HttpContent postContent = new StringContent(body, Encoding.UTF8, "application/json");
            HttpResponseMessage response = await HttpClient.PostAsync(webApiUrl, postContent);
            if (response.IsSuccessStatusCode)
            {
                string json = await response.Content.ReadAsStringAsync();
                JObject result = JsonConvert.DeserializeObject(json) as JObject;
                processResult(result);
            }
            else
            {
                // Error
            }
        }
    }
    

    上述函数的参数如下:

    • webAPIUrl是:“https://graph.microsoft.com/v1.0/applications”
    • body是 :"{ \"displayName\": \"App with permissions in tenant\", \"requiredResourceAccess\": [ { \"resourceAppId\": \"00000003-0000-0000-c000-000000000000\", \"resourceAccess\": [ { \"id\": \"75359482-378d-4052-8f01-80520e7db3cd\", \"type\": \"Role\" }, { \"id\": \"62a82d76-70ea-41e2-9197-370581804d09\", \"type\": \"Role\" } ]}]}"

我可以验证应用程序是否已成功创建,但我无法看到成功分配给它的权限。

我正在尝试分配 Graph API 权限Files.ReadWrite.AllGroup.ReadWrite.All。这些权限也被添加,但它们的状态是“无法确定状态”。不会自动授予管理员同意。

在获取设备代码时,我使用租户管理员凭据登录,所以我不确定这里还需要什么。

不幸的是,无法在网上找到太多关于此的内容。如果有人对此有任何想法,请告诉我。

在此处输入图像描述

4

2 回答 2

0

我相信授予管理员同意是需要执行的单独步骤:https ://docs.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent#construct-the-url -for-granting-tenant-wide-admin 同意

于 2020-10-10T20:39:30.163 回答
0

设置requiredResourceAccess仅用于声明您的应用程序请求的权限(或需要,取决于流程)。这实际授予这些权限不同。从应用程序对象的requiredResourceAccess属性的文档中:

requiredResourceAccess集合
指定此应用程序需要访问的资源以及它在每个这些资源下所需的一组 OAuth 权限范围和应用程序角色。所需资源访问的这种预配置推动了同意体验。不可为空。

授予应用程序请求的权限的一种方法是使用交互式租户范围的同意 URL 来提示您授予权限,如向应用程序授予租户范围的管理员同意中所述。

或者,您可以使用 Microsoft Graph 来授予这些权限。

应用程序权限是应用程序角色。要授予应用程序权限,您必须在 API 服务主体的appRoleAssignedTo集合中创建应用程序角色分配:

  1. 确保存在客户端应用程序的服务主体。如果没有(例如,因为您刚刚创建了应用程序),则创建服务主体设为客户端应用的servicePrincipal对象{principal-id}id 。
  2. 检索资源应用程序的服务主体(例如,本例中的 API)。设为资源应用的servicePrincipal对象{resource-id}id 。
  3. 查找您希望授予的应用角色的ID 。在这种情况下,您已经拥有它(您在应用程序对象的requiredResourceAccess中使用了它),但您也可以在资源应用程序的servicePrincipal对象的appRoles集合中查找它。设为您要授予的appRole的id 。{app-role-id}
  4. 创建应用角色分配:
    POST https://graph.microsoft.com/v1.0/servicePrincipals/{resource-id}/appRoleAssignedTo
    
    {
      "principalId": "{principal-id}",
      "resourceId": "{resource-id}",
      "appRoleId": "{app-role-id}"
    }
    
    
  5. 为该 API 的每个应用角色(应用程序权限)重复步骤 4。

我建议不要手动构建所有这些请求,而是使用Microsoft Graph SDK


警告
通过授予应用程序对 Microsoft Graph 的权限,您可能会授予该应用程序对您的组织和组织数据的非常特权的访问权限。在执行此操作之前,请确保您完全了解其中的含义。

于 2020-10-11T14:30:05.173 回答