Как вы можете определить все разрешения, предоставленные приложению с помощью Microsoft Graph и C #?

#c# #microsoft-graph-api

#c# #microsoft-graph-api

Вопрос:

Я искал в Интернете и SO и нашел только один ответ на тот же вопрос; но это было специфично для программирования на Android, и я не видел четкого способа перенести его на C #.

Я хотел бы знать, как это можно сделать с помощью C #. Фрагменты кода или реальный пример были бы великолепны.

В принципе, у меня есть зарегистрированное приложение в Azure, и мне нужно знать, как получить все разрешения, предоставленные приложению с помощью кода.

Это будет включать как делегированные, так и специфические для приложения разрешения.

Как бы это сделать? Связанная ссылка тоже была бы хороша, но я ничего не смог найти. В списке перечислены REST API для поиска разрешений для групп, пользователей, папок и т. Д. Ничто из того, что я нашел, не показывает API для перечисления разрешений приложений.

Ответ №1:

Поддерживается получение разрешений приложения через GET /applications/{id} конечную точку, но только в /beta версии на данный момент

API-интерфейсы в версии / beta в Microsoft Graph могут быть изменены. Использование этих API в производственных приложениях не поддерживается.

Подробные сведения

Конечная GET /applications/{id}/requiredResourceAccess точка возвращает RequiredResourceAccess коллекцию, которая:

ресурсы, к которым требуется доступ для этого приложения, и набор областей разрешений OAuth и ролей приложения, которые ему нужны для каждого из этих ресурсов

Пример C # (через msgraph-sdk-dotnet библиотеку)

 var requestUrl = $"{graphClient.BaseUrl}/applications/{id}/requiredResourceAccess";
var message = new HttpRequestMessage(HttpMethod.Get, requestUrl);
await graphClient.AuthenticationProvider.AuthenticateRequestAsync(message);
var response = await graphClient.HttpProvider.SendAsync(message);
var content = await response.Content.ReadAsStringAsync();
var resourceAccesses = JsonConvert.DeserializeObject<List<RequiredResourceAccess>>(JObject.Parse(content)["value"].ToString());
  

где

 [JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class RequiredResourceAccess
{
    /// <summary>
    /// The unique identifier for the resource that the application requires access to.
    /// This should be equal to the appId declared on the target resource application
    /// </summary>
    [JsonProperty("resourceAppId")]
    public string ResourceAppId { get; set; }


    /// <summary>
    /// The list of OAuth2.0 permission scopes and app roles that the application requires from the specified resource.
    /// </summary>
    [JsonProperty("resourceAccess")]
    public List<ResourceAccess> ResourceAccess { get; set; }
}

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class ResourceAccess
{
    /// <summary>
    /// The unique identifier for one of the oAuth2Permission or appRole instances that the resource application exposes.
    /// </summary>
    [JsonProperty("id")]
    public string Id { get; set; }

    /// <summary>
    /// Specifies whether the id property references an oAuth2Permission or an appRole. Possible values are "scope" or "role".
    /// </summary>
    [JsonProperty("type")]
    public string Type { get; set; }
}    
  

Поскольку предоставленная конечная точка возвращает результат в следующем формате:

 {
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#applications('e7de2f36-a0c1-4573-91bd-c854eaff0852')/requiredResourceAccess",
    "value": [
        {
            "resourceAppId": "00000003-0000-0000-c000-000000000000",
            "resourceAccess": [
                {
                    "id": "1ec239c2-d7c9-4623-a91a-a9775856bb36",
                    "type": "Scope"
                },
                //... 
            ]
        },
        {
            "resourceAppId": "00000003-0000-0ff1-ce00-000000000000",
            "resourceAccess": [
                {
                    "id": "d13f72ca-a275-4b96-b789-48ebcc4da984",
                    "type": "Role"
                }
            ]
        }
    ]
}
  

возможно, вам захочется получить сведения о ресурсе, к которому приложению требуется доступ, и областях разрешений (например, API и имя разрешения, которое отображается на странице разрешений API портала Azure)

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

В этом отношении можно использовать GET /servicePrincipals конечную точку.

Пример:

Для ресурса с идентификатором 00000003-0000-0000-c000-000000000000 запрос https://graph.microsoft.com/beta/servicePrincipals?filter=appId eq '00000003-0000-0000-c000-000000000000' возвращает следующий ответ:

 {
    "@odata.context": "https://graph.microsoft.com/beta/$metadata#servicePrincipals",
    "value": [
        {
            "id": "414583a1-9d42-4309-aa10-3bf73ff7f95e",
            "appDisplayName": "Microsoft Graph",
            "appId": "00000003-0000-0000-c000-000000000000",
             //...
            "publishedPermissionScopes": [
                 {
                    "adminConsentDescription": "Allows the app to create, read, update, and delete events in user calendars. ",
                    "adminConsentDisplayName": "Have full access to user calendars ",
                    "id": "1ec239c2-d7c9-4623-a91a-a9775856bb36",
                    "isEnabled": true,
                    "type": "User",
                    "userConsentDescription": "Allows the app to read, update, create and delete events in your calendars. ",
                    "userConsentDisplayName": "Have full access to your calendars  ",
                    "value": "Calendars.ReadWrite"
                },
                //...
             ]
          }
     ]
}  
  

который содержит сведения о ресурсах (например appDisplayName:Microsoft Graph ) и областях разрешений (например value:Calendars.ReadWrite )

Комментарии:

1. Спасибо! Это идеально.