Private/Conditions/Test-UserActionInScope.ps1

function Test-UserActionInScope {
    <#
    .SYNOPSIS
        Tests if a user action is in scope for a Conditional Access policy.

    .DESCRIPTION
        This function evaluates if a user action is in scope for a Conditional Access policy.
        User actions represent specific activities like registering security info or
        performing privileged actions rather than accessing applications.

    .PARAMETER Policy
        The Conditional Access policy to evaluate.

    .PARAMETER UserActionContext
        The user action context for evaluation, containing the UserAction value.

    .EXAMPLE
        Test-UserActionInScope -Policy $policy -UserActionContext $UserActionContext
    #>

    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param (
        [Parameter(Mandatory = $true)]
        [object]$Policy,

        [Parameter(Mandatory = $true)]
        [object]$UserActionContext
    )

    $result = @{
        InScope = $false
        Reason  = $null
    }

    # First check if the policy has any user action conditions
    if (-not $Policy.Conditions.Applications -or
        -not $Policy.Conditions.Applications.IncludeUserActions -or
        $Policy.Conditions.Applications.IncludeUserActions.Count -eq 0) {

        $result.Reason = "Policy does not include any user actions"
        return $result
    }

    # Extract user action from context
    $userAction = $UserActionContext.UserAction

    # Check if this user action is excluded
    if ($Policy.Conditions.Applications.ExcludeUserActions -and
        $Policy.Conditions.Applications.ExcludeUserActions -contains $userAction) {

        $result.Reason = "User action '$userAction' is explicitly excluded"
        return $result
    }

    # Check if this user action is included
    if ($Policy.Conditions.Applications.IncludeUserActions -contains $userAction) {
        $result.InScope = $true
        $result.Reason = "User action '$userAction' is explicitly included"
        return $result
    }

    # If we get here, the action is not explicitly included
    $result.Reason = "User action '$userAction' is not in the included actions list"
    return $result
}

function Get-SupportedUserActions {
    <#
    .SYNOPSIS
        Gets the list of supported user actions for Conditional Access policies.

    .DESCRIPTION
        This function returns the list of supported user actions that can be
        evaluated in Conditional Access policies, along with their descriptions.

    .EXAMPLE
        Get-SupportedUserActions
    #>

    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param ()

    return @{
        # Authentication-related actions
        "urn:user:registersecurityinfo"                                = "Register security information"
        "urn:user:registerdevice"                                      = "Register a device"
        "urn:user:registeroath"                                        = "Register OATH tokens"
        "urn:user:updatepassword"                                      = "Change password"
        "urn:user:selfservicepasswordreset"                            = "Self-service password reset"
        "urn:user:checkcloudpwdpolicy"                                 = "Check password requirements"
        "urn:user:selfservicewritebackpwdreset"                        = "Self-service password reset writeback"
        "urn:user:selfregisterlicenseddevice"                          = "Register licensed device"

        # Admin-related actions
        "urn:microsoft:pim:elevation"                                  = "Privilege Identity Management elevation"
        "urn:microsoft:pim:submission"                                 = "PIM request submission"
        "urn:microsoft:pim:approval"                                   = "PIM request approval"
        "urn:user:adminregisterdevice"                                 = "Register devices (admin)"
        "urn:microsoft:azure:iam:rolemanagement:submission"            = "Role management submission"
        "urn:microsoft:azure:iam:rolemanagement:approval"              = "Role management approval"

        # Other actions
        "urn:user:attributeverification"                               = "User attribute verification"
        "urn:microsoft:userPreferredAuthenticationMethod:modification" = "Modify authentication methods"
    }
}

function Validate-UserAction {
    <#
    .SYNOPSIS
        Validates if a user action is supported by Conditional Access.

    .DESCRIPTION
        This function checks if a given user action is in the list of
        supported user actions for Conditional Access policies.

    .PARAMETER UserAction
        The user action to validate.

    .EXAMPLE
        Validate-UserAction -UserAction "urn:user:registersecurityinfo"
    #>

    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$UserAction
    )

    $supportedActions = Get-SupportedUserActions
    return $supportedActions.ContainsKey($UserAction)
}

# Export the functions
Export-ModuleMember -Function Test-UserActionInScope, Get-SupportedUserActions, Validate-UserAction