Yapılandırılmış izin sınırlarıyla ilgili sorunları giderme

Uygulama RequiredResourceAccess nesnesinde koleksiyon (RRA), bir uygulamanın varsayılan onay isteği için gerektirdiği tüm yapılandırılmış API izinlerini içerir. Bu koleksiyonun, uygulamanın desteklediği kimlik türlerine bağlı olarak çeşitli sınırları vardır. Desteklenen hesap türlerinin sınırları hakkında daha fazla bilgi için bkz . Desteklenen hesap türlerine göre doğrulama farklılıkları.

En fazla izin sınırları Mayıs 2022'de güncelleştirildi, bu nedenle bazı uygulamaların RRA'larında izin verilenden daha fazla izni olabilir. Ayrıca, izinleri yapılandırdıktan sonra desteklenen hesap türlerini değiştiren uygulamalar yeni ayarın sınırlarını aşabilir. Uygulamalar yapılandırılan izinler sınırını aştığında, koleksiyondaki RequiredResourceAccess izin sayısı sınırların altına geri getirilene kadar yeni izin eklenemez.

Bu belge, bu sorunu çözmek için ek bilgiler ve sorun giderme adımları sunar.

Bir uygulamanın sınırları ne zaman aştığını RequiredResourceAccess belirleme

Genel olarak, 400'den fazla izni olan tüm uygulamalar yapılandırma sınırlarını aştı. Uygulamalar kişisel Microsoft hesapları (MSA) için oturum açmayı destekliyorsa daha düşük sınırlara da tabi olabilir. İzin sınırlarını aşan bir uygulama, Azure portalında daha fazla izin eklemeye çalışırken aşağıdaki hatayı alır:

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

Çözüm adımları

Uygulamaya artık ihtiyaç yoksa, göz önünde bulundurmanız gereken ilk seçenek uygulama kaydını tamamen silmektir. (Kısa süre sonra hala gerekli olduğunu fark edebilirsiniz, yakın zamanda silinen uygulamaları geri yükleyebilirsiniz.)

Uygulamaya hala ihtiyacınız varsa veya emin değilseniz, aşağıdaki adımlar bu sorunu çözmenize yardımcı olacaktır:

  1. Yinelenen izinleri kaldırın. Bazı durumlarda aynı izin birden çok kez listelenir. Gerekli izinleri gözden geçirin ve iki veya daha fazla kez listelenen izinleri kaldırın. Bu makalenin ek kaynaklar bölümünde ilgili PowerShell betiğine bakın.
  2. Kullanılmayan izinleri kaldırın. Uygulamanın gerektirdiği izinleri gözden geçirin ve uygulama veya hizmetin yaptıklarıyla karşılaştırın. Uygulama kaydında yapılandırılan ancak uygulama veya hizmetin gerektirmediği izinleri kaldırın. İzinleri gözden geçirme hakkında daha fazla bilgi için bkz. Uygulama izinlerini gözden geçirme
  3. Yedekli izinleri kaldırın. Microsoft Graph dahil olmak üzere birçok API'de, diğer daha ayrıcalıklı izinler dahil edildiğinde bazı izinler gerekli değildir. Örneğin, bir uygulamada User.ReadWrite.All (tüm kullanıcıları okuma, oluşturma ve güncelleştirme) olduğunda User.Read.All (tüm kullanıcıları oku) Microsoft Graph izni gerekmez. Microsoft Graph izinleri hakkında daha fazla bilgi edinmek için bkz . Microsoft Graph izinleri başvurusu.

Sık sorulan sorular (SSS)

Microsoft neden toplam izin sınırında değişiklik yapmış?

Bu sınır iki nedenden dolayı önemlidir:

  • Bir uygulamanın onay sırasında verilebilenden daha fazla izin gerektirecek şekilde yapılandırılmasını önlemeye yardımcı olmak için.
  • Uygulama kaydının toplam boyutunu temel depolama platformunun kararlılığı ve performansı için gereken sınırlar içinde tutmak için.

Bir şey yapmazsam ne olacak?

Uygulamanız toplam izin sınırını aşarsa, artık uygulamanız için gerekli izinlerin toplam sayısını artıramazsınız.

Sınır, uygulamama kaç izin verilebileceğini değiştiriyor mu?

Hayır Bu sınır yalnızca uygulama kaydında yapılandırılan istenen API izinlerinin listesini etkiler. Bu, uygulamanıza verilen izinler listesinden farklıdır.

Gerekli API izinleri listesinde yer almasa bile, bir uygulama tarafından dinamik olarak temsilci izni istenebilir. Microsoft Graph API veya Microsoft Graph PowerShell kullanılarak hem temsilci izinleri hem de uygulama rolleri (uygulama izinleri) doğrudan verilebilir.

Uygulamam için sınır artırılabilir mi?

Hayır, tek tek uygulamalar veya kuruluşlar için sınır artırılamaz.

Gerekli API izinleri listesinde başka sınırlar var mı?

Evet. Sınırlar, uygulama için desteklenen hesap türlerine bağlı olarak farklılık gösterebilir. Oturum açma için kişisel Microsoft Hesaplarını destekleyen uygulamalar (örneğin, Outlook.com, Hotmail.com, Xbox Live) genellikle daha düşük sınırlara sahiptir. Daha fazla bilgi edinmek için bkz . Desteklenen hesap türlerine göre doğrulama farklılıkları.

Ek kaynaklar

Uygulama kayıtlarınızdan yinelenen izinleri kaldırmak için aşağıdaki PowerShell betiğini kullanı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 '46c22aca-bcdd-467d-a837-bd544c09b8b4'" | .\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))"
    }
}

Daha fazla bilgi edinin