Azure OAuth:无法在管理员同意的情况下以编程方式创建应用程序以获得权限



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

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

  1. 使用设备代码流获取访问令牌。(https://learn.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
    }
    }
    }
    

    上述功能的参数如下:

    • CCD_ 1是:";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[/em>。这些权限也正在添加,但它们的状态为";无法确定状态";。不会自动授予管理员同意。

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

不幸的是,在网上找不到太多关于这个的信息。如果有人知道这件事,请告诉我。

在此处输入图像描述

设置requiredResourceAccess仅用于声明您的应用程序请求的权限(或需要,具体取决于流(。这与实际授予这些权限是不一样的。来自应用程序对象的requiredResourceAccess属性的文档:

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

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

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

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

  1. 确保存在客户端应用程序的服务主体。如果没有(例如,因为您刚刚创建了应用程序(,则创建服务主体。设{principal-id}为客户端应用程序的servicePrincipal对象的id
  2. 检索资源应用程序的服务主体(例如,在本例中为API(。让{resource-id}是资源应用程序的servicePrincipal对象的id
  3. 查找您希望授予的应用程序角色的id。在这种情况下,您已经有了它(您在应用程序对象的requiredResourceAccess中使用了它(,但您也可以在资源应用程序的servicePrincipal对象的
    appRoles集合中查找它。让{app-role-id}是要授予的appRoleid
  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的权限,您可能会授予应用程序访问您的组织和组织数据的特权。在做这件事之前,一定要充分理解其中的含义。

我认为授予管理员同意是一个需要执行的单独步骤:https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent#construct-授予租户范围管理员同意的url

最新更新