Conceder ou revogar permissões de API de forma programática
Artigo
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
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.ServicePrincipals.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Filter = "displayName eq 'Microsoft Graph'";
requestConfiguration.QueryParameters.Select = new string []{ "id","displayName","appId","appRoles" };
});
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc service-principals list --filter "displayName eq 'Microsoft Graph'" --select "id,displayName,appId,appRoles"
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
ServicePrincipalCollectionResponse result = graphClient.servicePrincipals().get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "displayName eq 'Microsoft Graph'";
requestConfiguration.queryParameters.select = new String []{"id", "displayName", "appId", "appRoles"};
});
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
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new AppRoleAssignment
{
PrincipalId = Guid.Parse("b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94"),
ResourceId = Guid.Parse("7ea9e944-71ce-443d-811c-71e8047b557a"),
AppRoleId = Guid.Parse("df021288-bdef-4463-88db-98f22de89214"),
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.ServicePrincipals["{servicePrincipal-id}"].AppRoleAssignedTo.PostAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc service-principals app-role-assigned-to create --service-principal-id {servicePrincipal-id} --body '{\
"principalId": "b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94",\
"resourceId": "7ea9e944-71ce-443d-811c-71e8047b557a",\
"appRoleId": "df021288-bdef-4463-88db-98f22de89214"\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
AppRoleAssignment appRoleAssignment = new AppRoleAssignment();
appRoleAssignment.setPrincipalId(UUID.fromString("b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94"));
appRoleAssignment.setResourceId(UUID.fromString("7ea9e944-71ce-443d-811c-71e8047b557a"));
appRoleAssignment.setAppRoleId(UUID.fromString("df021288-bdef-4463-88db-98f22de89214"));
AppRoleAssignment result = graphClient.servicePrincipals().byServicePrincipalId("{servicePrincipal-id}").appRoleAssignedTo().post(appRoleAssignment);
<?php
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Graph\Generated\Models\AppRoleAssignment;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new AppRoleAssignment();
$requestBody->setPrincipalId('b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94');
$requestBody->setResourceId('7ea9e944-71ce-443d-811c-71e8047b557a');
$requestBody->setAppRoleId('df021288-bdef-4463-88db-98f22de89214');
$result = $graphServiceClient->servicePrincipals()->byServicePrincipalId('servicePrincipal-id')->appRoleAssignedTo()->post($requestBody)->wait();
GET https://graph.microsoft.com/v1.0/servicePrincipals/7ea9e944-71ce-443d-811c-71e8047b557a/appRoleAssignedTo
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.ServicePrincipals["{servicePrincipal-id}"].AppRoleAssignedTo.GetAsync();
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
AppRoleAssignmentCollectionResponse result = graphClient.servicePrincipals().byServicePrincipalId("{servicePrincipal-id}").appRoleAssignedTo().get();
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.
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
await graphClient.ServicePrincipals["{servicePrincipal-id}"].AppRoleAssignedTo["{appRoleAssignment-id}"].DeleteAsync();
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc service-principals app-role-assigned-to delete --service-principal-id {servicePrincipal-id} --app-role-assignment-id {appRoleAssignment-id}
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
graphClient.servicePrincipals().byServicePrincipalId("{servicePrincipal-id}").appRoleAssignedTo().byAppRoleAssignmentId("{appRoleAssignment-id}").delete();
<?php
use Microsoft\Graph\GraphServiceClient;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$graphServiceClient->servicePrincipals()->byServicePrincipalId('servicePrincipal-id')->appRoleAssignedTo()->byAppRoleAssignmentId('appRoleAssignment-id')->delete()->wait();
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
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.ServicePrincipals.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Filter = "displayName eq 'Microsoft Graph'";
requestConfiguration.QueryParameters.Select = new string []{ "id","displayName","appId","oauth2PermissionScopes" };
});
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc service-principals list --filter "displayName eq 'Microsoft Graph'" --select "id,displayName,appId,oauth2PermissionScopes"
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
ServicePrincipalCollectionResponse result = graphClient.servicePrincipals().get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "displayName eq 'Microsoft Graph'";
requestConfiguration.queryParameters.select = new String []{"id", "displayName", "appId", "oauth2PermissionScopes"};
});
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.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new OAuth2PermissionGrant
{
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",
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Oauth2PermissionGrants.PostAsync(requestBody);
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
OAuth2PermissionGrant oAuth2PermissionGrant = new OAuth2PermissionGrant();
oAuth2PermissionGrant.setClientId("b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94");
oAuth2PermissionGrant.setConsentType("Principal");
oAuth2PermissionGrant.setResourceId("7ea9e944-71ce-443d-811c-71e8047b557a");
oAuth2PermissionGrant.setPrincipalId("3fbd929d-8c56-4462-851e-0eb9a7b3a2a5");
oAuth2PermissionGrant.setScope("User.Read.All Group.Read.All");
OAuth2PermissionGrant result = graphClient.oauth2PermissionGrants().post(oAuth2PermissionGrant);
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:
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.
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'
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Oauth2PermissionGrants.GetAsync((requestConfiguration) =>
{
requestConfiguration.QueryParameters.Filter = "clientId eq 'b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94' and principalId eq '3fbd929d-8c56-4462-851e-0eb9a7b3a2a5' and consentType eq 'Principal'";
});
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc oauth2-permission-grants list --filter "clientId eq 'b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94' and principalId eq '3fbd929d-8c56-4462-851e-0eb9a7b3a2a5' and consentType eq 'Principal'"
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
OAuth2PermissionGrantCollectionResponse result = graphClient.oauth2PermissionGrants().get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "clientId eq 'b0d9b9e3-0ecf-4bfd-8dab-9273dd055a94' and principalId eq '3fbd929d-8c56-4462-851e-0eb9a7b3a2a5' and consentType eq 'Principal'";
});
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.
// Code snippets are only available for the latest version. Current version is 5.x
// Dependencies
using Microsoft.Graph.Models;
var requestBody = new OAuth2PermissionGrant
{
Scope = "User.Read.All",
};
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
var result = await graphClient.Oauth2PermissionGrants["{oAuth2PermissionGrant-id}"].PatchAsync(requestBody);
// THE CLI IS IN PREVIEW. NON-PRODUCTION USE ONLY
mgc oauth2-permission-grants patch --o-auth2-permission-grant-id {oAuth2PermissionGrant-id} --body '{\
"scope": "User.Read.All"\
}\
'
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
OAuth2PermissionGrant oAuth2PermissionGrant = new OAuth2PermissionGrant();
oAuth2PermissionGrant.setScope("User.Read.All");
OAuth2PermissionGrant result = graphClient.oauth2PermissionGrants().byOAuth2PermissionGrantId("{oAuth2PermissionGrant-id}").patch(oAuth2PermissionGrant);
<?php
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Graph\Generated\Models\OAuth2PermissionGrant;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$requestBody = new OAuth2PermissionGrant();
$requestBody->setScope('User.Read.All');
$result = $graphServiceClient->oauth2PermissionGrants()->byOAuth2PermissionGrantId('oAuth2PermissionGrant-id')->patch($requestBody)->wait();
// Code snippets are only available for the latest version. Current version is 5.x
// To initialize your graphClient, see https://learn.microsoft.com/en-us/graph/sdks/create-client?from=snippets&tabs=csharp
await graphClient.Oauth2PermissionGrants["{oAuth2PermissionGrant-id}"].DeleteAsync();
// Code snippets are only available for the latest version. Current version is 6.x
GraphServiceClient graphClient = new GraphServiceClient(requestAdapter);
graphClient.oauth2PermissionGrants().byOAuth2PermissionGrantId("{oAuth2PermissionGrant-id}").delete();
<?php
use Microsoft\Graph\GraphServiceClient;
$graphServiceClient = new GraphServiceClient($tokenRequestContext, $scopes);
$graphServiceClient->oauth2PermissionGrants()->byOAuth2PermissionGrantId('oAuth2PermissionGrant-id')->delete()->wait();
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.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulte https://aka.ms/ContentUserFeedback.