Compartilhar via


Solucionando problemas dos limites de permissões configurados

A coleção RequiredResourceAccess (RRA) em um objeto de aplicativo contém todas as permissões de API configuradas que um aplicativo requer para sua solicitação de consentimento padrão. Essa coleção tem vários limites, dependendo de a quais tipos de identidade o aplicativo dá suporte. Para obter mais informações sobre os limites de tipos de conta com suporte, confira o artigo Diferenças de validação por tipos de conta com suporte (signInAudience).

Os limites de permissões máximas foram atualizados em maio de 2022, portanto, alguns aplicativos podem ter mais permissões em sua RRA do que agora são permitidos. Além disso, aplicativos que alteram os tipos de conta com suporte após a configuração de permissões podem exceder os limites da nova configuração. Quando os aplicativos excedem o limite de permissões configurado, nenhuma nova permissão pode ser adicionada até que o número de permissões na coleção RequiredResourceAccess volte a estar dentro dos limites.

Este documento oferece informações adicionais e etapas de solução de problemas para resolver esse problema.

Identificando quando um aplicativo excedeu os limites de RequiredResourceAccess

Em geral, todos os aplicativos com mais de 400 permissões excederam os limites de configuração. Os aplicativos também poderão estar sujeitos a limites mais baixos se derem suporte à entrada para MSAs (contas Microsoft) pessoais. Um aplicativo que excedeu os limites de permissão receberá o seguinte erro ao tentar adicionar mais permissões no portal do Azure:

Failed to save permissions for <AppName>. This configuration exceeds the global application object limit. Remove some items and retry your request.

Etapas de resolução

Se o aplicativo não for mais necessário, a primeira opção que você deverá considerar é excluir totalmente o registro do aplicativo. (Você poderá restaurar aplicativos excluídos recentemente caso descubra logo depois que ele ainda era necessário.)

Se você ainda precisar do aplicativo ou não tiver certeza, as seguintes etapas ajudarão a resolver esse problema:

  1. Remover permissões duplicadas. Em alguns casos, a mesma permissão é listada várias vezes. Examine as permissões necessárias e remova as que são listadas duas ou mais vezes. Consulte o script relacionado do PowerShell na seção recursos adicionais deste artigo.
  2. Remova permissões não utilizadas. Examine as permissões exigidas pelo aplicativo e compare-as com o que o aplicativo ou serviço faz. Remova as permissões configuradas no registro do aplicativo, mas que o aplicativo ou o serviço não exigem. Para obter mais informações sobre como examinar permissões, consulte Examinar permissões de aplicativo
  3. Remova permissões redundantes. Em muitas APIs, incluindo o Microsoft Graph, algumas permissões não são necessárias quando outras mais privilegiadas são incluídas. Por exemplo, a permissão User.Read.All (ler todos os usuários) do Microsoft Graph não é necessária quando um aplicativo também tem User.ReadWrite.All (ler, criar e atualizar todos os usuários). Para saber mais sobre as permissões do Microsoft Graph, confira Referência de permissões do Microsoft Graph.

Perguntas frequentes (FAQ)

Por que a Microsoft revisou o limite de permissões totais?

Esse limite é importante por duas razões:

  • Para ajudar a impedir que um aplicativo seja configurado para exigir mais permissões do que podem ser concedidas durante o consentimento.
  • Para manter o tamanho total do registro do aplicativo dentro dos limites necessários para estabilidade e desempenho da plataforma de armazenamento subjacente.

O que acontecerá se eu não fizer nada?

Se seu aplicativo exceder o limite total de permissões, você não poderá mais aumentar o número total de permissões necessárias para ele.

O limite altera quantas permissões meu aplicativo pode receber?

Não. Esse limite afeta apenas a lista de permissões de API solicitadas configuradas no registro do aplicativo. Isso é diferente da lista de permissões que foram concedidas ao seu aplicativo.

Mesmo que não esteja listada na lista de permissões de API necessárias, uma permissão delegada ainda poderá ser solicitada dinamicamente por um aplicativo. As permissões delegadas e as funções de aplicativo (permissões de aplicativo) também podem ser concedidas diretamente, usando a API do Microsoft Graph ou o PowerShell do Microsoft Graph.

O limite pode ser aumentado para meu aplicativo?

Não, o limite não pode ser aumentado para aplicativos nem organizações individuais.

Há outros limites na lista de permissões de API necessárias?

Sim. Os limites podem variar dependendo dos tipos de conta com suporte para o aplicativo. Aplicativos que dão suporte a contas Microsoft pessoais para entrada (por exemplo, Outlook.com, Hotmail.com, Xbox Live) geralmente têm limites mais baixos. Confira Diferenças de validação por tipos de conta com suporte para saber mais.

Recursos adicionais

Use o script do PowerShell a seguir para remover as permissões duplicadas dos registros do aplicativo.

<#
.SYNOPSIS
    Remove duplicate required API permissions from an app registration's required API permission list.
.DESCRIPTION
    This script ensures all API permissions listed in a Microsoft identity platform's app registration are only listed once,
    removing any duplicates it finds. This script requires the Microsoft.Graph.Applications PowerShell module.
.EXAMPLE
     Get-MgApplication -Filter "appId eq '00001111-aaaa-2222-bbbb-3333cccc4444'" | .\Deduplicate_RequiredResourceAccess.ps1"
.EXAMPLE
     $apps = Get-MgApplication -Filter "startswith(displayName,'Test_app')"
     $apps | .\Deduplicate_RequiredResourceAccess.ps1
#>

#Requires -Modules Microsoft.Graph.Applications

[CmdletBinding()]
param(
    [Parameter(ValueFromPipeline = $true)]
    $App
)

begin {
    $context = Get-MgContext
    if (-not $context) {
        throw ("You must connect to Microsoft Graph PowerShell first, with sufficient permissions " +
               "to manage Application objects. For example: Connect-MgGraph -Scopes ""Application.ReadWrite.All""")
    }
}

process {
    
    # Build the unique list of required API permissions for each required API
    $originalCount = 0
    $tempRras = @{}
    foreach ($rra in $App.RequiredResourceAccess) {
        if (-not $tempRras.ContainsKey($rra.ResourceAppId)) {
            $tempRras[$rra.ResourceAppId] = @{"Scope" = @{}; "Role" = @{}};
        }
        foreach ($ra in $rra.ResourceAccess) {
            if ($tempRras[$rra.ResourceAppId][$ra.Type].ContainsKey($ra.Id)) {
                # Skip duplicate required API permission
            } else {
                $tempRras[$rra.ResourceAppId][$ra.Type][$ra.Id] = $true
            }
            $originalCount++
        }
    }
    
    # Now that we have the unique set of required API permissions, iterate over all the keys to build the final requiredResourceAccess structure
    $deduplicatedCount = 0
    $finalRras = @($tempRras.Keys) | ForEach-Object {
        $resourceAppId = $_
        @{
            "resourceAppId" = $resourceAppId
            "resourceAccess" = @(@("Scope", "Role") | ForEach-Object { 
                $type = $_
                $tempRras[$resourceAppId][$type].Keys | ForEach-Object { 
                    $deduplicatedCount++;
                    @{"type" = $type; "id" = $_}
                }
            })
        }
    }
    
    $countDifference = $originalCount - $deduplicatedCount
    if ($countDifference) {
        Write-Host "Removing $($countDifference) duplicate entries in RequiredResourceAccess for '$($App.DisplayName)' (AppId: $($App.AppId))"
        Update-MgApplication -ApplicationId $App.Id -RequiredResourceAccess $finalRras
    } else {
        Write-Host "No updates necessary for '$($App.DisplayName)' (AppId: $($App.AppId))"
    }
}

Saiba mais