Conceder ou revogar permissões de API de forma programática

Quando você concede permissões de API a um aplicativo cliente em Microsoft Entra ID, as concessões de permissão são registradas como objetos que podem ser acessados, atualizados ou excluídos como seus dados. Usar o Microsoft Graph para criar diretamente concessões de permissão é uma alternativa programática ao consentimento interativo e pode ser útil para cenários de automação, gerenciamento em massa ou outras operações personalizadas em sua organização.

Neste guia, você aprenderá a conceder e revogar funções de aplicativo para um aplicativo usando o Microsoft Graph. As funções de aplicativo, também chamadas de permissões de aplicativo ou permissões de acesso direto, permitem que um aplicativo chame uma API com sua própria identidade.

Cuidado

Cuidado! As permissões concedidas programaticamente não estão sujeitas a revisão ou confirmação. Eles entrarão em vigor imediatamente.

Pré-requisitos

Para concluir estas instruções, você precisa dos seguintes recursos e privilégios:

  • Um locatário Microsoft Entra funcionando.
  • Você executará as solicitações neste artigo como usuário. Você deve concluir as seguintes etapas:
    • Entre em um cliente de API, como o Graph Explorer como um usuário com privilégios para criar aplicativos no locatário.
    • No aplicativo ao qual você entrou, concorde com as permissões Application.Read.All e AppRoleAssignment.ReadWrite.All delegadas em nome do usuário conectado. Você não precisa consentir em nome de sua organização.
    • Obtenha a ID do objeto da entidade de serviço cliente à qual você concederá funções de aplicativo. Neste artigo, a entidade de serviço do cliente é identificada pela ID b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94. No centro de administração do Microsoft Entra, acesse Aplicativos da Empresa deAplicativos> de Identidade> Aplicativosempresariais>Aplicativos para localizar a entidade de serviço do cliente. Selecione-o e, na página Visão geral , copie o valor da ID do objeto.

Cuidado

Os aplicativos que receberam a permissão AppRoleAssignment.ReadWrite.All só devem ser acessados pelos usuários apropriados.

Etapa 1: obter os appRoles da entidade de serviço de recurso

Antes de conceder funções de aplicativo, primeiro você deve identificar as funções de aplicativo a serem concedidas e a entidade de serviço de recurso que expõe as funções do aplicativo. As funções de aplicativo são definidas no objeto appRoles de uma entidade de serviço. Neste artigo, você usará a entidade de serviço do Microsoft Graph no locatário como sua entidade de serviço de recursos.

Solicitação

A solicitação a seguir recupera as funções de aplicativo definidas pela entidade de serviço do Microsoft Graph no locatário.

GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,appRoles

Resposta

O objeto a seguir é um exemplo da resposta.

Observação: o objeto de resposta mostrado aqui pode ser encurtado para legibilidade.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(id,displayName,appId,appRoles)",
    "value": [
        {
            "id": "7ea9e944-71ce-443d-811c-71e8047b557a",
            "displayName": "Microsoft Graph",
            "appId": "00000003-0000-0000-c000-000000000000",
            "appRoles": [
                {
                    "allowedMemberTypes": [
                        "Application"
                    ],
                    "description": "Allows the app to read user profiles without a signed in user.",
                    "displayName": "Read all users' full profiles",
                    "id": "df021288-bdef-4463-88db-98f22de89214",
                    "isEnabled": true,
                    "origin": "Application",
                    "value": "User.Read.All"
                }
            ]
        }
    ]
}

Etapa 2: conceder uma função de aplicativo a uma entidade de serviço do cliente

Nesta etapa, você concederá ao aplicativo uma função de aplicativo exposta pelo Microsoft Graph, criando assim uma atribuição de função de aplicativo. Na Etapa 1, a ID do objeto do Microsoft Graph é 7ea9e944-71ce-443d-811c-71e8047b557a e a função User.Read.All de aplicativo é identificada pela ID df021288-bdef-4463-88db-98f22de89214.

Solicitação

A solicitação a seguir concede ao seu aplicativo cliente (a entidade de ID b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94) uma função de aplicativo de ID df021288-bdef-4463-88db-98f22de89214 exposta por uma entidade de serviço de recurso da ID 7ea9e944-71ce-443d-811c-71e8047b557a.

Observação

Se você estiver usando o SDK do Python, importe as seguintes bibliotecas:

from msgraph.generated.models.app_role_assignment import AppRoleAssignment
from msgraph.generated.models.service_principal import ServicePrincipal
POST https://graph.microsoft.com/v1.0/servicePrincipals/7ea9e944-71ce-443d-811c-71e8047b557a/appRoleAssignedTo
Content-Type: application/json

{
    "principalId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
    "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",
    "appRoleId": "df021288-bdef-4463-88db-98f22de89214"
}

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('7ea9e944-71ce-443d-811c-71e8047b557a')/appRoleAssignedTo/$entity",
    "id": "47nZsM8O_UuNq5Jz3QValCxBBiqJea9Drc9CMK4Ru_M",
    "deletedDateTime": null,
    "appRoleId": "df021288-bdef-4463-88db-98f22de89214",
    "createdDateTime": "2022-05-18T15:37:21.8215423Z",
    "principalDisplayName": "My application",
    "principalId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
    "principalType": "ServicePrincipal",
    "resourceDisplayName": "Microsoft Graph",
    "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a"
}

Confirmar a atribuição da função de aplicativo

Para confirmar todas as entidades com atribuições de função para a entidade de serviço de recurso, execute a solicitação a seguir.

Solicitação

GET https://graph.microsoft.com/v1.0/servicePrincipals/7ea9e944-71ce-443d-811c-71e8047b557a/appRoleAssignedTo

Resposta

O objeto de resposta inclui uma coleção de atribuições de função de aplicativo para sua entidade de serviço de recurso e inclui a atribuição de função de aplicativo que você criou usando a solicitação POST.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals('7ea9e944-71ce-443d-811c-71e8047b557a')/appRoleAssignedTo",
    "value": [
        {
            "id": "47nZsM8O_UuNq5Jz3QValCxBBiqJea9Drc9CMK4Ru_M",
            "deletedDateTime": null,
            "appRoleId": "df021288-bdef-4463-88db-98f22de89214",
            "createdDateTime": "2022-05-18T15:37:21.8997216Z",
            "principalDisplayName": "My application",
            "principalId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
            "principalType": "ServicePrincipal",
            "resourceDisplayName": "Microsoft Graph",
            "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a"
        }
    ]
}

Etapa 3: revogar uma atribuição de função de aplicativo de uma entidade de serviço do cliente

Solicitação

DELETE https://graph.microsoft.com/v1.0/servicePrincipals/7ea9e944-71ce-443d-811c-71e8047b557a/appRoleAssignedTo/47nZsM8O_UuNq5Jz3QValCxBBiqJea9Drc9CMK4Ru_M

Resposta

HTTP/1.1 204 No Content

Conclusão

Você aprendeu a gerenciar concessões de função de aplicativo para uma entidade de serviço. Esse método de concessão de permissões usando o Microsoft Graph é um consentimento interativo alternativo e deve ser usado com cuidado.

Neste guia, você aprenderá a conceder e revogar permissões delegadas para um aplicativo usando o Microsoft Graph. As permissões delegadas, também chamadas de escopos ou permissões OAuth2, permitem que um aplicativo chame uma API em nome de um usuário conectado.

Cuidado

Cuidado! As permissões concedidas programaticamente não estão sujeitas a revisão ou confirmação. Eles entrarão em vigor imediatamente.

Pré-requisitos

Para concluir estas instruções, você precisa dos seguintes recursos e privilégios:

  • Um locatário Microsoft Entra funcionando.
  • Você executará as solicitações neste artigo como usuário. Você deve concluir as seguintes etapas:
    • Entre em um cliente de API, como o Graph Explorer como um usuário com privilégios para criar aplicativos no locatário.
    • No aplicativo ao qual você entrou, consenta com as permissões Application.Read.All, DelegatedPermissionGrant.ReadWrite.All delegadas em nome do usuário conectado. Você não precisa consentir em nome de sua organização.
    • Obtenha a ID do objeto da entidade de serviço do cliente à qual você concederá permissões delegadas em nome de um usuário. Neste artigo, a entidade de serviço do cliente é identificada pela ID b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94.

Cuidado

Os aplicativos que receberam a permissão DelegatedPermissionGrant.ReadWrite.All só devem ser acessados pelos usuários apropriados.

Etapa 1: Obter as permissões delegadas da entidade de serviço de recurso

Antes de conceder permissões delegadas, primeiro você deve identificar as permissões delegadas para conceder e a entidade de serviço de recurso que expõe as permissões delegadas. As permissões delegadas são definidas no objeto oauth2PermissionScopes de uma entidade de serviço. Neste artigo, você usará a entidade de serviço do Microsoft Graph no locatário como sua entidade de serviço de recursos.

Solicitação

A solicitação a seguir recupera as permissões delegadas definidas pela entidade de serviço do Microsoft Graph no locatário.

GET https://graph.microsoft.com/v1.0/servicePrincipals?$filter=displayName eq 'Microsoft Graph'&$select=id,displayName,appId,oauth2PermissionScopes

Resposta

O objeto a seguir é um exemplo da resposta.

Observação: o objeto de resposta mostrado aqui pode ser encurtado para legibilidade.

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#servicePrincipals(id,displayName,appId,oauth2PermissionScopes)",
    "value": [
        {
            "id": "7ea9e944-71ce-443d-811c-71e8047b557a",
            "displayName": "Microsoft Graph",
            "appId": "00000003-0000-0000-c000-000000000000",
            "oauth2PermissionScopes": [
                {
                    "adminConsentDescription": "Allows the app to read the full set of profile properties, reports, and managers of other users in your organization, on behalf of the signed-in user.",
                    "adminConsentDisplayName": "Read all users' full profiles",
                    "id": "a154be20-db9c-4678-8ab7-66f6cc099a59",
                    "isEnabled": true,
                    "type": "Admin",
                    "userConsentDescription": "Allows the app to read the full set of profile properties, reports, and managers of other users in your organization, on your behalf.",
                    "userConsentDisplayName": "Read all users' full profiles",
                    "value": "User.Read.All"
                },
                {
                    "adminConsentDescription": "Allows the app to list groups, and to read their properties and all group memberships on behalf of the signed-in user.  Also allows the app to read calendar, conversations, files, and other group content for all groups the signed-in user can access. ",
                    "adminConsentDisplayName": "Read all groups",
                    "id": "5f8c59db-677d-491f-a6b8-5f174b11ec1d",
                    "isEnabled": true,
                    "type": "Admin",
                    "userConsentDescription": "Allows the app to list groups, and to read their properties and all group memberships on your behalf.  Also allows the app to read calendar, conversations, files, and other group content for all groups you can access.  ",
                    "userConsentDisplayName": "Read all groups",
                    "value": "Group.Read.All"
                }                
            ]
        }
    ]
}

Etapa 2: conceder uma permissão delegada à entidade de serviço cliente em nome de um usuário

Solicitação

Nesta etapa, você concederá ao seu aplicativo, em nome de um usuário, uma permissão delegada exposta pelo Microsoft Graph, criando assim uma concessão de permissão delegada.

  • Na Etapa 1, a ID do objeto do Microsoft Graph no locatário é 7ea9e944-71ce-443d-811c-71e8047b557a
  • As permissões User.Read.All delegadas e Group.Read.All são identificadas pelas IDs globalmente exclusivas a154be20-db9c-4678-8ab7-66f6cc099a59 e 5f8c59db-677d-491f-a6b8-5f174b11ec1d , respectivamente.
  • A entidade de segurança é um usuário identificado pela ID 3fbd929d-8c56-4462-851e-0eb9a7b3a2a5.
  • A entidade de serviço do cliente é identificada pela ID b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94. Essa é a ID do objeto da entidade de serviço e não seu appId.
POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants
Content-Type: application/json

{
    "clientId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
    "consentType": "Principal",
    "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",
    "principalId": "3fbd929d-8c56-4462-851e-0eb9a7b3a2a5",
    "scope": "User.Read.All Group.Read.All"
}

Embora a solicitação anterior conceda consentimento em nome de um único usuário, você pode optar por conceder o consentimento em nome de todos os usuários do locatário. O corpo da solicitação é semelhante ao corpo da solicitação anterior, exceto com as seguintes alterações:

  • O consentType é AllPrincipals, indicando que você está consentindo em nome de todos os usuários no locatário.
  • A propriedade principalId não é fornecida ou pode ser null.

Um órgão de solicitação de exemplo para conceder consentimento em nome de todos os usuários é o seguinte:

POST https://graph.microsoft.com/v1.0/oauth2PermissionGrants
Content-Type: application/json

{
    "clientId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
    "consentType": "AllPrincipals",
    "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",
    "scope": "User.Read.All Group.Read.All"
}

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#oauth2PermissionGrants/$entity",
    "clientId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
    "consentType": "Principal",
    "id": "47nZsM8O_UuNq5Jz3QValETpqX7OcT1EgRxx6AR7VXqdkr0_VoxiRIUeDrmns6Kl",
    "principalId": "3fbd929d-8c56-4462-851e-0eb9a7b3a2a5",
    "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",
    "scope": "User.Read.All Group.Read.All"
}

Se você concedeu consentimento para todos os usuários no locatário, o consentType no objeto de resposta seria AllPrincipals, e o principalId seria null.

Confirmar a concessão de permissão

Para confirmar as permissões delegadas atribuídas à entidade de serviço em nome do usuário, execute a solicitação a seguir.

Solicitação

GET https://graph.microsoft.com/v1.0/oauth2PermissionGrants?$filter=clientId eq 'b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94' and principalId eq '3fbd929d-8c56-4462-851e-0eb9a7b3a2a5' and consentType eq 'Principal'

Resposta

HTTP/1.1 201 Created
Content-type: application/json

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#oauth2PermissionGrants",
    "value": [
        {
            "clientId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",
            "consentType": "Principal",
            "id": "47nZsM8O_UuNq5Jz3QValETpqX7OcT1EgRxx6AR7VXqdkr0_VoxiRIUeDrmns6Kl",
            "principalId": "3fbd929d-8c56-4462-851e-0eb9a7b3a2a5",
            "resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",
            "scope": "User.Read.All Group.Read.All"
        }
    ]
}

Etapa 3: revogar permissões delegadas concedidas a uma entidade de serviço em nome de um usuário [Opcional]

Se uma entidade de serviço tiver recebido várias concessões de permissão delegada em nome de um usuário, você poderá optar por revogar concessões específicas ou todas as concessões. Use esse método para remover e revogar o consentimento das permissões delegadas atribuídas ao Graph Explorer.

  • Para revogar uma ou algumas concessões, execute uma solicitação PATCH no objeto oauth2PermissionGrant e especifique apenas as permissões delegadas para manter no parâmetro de escopo .
  • Para revogar todas as concessões, execute uma solicitação DELETE no objeto oauth2PermissionGrant.

Solicitação

A solicitação a seguir revoga todas as concessões de permissão e retém apenas a concessão de User.Read.All permissão. As permissões são removidas e o consentimento que foi concedido anteriormente é revogado.

PATCH https://graph.microsoft.com/v1.0/oauth2PermissionGrants/47nZsM8O_UuNq5Jz3QValETpqX7OcT1EgRxx6AR7VXqdkr0_VoxiRIUeDrmns6Kl
Content-Type: application/json

{
    "scope": "User.Read.All"
}

Resposta

HTTP/1.1 204 No Content

Solicitação

A solicitação a seguir revoga todas as concessões de permissão para uma entidade de serviço em nome de um usuário.

DELETE https://graph.microsoft.com/v1.0/oauth2PermissionGrants/47nZsM8O_UuNq5Jz3QValETpqX7OcT1EgRxx6AR7VXqdkr0_VoxiRIUeDrmns6Kl

Resposta

HTTP/1.1 204 No Content

Conclusão

Você concedeu permissões delegadas (ou escopos) a uma entidade de serviço. Esse método de concessão de permissões usando o Microsoft Graph é uma alternativa ao consentimento interativo e deve ser usado com cuidado.