Checks/Azure/Test-EntraPolicyUserConsentForVerifiedApp.ps1

function Test-EntraPolicyUserConsentForVerifiedApp {
    <#
    .SYNOPSIS
        Tests if user consent is limited to verified publisher applications.

    .DESCRIPTION
        This check verifies that the authorization policy does not include the legacy
        consent policy 'ManagePermissionGrantsForSelf.microsoft-user-default-legacy'
        which would allow users to consent to any application.

    .PARAMETER CheckMetadata
        Hashtable containing check metadata including id and severity.

    .EXAMPLE
        Test-EntraPolicyUserConsentForVerifiedApps -CheckMetadata $metadata
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject[]])]
    param(
        [Parameter(Mandatory)]
        [hashtable]$CheckMetadata
    )

    $ErrorActionPreference = 'Stop'

    # Check if Authorization Policy data is available
    if (-not $script:EntraService.AuthorizationPolicy) {
        $findingParams = @{
            CheckMetadata  = $CheckMetadata
            Status         = 'SKIPPED'
            StatusExtended = 'Unable to retrieve authorization policy - missing permissions'
            ResourceId     = 'N/A'
            ResourceName   = 'Authorization Policy'
        }
        New-CIEMFinding @findingParams
    }
    else {
        # Authorization policy can be returned as an array, get the first item
        $authPolicy = if ($script:EntraService.AuthorizationPolicy -is [array]) {
            $script:EntraService.AuthorizationPolicy | Select-Object -First 1
        }
        else {
            $script:EntraService.AuthorizationPolicy
        }

        # Get defaultUserRolePermissions (strict mode safe)
        $defaultUserRolePermissions = if ($authPolicy.PSObject.Properties['defaultUserRolePermissions']) {
            $authPolicy.defaultUserRolePermissions
        }
        else {
            $null
        }

        # Get permission grant policies assigned (strict mode safe)
        $permissionPolicies = if ($defaultUserRolePermissions -and $defaultUserRolePermissions.PSObject.Properties['permissionGrantPoliciesAssigned']) {
            $defaultUserRolePermissions.permissionGrantPoliciesAssigned
        }
        else {
            @()
        }

        # Default to PASS
        $status = 'PASS'
        $statusExtended = 'Entra does not allow users to consent non-verified apps accessing company data on their behalf.'

        # Check if legacy policy exists
        $legacyPolicyName = 'ManagePermissionGrantsForSelf.microsoft-user-default-legacy'
        foreach ($policy in $permissionPolicies) {
            if ($policy -like "*$legacyPolicyName*") {
                $status = 'FAIL'
                $statusExtended = 'Entra allows users to consent apps accessing company data on their behalf.'
                break
            }
        }

        $findingParams = @{
            CheckMetadata  = $CheckMetadata
            Status         = $status
            StatusExtended = $statusExtended
            ResourceId     = $authPolicy.id
            ResourceName   = 'Authorization Policy'
        }
        New-CIEMFinding @findingParams
    }
}