Solución de problemas de límite de permisos configurados

La colección RequiredResourceAccess (RRA) de un objeto de aplicación contiene todos los permisos de API configurados que requiere una aplicación para su solicitud de consentimiento predeterminada. Esta colección tiene varios límites en función de los tipos de identidades que admita la aplicación. Para más información sobre los límites para los tipos de cuenta admitidos, consulte Diferencias de validación por tipos de cuenta compatibles.

Los límites de permisos máximos se actualizaron en mayo de 2022, por lo que es posible que algunas aplicaciones tengan más permisos en su RRA de los que ahora se permiten. Además, las aplicaciones que cambian sus tipos de cuenta admitidos después de configurar los permisos pueden superar los límites de la nueva configuración. Cuando las aplicaciones superan el límite de permisos configurados, no se pueden agregar nuevos permisos hasta que se reduzca el número de permisos de la colección RequiredResourceAccess al permitido.

En este documento se ofrece información adicional y pasos de solución de problemas para resolver este caso.

Identificación de cuándo una aplicación ha superado los límites de RequiredResourceAccess

En general, todas las aplicaciones con más de 400 permisos superan los límites de configuración. Las aplicaciones también pueden estar sujetas a límites menores si admiten el inicio de sesión para cuentas de Microsoft personales (MSA). Si supera los límites de permisos, la aplicación recibe el siguiente error al intentar agregar más permisos en Azure Portal:

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

Pasos de resolución

Si la aplicación ya no es necesaria, la primera opción que debe considerar es eliminar completamente su registro. (Las aplicaciones eliminadas recientemente se pueden restaurar si poco después se descubre que aún eran necesarias).

Si todavía necesita la aplicación o no está seguro, los pasos siguientes le ayudarán a resolver este problema:

  1. Quite los permisos duplicados. En algunos casos, el mismo permiso aparece varias veces. Revise los permisos necesarios y quite los permisos enumerados dos o más veces. Consulte el script de PowerShell relacionado en la sección de recursos adicionales de este artículo.
  2. Quite los permisos sin usar. Revise los permisos que requiere la aplicación y compárelos con lo que hace la aplicación o el servicio. Quite los permisos configurados en el registro de la aplicación, pero que la aplicación o el servicio no necesiten. Para más información sobre cómo revisar los permisos, consulte Revisión de los permisos de la aplicación.
  3. Quite los permisos redundantes. En muchas API, incluida Microsoft Graph, algunos permisos no son necesarios cuando se incluyen otros permisos con más privilegios. Por ejemplo, el permiso de Microsoft Graph User.Read.All (leer todos los usuarios) no es necesario cuando la aplicación también tiene User.ReadWrite.All (leer, crear y actualizar todos los usuarios). Para más información sobre los permisos de Microsoft Graph, consulte Referencia de los permisos de Microsoft Graph.

Preguntas más frecuentes

¿Por qué Microsoft ha revisado el límite de permisos totales?

Este límite es importante por dos motivos:

  • Ayuda a evitar que una aplicación se configure para requerir más permisos de los que se pueden conceder durante el consentimiento.
  • Mantiene el tamaño total del registro de la aplicación dentro de los límites necesarios para la estabilidad y el rendimiento de la plataforma de almacenamiento subyacente.

¿Qué ocurrirá si no hago nada?

Si la aplicación supera el límite total de permisos, ya no podrá aumentar el número total de permisos necesarios para la aplicación.

¿Cambia el límite cuántos permisos se pueden conceder a mi aplicación?

No. Este límite afecta solo a la lista de permisos de API solicitados configurados en el registro de la aplicación. Es distinto de la lista de permisos que se han concedido a la aplicación.

Incluso si no aparece en la lista de permisos de API necesarios, la aplicación todavía puede solicitar un permiso delegado dinámicamente. Los permisos delegados y los roles de aplicación (permisos de aplicación) también se pueden conceder directamente mediante Microsoft Graph API o Microsoft Graph PowerShell.

¿Se puede aumentar el límite para mi aplicación?

No, el límite no se puede aumentar para aplicaciones o organizaciones individuales.

¿Hay otros límites en la lista de permisos de API necesarios?

Sí. Los límites pueden variar en función de los tipos de cuenta admitidos para la aplicación. Las aplicaciones que admiten cuentas de Microsoft personales para el inicio de sesión (por ejemplo, Outlook.com, Hotmail.com, Xbox Live) suelen tener límites menores. Consulte Diferencias de validación por tipos de cuenta compatibles para más información.

Recursos adicionales

Use el siguiente script de PowerShell para quitar los permisos duplicados de los registros de aplicación.

<#
.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))"
    }
}

Saber más