Griffin31
HEBook a demo
HE
Blog

Update: Token Protection in Conditional Access Now Supports the Windows App

28 April 2025

Microsoft news

Introduction: Microsoft Entra Conditional Access just introduced a critical enhancement — Token Protection now supports the Windows App, extending coverage to Azure Virtual Desktop (AVD) and Windows 365. This allows organizations to apply stronger identity protections even in virtualized or cloud PC environments. What Is Token Protection?

Token Protection (also known as token binding) ensures that sign-in tokens are only valid on the device where they were issued. It creates a cryptographic tie between the token and device, making the token unusable if stolen and replayed from another system.

This feature:

What’s New in This Update?

Key improvements now available in public preview:

Deployment Recommendations

To implement Token Protection:

AADNonInteractiveUserSignInLogs
| where TimeGenerated > ago(7d)
| project Id, ConditionalAccessPolicies, Status, UserPrincipalName, AppDisplayName, ResourceDisplayName
| where ConditionalAccessPolicies != "[]"
| where ResourceDisplayName in ("Office 365 Exchange Online", "Office 365 SharePoint Online", "Azure Virtual Desktop", "Windows 365", "Windows Cloud Login")
| mv-expand todynamic(ConditionalAccessPolicies)
| where ConditionalAccessPolicies["enforcedSessionControls"] contains '["Binding"]'
   or ConditionalAccessPolicies["enforcedSessionControls"] contains '["SignInTokenProtection"]'
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied"
| extend SessionNotSatisfyResult = ConditionalAccessPolicies["sessionControlsNotSatisfied"]

Query by User:

AADNonInteractiveUserSignInLogs
| where TimeGenerated > ago(7d)
| project Id, ConditionalAccessPolicies, UserPrincipalName, AppDisplayName, ResourceDisplayName
| where ConditionalAccessPolicies != "[]"
| where ResourceDisplayName in ("Office 365 Exchange Online", "Office 365 SharePoint Online", "Azure Virtual Desktop", "Windows 365", "Windows Cloud Login")
| mv-expand todynamic(ConditionalAccessPolicies)
| where ConditionalAccessPolicies["enforcedSessionControls"] contains '["Binding"]'
   or ConditionalAccessPolicies["enforcedSessionControls"] contains '["SignInTokenProtection"]'
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied"
| extend SessionNotSatisfyResult = ConditionalAccessPolicies["sessionControlsNotSatisfied"]

Identify Unsupported Devices:

AADNonInteractiveUserSignInLogs
| where TimeGenerated > ago(7d)
| where TokenProtectionStatusDetails != ""
| extend parsedBindingDetails = parse_json(TokenProtectionStatusDetails)
| extend bindingStatus = tostring(parsedBindingDetails["signInSessionStatus"])
| extend bindingStatusCode = tostring(parsedBindingDetails["signInSessionStatusCode"]

What's Not Supported — Key Limitations to Be Aware Of Before rolling out Token Protection broadly, it’s important to understand where it won’t work (yet):

📌 If a sign-in fails due to an unsupported scenario, look for signInSessionStatusCode = 1003 in the Sign-in Logs (under TokenProtectionStatusDetails). How to Avoid Onboarding Issues? To prevent disruptions during rollout, you can filter out unsupported devices directly in your Conditional Access policy using device filters.

Examples:

Final Thoughts

Token Protection is a crucial piece in implementing session-level control across cloud apps and Windows endpoints. Now that support includes the Windows App, this protection finally extends to environments where it’s needed most: VDI and Cloud PCs.

Review your existing Conditional Access policies and begin piloting this feature today.

Learn more:

https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-token-protection

Want to know where your tenant stands? Griffin31 checks your Microsoft 365 security settings continuously and shows you what to fix first.