How to Capture and Decode a Microsoft Entra SAML Response Without a Browser Extension

Need to verify which claims Microsoft Entra ID is sending to a SAML application, but cannot install a browser extension? This post shows how to capture the SAML response with Edge Developer Tools, decode it locally with PowerShell, and inspect group claim values safely.

Recently, I needed to confirm whether Microsoft Entra ID was passing a specific group to a SAML application.

The application team wanted to know two things:

  1. Was the group claim included in the SAML assertion?
  2. What exact value was Entra sending for the group?

Normally, a SAML browser extension makes this easy. In a managed enterprise environment, especially GCC High, installing browser extensions might be restricted. Rather than requesting an exception just to inspect one authentication flow, I used the browser’s built-in Developer Tools and PowerShell.

This approach lets you:

  • Capture the SAML response without installing an extension
  • Decode the response locally
  • Display every claim in the assertion
  • Identify group and role claims
  • Resolve group object IDs back to Microsoft Entra group names
  • Avoid uploading sensitive authentication data to a public decoding site

How the SAML response is delivered

During SAML sign-in, Microsoft Entra ID issues a SAML response to the application. The response contains an assertion with claims about the signed-in user.

Claims are commonly stored in the SAML AttributeStatement. They can include values such as:

  • User principal name
  • Email address
  • First and last name
  • Tenant information
  • Application roles
  • Group memberships

Microsoft Entra allows administrators to view and customize these claims under the enterprise application’s Attributes & Claims configuration.

The SAML response is typically submitted to the application’s Assertion Consumer Service URL using an HTTP POST. The Base64-encoded assertion appears in a form field named:

SAMLResponse

Our goal is to capture that value before the authentication flow finishes.

Step 1: Review the group claim configuration

Before capturing anything, verify how the application is configured to issue group claims.

In the Microsoft Entra admin center:

  1. Open Entra ID.
  2. Select Enterprise applications.
  3. Select the application.
  4. Select Single sign-on.
  5. Select SAML.
  6. Open Attributes & Claims.
  7. Locate the group claim.

Microsoft Entra can be configured to include security groups, directory groups, or only groups assigned to the application. The administrator can also choose which value is emitted for each group.

Common group value formats include:

  • Entra group object ID
  • On-premises sAMAccountName
  • Domain-qualified sAMAccountName
  • On-premises group SID
  • Cloud group display name, in supported configurations

In many configurations, the group value will be the Entra group object ID, which looks like this:

7e308f7c-2e6a-4e50-a2f4-64b56b3e9371

This is important because the application team may be looking for a friendly group name while Entra is actually sending a GUID.

Step 2: Open Edge Developer Tools

I recommend using an InPrivate browser session so that you can perform a clean authentication test.

  1. Open Microsoft Edge in an InPrivate window.
  2. Navigate to the application, but do not sign in yet.
  3. Press F12 to open Developer Tools.
  4. Select the Network tab.
  5. Enable Preserve log.
  6. Select the clear button to remove any existing network activity.

Preserve log is important because SAML sign-in redirects the browser across multiple pages and domains. Without it, the request containing the SAML response may disappear when the browser navigates to the application.

Microsoft’s Edge documentation confirms that the Network tool can preserve requests across page loads and display form data from a request’s Payload tab.

Step 3: Perform the SAML sign-in

With the Network capture running, complete the normal sign-in process.

You can start the authentication flow from either:

  • The application’s sign-in page
  • The My Apps portal
  • The Test single sign-on option in the enterprise application

Microsoft documents the test process under:

Entra ID > Enterprise applications > Application > Single sign-on > Test single sign-on.

After authentication finishes, return to Developer Tools.

Step 4: Find the POST containing SAMLResponse

The Network tab may contain many requests, so filtering the list is helpful.

Enter the following in the Network filter:

method:POST

Look for a POST request going to the application’s Reply URL or Assertion Consumer Service URL. It is often one of the final document requests before the application loads.

Select the request and then open the Payload tab.

Under Form Data, look for:

SAMLResponse

You might also see:

RelayState

RelayState helps the application track where the user should be sent after authentication. It is not the SAML assertion we need to inspect.

Copy only the value associated with SAMLResponse.

The value will be a long Base64 string, similar to:

PHNhbWxwOlJlc3BvbnNlIElEPSJf...

Do not copy the words SAMLResponse= unless you plan to remove them before decoding.

Step 5: Decode the SAML response with PowerShell

Rather than pasting the token into a public website, I decode it locally.

Copy the SAMLResponse value to your clipboard and run the following PowerShell script:

$EncodedResponse = Get-Clipboard -Raw
if ([string]::IsNullOrWhiteSpace($EncodedResponse)) {
throw "The clipboard is empty. Copy the SAMLResponse value and try again."
}
$EncodedResponse = $EncodedResponse.Trim()
# Remove the field name if SAMLResponse= was included in the copied text.
if ($EncodedResponse -match '^\s*SAMLResponse\s*=') {
$EncodedResponse = $EncodedResponse -replace '^\s*SAMLResponse\s*=\s*', ''
}
# Remove surrounding quotes if they were included.
$EncodedResponse = $EncodedResponse.Trim('"', "'")
# Decode URL-encoded characters.
$EncodedResponse = [System.Net.WebUtility]::UrlDecode(
$EncodedResponse
)
# URL decoding can turn Base64 plus signs into spaces.
$EncodedResponse = $EncodedResponse -replace '\s', '+'
# Restore missing Base64 padding when necessary.
switch ($EncodedResponse.Length % 4) {
0 { }
2 { $EncodedResponse += '==' }
3 { $EncodedResponse += '=' }
default {
throw "The copied value does not appear to be valid Base64."
}
}
try {
$SamlBytes = [System.Convert]::FromBase64String(
$EncodedResponse
)
$SamlXmlText = [System.Text.Encoding]::UTF8.GetString(
$SamlBytes
)
[xml]$SamlXml = $SamlXmlText
}
catch {
throw "Unable to decode the SAML response. $($_.Exception.Message)"
}
$OutputPath = Join-Path $env:TEMP 'SamlResponse.xml'
$WriterSettings = [System.Xml.XmlWriterSettings]::new()
$WriterSettings.Indent = $true
$WriterSettings.Encoding = [System.Text.UTF8Encoding]::new($false)
$Writer = [System.Xml.XmlWriter]::Create(
$OutputPath,
$WriterSettings
)
try {
$SamlXml.Save($Writer)
}
finally {
$Writer.Dispose()
}
Write-Host "Decoded SAML response saved to:"
Write-Host $OutputPath
notepad.exe $OutputPath

The decoded response is saved to:

%TEMP%\SamlResponse.xml

If the group you are troubleshooting appears in the XML, Entra is successfully including it in the SAML token.

If the group is not listed, review the group claim settings under:

Enterprise applications > Application name > Single sign-on > Attributes & Claims

This process provides a direct view of the actual SAML assertion without requiring a browser extension or uploading the token to a public decoding website.

Remember to delete the decoded XML file after troubleshooting because it may contain usernames, email addresses, group memberships, tenant identifiers, and authentication information.

Azure Policy Mystery: Compute Baseline Applies to Windows 11 MultiSession, Not to Windows 11 Enterprise

It’s been a busy few months over here. With CMMC preparation in full swing, it’s been all about making sure our controls are defensible and our evidence holds up. I typically start from a NIST 800-171 rev.2 baseline so I’ve got a strong foundation to build on for compliance.

While reviewing my Azure Policy posture, I noticed something odd:

  • My AVD Windows 11 multi-session deployments were coming back Compliant.
  • But some test Windows 11 Enterprise VMs showed Not applicable for the guest configuration results.
  • Even more confusing: Azure Policy still appeared to report those Windows 11 Enterprise VMs as Compliant at the policy level.

That mismatch (“Compliant” vs “Not applicable”) is exactly the kind of thing that can cause confusion, or worse, show up during an audit.

What the baseline content says (MOF filters)

My first gut reaction was to look at what the baseline was actually doing. The Windows baseline content uses filters to decide whether a given rule should be evaluated. In the MOF you’ll see both a ServerTypeFilter and an OSFilter, for example:

	ServerTypeFilter = "ServerType = [Domain Controller, Domain Member, Workgroup Member]";
	OSFilter = "OSVersion = [WS2008, WS2008R2, WS2012, WS2012R2, WS2016]";

At face value, that OS filter reads like “Windows Server only” targeting (the WS* values).

What the Guest Configuration agent logs show

Next I went to the Guest Configuration agent logs:

C:\ProgramData\GuestConfig\gc_agent_logs

On the Windows 11 Enterprise VM, the logs clearly show the engine skipping rules due to OS filtering:

Message : [win11ent]: [Audit Other Object Access Events] Not evaluating rule because it was filtered due to OS version
[2025-12-26 17:23:21.749] [PID 7840] [TID 9292] [DSCEngine] [WARNING] ...

On the Windows 11 multi-session VM, the same type of check was actually being processed:

ResourceID: Audit Other Object Access Events
Message : [win11multi]: LCM:  [ Start  Get ]  [Audit Other Object Access Events]
[2025-12-26 17:21:03.877] ... Invoking resource method 'GetTargetResource' ... class name 'ASM_AuditPolicy'

So in my case:

  • Win11 Enterprise: rules get filtered “Not applicable”
  • Win11 multi-session: rules run produces compliance results

Compare OS SKU signals (including ProductType)

To compare what Windows reports about each OS, you can pull basic OS info like this:

Get-CimInstance Win32_OperatingSystem |
  Select-Object Caption, Version, BuildNumber, ProductType

Microsoft documents Win32_OperatingSystem.ProductType as: Microsoft Learn

  • Work Station (1)
  • Domain Controller (2)
  • Server (3)

This is useful context when you’re trying to understand how a configuration engine might be classifying a machine at evaluation time. (It doesn’t prove which internal mapping the baseline uses, but it’s an easy, consistent signal to capture as evidence.)

The documentation clue: this baseline isn’t intended for Windows 10/11

The big “aha” for me was in Microsoft’s baseline reference documentation. The Windows guest configuration baseline documentation explicitly states:

Azure Policy guest configuration only applies to Windows Server SKU and Azure Stack SKU. It does not apply to end user compute like Windows 10 and Windows 11 SKUs. Microsoft Learn

That statement lines up perfectly with why Windows 11 Enterprise would return Not applicable.

What didn’t line up (and what prompted the deeper dive) was why Windows 11 multisession was still producing evaluated results in my environment.

To drive the point of confusion home even futher, let’s take a look at the Guest Assignment. We can see the multi session OS is working, but the Enterprise image is showing compliant, but not applicable to that OS.

Closing the loop with Microsoft support

To close the case, I opened a ticket with Microsoft and shared:

  • the MOF filter behavior,
  • the Guest Configuration agent logs showing OS version filtering on Win11 Enterprise,
  • and the fact that Win11 multisession was still evaluating rules.

Support escalated to product and confirmed (for my scenario) that the baseline behavior I was seeing was expected, and that documentation updates were planned to make this clearer where it works with the multi session OS, but not the Enterprise OS.

Takeaway: don’t assume “Compliant” means “evaluated.” “For audit prep, verify applicability and keep a record of what the agent actually assessed, especially when you’re mixing Windows 11 Enterprise and Windows 11 multi-session in the same compliance scope.