tests/Test-Assessment.21824.ps1

<#
.SYNOPSIS

#>


function Test-Assessment-21824 {
    [ZtTest(
        Category = 'External collaboration',
        ImplementationCost = 'Low',
        Pillar = 'Identity',
        RiskLevel = 'Medium',
        SfiPillar = 'Protect tenants and isolate production systems',
        TenantType = ('Workforce'),
        TestId = 21824,
        Title = 'Guests don''t have long lived sign-in sessions',
        UserImpact = 'Medium'
    )]
    [CmdletBinding()]
    param()

    #region Data Collection
    Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose

    $activity = "Checking Guests don't have long lived sign-in sessions"
    Write-ZtProgress -Activity $activity -Status "Getting policy"

    # Query for CA policies that are enabled and include guests or external users
    $allCAPolicies = Invoke-ZtGraphRequest -RelativeUri "identity/conditionalAccess/policies" -ApiVersion 'v1.0'

    $filteredCAPolicies = $allCAPolicies | Where-Object {
        ($null -ne $_.conditions.users.includeGuestsOrExternalUsers) -and
        ($_.state -in @('enabled', 'enabledForReportingButNotEnforced'))
    }

    # Local filtering - validate sign-in frequency for guest sessions
    $matchedPolicies = $filteredCAPolicies | Where-Object {
        $signInFrequency = $_.sessionControls.signInFrequency
        if ($signInFrequency -and $signInFrequency.isEnabled) {
            ($signInFrequency.type -eq 'hours' -and $signInFrequency.value -le 24) -or
            ($signInFrequency.type -eq 'days' -and $signInFrequency.value -eq 1) -or
            ($null -eq $signInFrequency.type -and $signInFrequency.frequencyInterval -eq 'everyTime')
        }
        else {
            $false
        }
    }

    #endregion Data Collection

    #region Assessment Logic
    $passed = $false
    $testResultMarkdown = ""

    if ($filteredCAPolicies.Count -eq $matchedPolicies.Count) {
        $passed = $true
        $testResultMarkdown = "Guests don't have long lived sign-in sessions.`n`n%TestResult%"
    }
    else {
        $passed = $false
        $testResultMarkdown = "Guests do have long lived sign-in sessions.`n`n%TestResult%"
    }
    #endregion Assessment Logic

    #region Report Generation
    # Build the detailed sections of the markdown

    # Define variables to insert into the format string
    $reportTitle = "Sign-in frequency policies"
    $tableRows = ""

    if ($filteredCAPolicies -and $filteredCAPolicies.Count -gt 0) {
        # Create a here-string with format placeholders {0}, {1}, etc.
        $formatTemplate = @'

## {0}

| Policy Name | Sign-in Frequency | Status |
| :---------- | :---------------- | :----- |
{1}

'@


        foreach ($filteredCAPolicy in $filteredCAPolicies) {

            $policyName = $filteredCAPolicy.DisplayName

            $portalLink = 'https://entra.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/PolicyBlade/policyId/{0}' -f $filteredCAPolicy.Id

            $signInFrequency = $filteredCAPolicy.sessionControls.signInFrequency
            switch ($signInFrequency.type) {
                'hours' {
                    $signInFreqValue = "{0} hours" -f $signInFrequency.value
                }
                'days' {
                    $signInFreqValue = "{0} days" -f $signInFrequency.value
                }
                default {
                    if ($signInFrequency.frequencyInterval -eq 'everyTime') {
                        $signInFreqValue = "Every time"
                    }
                    else {
                        $signInFreqValue = "Not configured"
                    }
                }
            }

            $status = if ($matchedPolicies -and $matchedPolicies.Id -contains $filteredCAPolicy.Id) {
                "✅"
            }
            else {
                "❌"
            }

            $tableRows += @"
| [$(Get-SafeMarkdown($policyName))]($portalLink) | $signInFreqValue | $status |`n
"@

        }

        # Format the template by replacing placeholders with values
        $mdInfo = $formatTemplate -f $reportTitle, $tableRows
    }

    # Replace the placeholder with the detailed information
    $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", $mdInfo
    #endregion Report Generation

    $params = @{
        TestId = '21824'
        Status = $passed
        Result = $testResultMarkdown
    }
    Add-ZtTestResultDetail @params
}