internal/ConvertFrom-SamlSecurityToken.ps1

<#
.SYNOPSIS
   Convert Saml Security Token structure to PowerShell object.
.EXAMPLE
    PS C:\>ConvertFrom-SamlSecurityToken 'Base64String'
    Convert Saml Security Token to XML object.
.INPUTS
    System.String
#>

function ConvertFrom-SamlSecurityToken {
    [CmdletBinding()]
    [Alias('ConvertFrom-SamlRequest')]
    [Alias('ConvertFrom-SamlResponse')]
    [OutputType([xml])]
    param (
        # SAML Security Token
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [string[]] $InputObjects
        # Encoding to use for text strings
        #[Parameter (Mandatory = $false)]
        #[ValidateSet('Ascii', 'UTF32', 'UTF7', 'UTF8', 'BigEndianUnicode', 'Unicode')]
        #[string] $Encoding = 'Default'
    )

    process {
        foreach ($InputObject in $InputObjects) {
            [byte[]] $bytesInput = $null
            $xmlOutput = New-Object xml
            try {
                $xmlOutput.LoadXml($InputObject)
            }
            catch {
                try {
                    $bytesInput = [System.Convert]::FromBase64String($InputObject)
                }
                catch {
                    $bytesInput = [System.Convert]::FromBase64String([System.Net.WebUtility]::UrlDecode($InputObject))
                }
            }
            if ($bytesInput) {
                try {
                    $streamInput = New-Object System.IO.MemoryStream -ArgumentList @($bytesInput, $false)
                    try {
                        $xmlOutput.Load($streamInput)
                    }
                    catch {
                        $streamInput = New-Object System.IO.MemoryStream -ArgumentList @($bytesInput, $false)
                        try {
                            $streamOutput = New-Object System.IO.MemoryStream
                            try {
                                [System.IO.Compression.DeflateStream] $streamCompression = New-Object System.IO.Compression.DeflateStream -ArgumentList $streamInput, ([System.IO.Compression.CompressionMode]::Decompress), $true
                                $streamCompression.CopyTo($streamOutput)
                            }
                            finally { $streamCompression.Dispose() }
                            $streamOutput.Position = 0
                            $xmlOutput.Load($streamOutput)
                            #[string] $strOutput = ([Text.Encoding]::$Encoding.GetString($streamOutput.ToArray()))
                            #$xmlOutput.LoadXml($strOutput)
                        }
                        finally { $streamOutput.Dispose() }
                    }
                }
                finally { $streamInput.Dispose() }
            }

            Write-Output $xmlOutput
        }
    }
}