internal/functions/Test-PIMPolicyBusinessRules.ps1
# Shared business rule validation for PIM policies (Orchestrator module copy) # This function contains the same logic as the core EasyPIM module for handling # Authentication Context vs MFA conflicts and other business rules. function Test-PIMPolicyBusinessRules { <# .SYNOPSIS Validates and adjusts PIM policy settings according to Microsoft Graph API business rules. .DESCRIPTION This function applies business rule logic to ensure drift detection uses the same conflict resolution as policy setting functions. .PARAMETER PolicySettings The policy settings object to validate/adjust .PARAMETER CurrentPolicy The current live policy (for checking existing Authentication Context) .PARAMETER ApplyAdjustments If true, automatically adjusts conflicting settings. If false, only reports conflicts. .OUTPUTS PSCustomObject with properties: - AdjustedSettings: The policy settings with conflicts resolved - Conflicts: Array of detected conflicts - HasChanges: Boolean indicating if adjustments were made #> [CmdletBinding()] param( [Parameter(Mandatory)] [object]$PolicySettings, [Parameter()] [object]$CurrentPolicy, [Parameter()] [switch]$ApplyAdjustments ) $conflicts = @() $hasChanges = $false $adjustedSettings = $PolicySettings.PSObject.Copy() # Rule 1: Authentication Context vs MFA Conflict $authContextEnabled = $false # Check if Authentication Context is enabled in requested settings if ($PolicySettings.PSObject.Properties['AuthenticationContext_Enabled']) { $authContextEnabled = ($PolicySettings.AuthenticationContext_Enabled -eq $true) } # Check if Authentication Context is enabled in current policy elseif ($CurrentPolicy) { $authContextProps = @('AuthenticationContext_Enabled', 'authenticationContextClassReferences', 'authenticationContext', 'AuthenticationContextEnabled') foreach ($prop in $authContextProps) { if ($CurrentPolicy.PSObject.Properties[$prop] -and $CurrentPolicy.$prop) { $authContextEnabled = $true break } } } # Check ActivationRequirement for MFA conflicts if ($PolicySettings.PSObject.Properties['ActivationRequirement']) { $requirements = $PolicySettings.ActivationRequirement # Normalize to array if comma-separated string if ($requirements -is [string] -and $requirements -match ',') { $requirements = $requirements -split ',' | ForEach-Object { $_.Trim() } } if ($authContextEnabled -and $requirements -and ($requirements -contains 'MultiFactorAuthentication')) { $conflicts += @{ Field = 'ActivationRequirement' Type = 'AuthenticationContextMfaConflict' Message = 'Authentication Context is enabled. MultiFactorAuthentication requirement will be automatically removed to avoid MfaAndAcrsConflict.' OriginalValue = $requirements AdjustedValue = @($requirements | Where-Object { $_ -ne 'MultiFactorAuthentication' }) } if ($ApplyAdjustments) { $adjustedSettings.ActivationRequirement = @($requirements | Where-Object { $_ -ne 'MultiFactorAuthentication' }) $hasChanges = $true } } } # Check ActiveAssignmentRequirement for MFA conflicts if ($PolicySettings.PSObject.Properties['ActiveAssignmentRequirement']) { $requirements = $PolicySettings.ActiveAssignmentRequirement # Normalize to array if comma-separated string if ($requirements -is [string] -and $requirements -match ',') { $requirements = $requirements -split ',' | ForEach-Object { $_.Trim() } } if ($authContextEnabled -and $requirements -and ($requirements -contains 'MultiFactorAuthentication')) { $conflicts += @{ Field = 'ActiveAssignmentRequirement' Type = 'AuthenticationContextMfaConflict' Message = 'Authentication Context is enabled. MultiFactorAuthentication requirement will be automatically removed to avoid MfaAndAcrsConflict.' OriginalValue = $requirements AdjustedValue = @($requirements | Where-Object { $_ -ne 'MultiFactorAuthentication' }) } if ($ApplyAdjustments) { $adjustedSettings.ActiveAssignmentRequirement = @($requirements | Where-Object { $_ -ne 'MultiFactorAuthentication' }) $hasChanges = $true } } } # Future: Add more business rules here as they are discovered return [PSCustomObject]@{ AdjustedSettings = $adjustedSettings Conflicts = $conflicts HasChanges = $hasChanges AuthenticationContextEnabled = $authContextEnabled } } |