Public/Invoke-ConditionalAccessWhatIf.ps1

# Add this helper function before the main Invoke-ConditionalAccessWhatIf function
function Test-SimpleMFAPolicy {
    [CmdletBinding()]
    [OutputType([bool])]
    param(
        [Parameter(Mandatory = $true)]
        [object]$Policy
    )

    # Check if this is a simple "MFA for all" policy with null conditions meaning "all"
    try {
        # Check if it requires MFA
        $requiresMFA = $false
        if ($Policy.grantControls -and
            $Policy.grantControls.builtInControls -and
            $Policy.grantControls.builtInControls -contains "mfa") {
            $requiresMFA = $true
        }

        # Check if it applies to all users
        $allUsers = $false
        if ($Policy.conditions.users.includeUsers -and
            $Policy.conditions.users.includeUsers -contains "All") {
            $allUsers = $true
        }

        # Check if it applies to all apps
        $allApps = $false
        if ($Policy.conditions.applications.includeApplications -and
            $Policy.conditions.applications.includeApplications -contains "All") {
            $allApps = $true
        }

        # Check if the other conditions are null or all
        $allClientApps = $false
        if ($null -eq $Policy.conditions.clientAppTypes -or
            $Policy.conditions.clientAppTypes.Count -eq 0 -or
            $Policy.conditions.clientAppTypes -contains "all" -or
            $Policy.conditions.clientAppTypes -contains "All") {
            $allClientApps = $true
        }

        # Check devices, platforms, locations are null
        $nullConditions = $null -eq $Policy.conditions.devices -and
        $null -eq $Policy.conditions.platforms -and
        $null -eq $Policy.conditions.locations

        # If it has all the characteristics of a simple MFA policy
        return $requiresMFA -and $allUsers -and $allApps -and $allClientApps -and $nullConditions
    }
    catch {
        Write-Verbose "Error in Test-SimpleMFAPolicy: $_"
        return $false
    }
}

# Modify the main function to use our Test-SimpleMFAPolicy check before doing a full evaluation
function Invoke-ConditionalAccessWhatIf {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [object]$Policy,
        [Parameter(Mandatory = $true)]
        [object]$UserContext,
        [Parameter(Mandatory = $true)]
        [object]$ResourceContext,
        [Parameter(Mandatory = $true)]
        [object]$DeviceContext,
        [Parameter(Mandatory = $true)]
        [object]$RiskContext,
        [Parameter(Mandatory = $true)]
        [object]$LocationContext
    )

    # Evaluate if the policy applies
    Write-Verbose "Evaluating policy: $($Policy.DisplayName) (ID: $($Policy.Id))"

    # Add a quick check for simple MFA policies (optimization for common case)
    $isSimpleMFAPolicy = Test-SimpleMFAPolicy -Policy $Policy
    if ($isSimpleMFAPolicy) {
        Write-Verbose "This is a simple MFA for all policy with no restrictions - bypassing conditional evaluation"
        $policyResult = @{
            Applies           = $true
            EvaluationDetails = $null
            Reason            = "Simple MFA for all policy with no restrictions"
        }
    }
    else {
        # Do the full evaluation
        $policyResult = Resolve-CACondition -Policy $Policy -UserContext $UserContext -ResourceContext $ResourceContext -DeviceContext $DeviceContext -RiskContext $RiskContext -LocationContext $LocationContext
    }

    return $policyResult
}