<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Entra on Nicola Suter</title><link>https://nicolasuter.ch/tags/entra/</link><description>Recent content in Entra on Nicola Suter</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><copyright>© 2026 Nicola Suter</copyright><lastBuildDate>Mon, 01 Jun 2026 15:37:02 +0000</lastBuildDate><atom:link href="https://nicolasuter.ch/tags/entra/rss.xml" rel="self" type="application/rss+xml"/><item><title>Chasing Entra re-authentication prompts</title><link>https://nicolasuter.ch/til/entra-expiration-requirement/</link><pubDate>Mon, 01 Jun 2026 15:37:02 +0000</pubDate><guid>https://nicolasuter.ch/til/entra-expiration-requirement/</guid><description>&lt;p&gt;While troubleshooting unexpected re-authentication prompts in Entra ID, I stumbled over a legacy setting I had almost forgotten existed. The environment was piloting a new set of Conditional Access policies, and some pilot users received daily re-authentication prompts in Microsoft 365 apps, although no Conditional Access policy was forcing this.&lt;/p&gt;
&lt;p&gt;Entra ID Protection was the first suspect, but no risk detections were present for the affected users. The actual reason was hiding in plain sight in the Entra sign-in logs, in the &lt;code&gt;SessionLifetimePolicies&lt;/code&gt; field.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Inspecting SessionLifetimePolicies
 &lt;div id="inspecting-sessionlifetimepolicies" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#inspecting-sessionlifetimepolicies" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;A quick KQL query against &lt;code&gt;SigninLogs&lt;/code&gt; reveals every distinct &lt;code&gt;expirationRequirement&lt;/code&gt; reason observed in the tenant:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="ExpirationRequirement"
 width="627"
 height="148"
 src="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png"
 srcset="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png 800w, https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/entra-expiration-requirement/expirationrequirement.png"&gt;&lt;figcaption&gt;Distinct expirationRequirement reasons surfaced from SigninLogs&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;SigninLogs
| mv-expand parse_json(SessionLifetimePolicies)
| extend ExpirationRequirement = tostring(SessionLifetimePolicies.expirationRequirement)
| extend ExpirationDetail = tostring(SessionLifetimePolicies.detail)
| distinct ExpirationRequirement, ExpirationDetail&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;sessionLifetimePolicy&lt;/code&gt; resource is also documented as part of the Microsoft Graph API&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt;.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Legacy MFA settings
 &lt;div id="legacy-mfa-settings" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#legacy-mfa-settings" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;rememberMultifactorAuthenticationOnTrustedDevices&lt;/code&gt; value stood out and reminded me of the Azure AD days and the legacy MFA settings. Sure enough, the &lt;em&gt;Remember multi-factor authentication on trusted devices&lt;/em&gt; setting was still enabled:&lt;/p&gt;</description></item><item><title>Microsoft Authenticator App Details now exposed in Entra SignInLogs</title><link>https://nicolasuter.ch/til/authenticationappdevicedetails/</link><pubDate>Wed, 20 May 2026 12:00:01 +0000</pubDate><guid>https://nicolasuter.ch/til/authenticationappdevicedetails/</guid><description>&lt;p&gt;In response to CVE-2026-41615&lt;cite&gt;&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/cite&gt; (Microsoft Authenticator Information Disclosure Vulnerability), Microsoft started exposing the used Microsoft Authenticator app details as part of the Entra ID Sign-In Logs in the &lt;code&gt;AuthenticationAppDeviceDetails&lt;/code&gt; column. The information can be queried via KQL. Vulnerable builds include versions prior to 6.2605.2973 (Android) and 6.8.47 (iOS), which have been patched.&lt;/p&gt;
&lt;p&gt;You can use the below KQL query to find users with outdated Microsoft Authenticator app versions, which are vulnerable:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="AuthenticationAppDeviceDetails"
 width="872"
 height="213"
 src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails_hu_8cac35efb14eb6ad.png"
 srcset="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails_hu_8cac35efb14eb6ad.png 800w, https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDeviceDetails.png"&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;// https://msrc.microsoft.com/update-guide/vulnerability/CVE-2026-41615
let MinimumVersions = datatable(
 AuthenticatorOperatingSystem: string,
 PatchedAuthenticatorVersion: string
)[
 &amp;#34;Android&amp;#34;, &amp;#34;6.2605.2973&amp;#34;,
 &amp;#34;Ios&amp;#34;, &amp;#34;6.8.47&amp;#34;
];
SigninLogs
| where isnotempty(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetails = parse_json(AuthenticationAppDeviceDetails)
| extend AuthenticatorOperatingSystem = tostring(AuthenticationAppDetails.operatingSystem)
| extend UsedAuthenticatorVersion = tostring(AuthenticationAppDetails.appVersion)
// b2b and guest accounts include: {&amp;#34;deviceId&amp;#34;:&amp;#34;{PII Removed}&amp;#34;} and no authenticator details
| where isnotempty(UsedAuthenticatorVersion)
| join kind=leftouter MinimumVersions on AuthenticatorOperatingSystem
| extend isVulnerable = parse_version(UsedAuthenticatorVersion) &amp;lt; parse_version(PatchedAuthenticatorVersion)
| where isVulnerable
| distinct UserPrincipalName, AuthenticatorOperatingSystem, UsedAuthenticatorVersion, isVulnerable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;AuthenticationAppDeviceDetails&lt;/code&gt; (JSON) column itself consists of the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appVersion&lt;/li&gt;
&lt;li&gt;clientApp&lt;/li&gt;
&lt;li&gt;deviceId&lt;/li&gt;
&lt;li&gt;operatingSystem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;clientApp&lt;/code&gt; property is really helpful, as we now also have another option to identify users who use the Authenticator light capabilities, available as part of the Outlook app:&lt;/p&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="auto"
 alt="AuthenticationAppDetailsClientApp"
 width="754"
 height="276"
 src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png"
 srcset="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png 800w, https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png 1280w"
 sizes="(min-width: 768px) 50vw, 65vw"
 data-zoom-src="https://nicolasuter.ch/til/authenticationappdevicedetails/AuthenticationAppDetailsClientApp.png"&gt;&lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-kusto" data-lang="kusto"&gt;SigninLogs
| where isnotempty(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetails = parse_json(AuthenticationAppDeviceDetails)
| extend AuthenticationAppDetailsClientApp = tostring(AuthenticationAppDetails.clientApp)
| where AuthenticationAppDetailsClientApp == &amp;#34;Outlook&amp;#34;
| distinct UserPrincipalName, AuthenticationAppDetailsClientApp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This might be relevant in your environment if you did not disable the Microsoft-managed setting for using the Authenticator light option, which, for example, does not support Conditional Access authentication strengths, passkeys, and app protection policies:&lt;/p&gt;</description></item><item><title>Don't let Entra ID Protection miss your next breach!</title><link>https://nicolasuter.ch/entra-id-protection-stop-account-breach/</link><pubDate>Sun, 22 Mar 2026 10:00:03 +0000</pubDate><guid>https://nicolasuter.ch/entra-id-protection-stop-account-breach/</guid><description>&lt;p&gt;All too often, my baseVISION (IR) colleagues and I find compromised cloud accounts where many security &amp;lsquo;signals&amp;rsquo; were missed—both from a prevention and detection perspective. In this blog post, I want to share some motivation and tips to help you adopt Entra ID Protection risk-based Conditional Access policies to increase your tenant&amp;rsquo;s security posture, and ensure you don&amp;rsquo;t miss the next obvious account breach.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Real-world motivation
 &lt;div id="real-world-motivation" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#real-world-motivation" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Anyone who has seen an AiTM campaign in the wild will probably notice the following details from the Entra ID sign-in logs of a compromised account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ResourceDisplayName: &lt;code&gt;OfficeHome&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;UserAgent: &lt;code&gt;axios/1.13.2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Entra ID Protection - High - AiTM"
 src="https://nicolasuter.ch/content/images/2026/eidp/id-protection-high.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;The problem? Even though Entra ID Protection flagged the sign-in as &amp;lsquo;High&amp;rsquo; risk, the user could still sign in because MFA automatically remediated the sign-in risk (&lt;code&gt;userPassedMfaDrivenByRiskBasedPolicy&lt;/code&gt;).&lt;/p&gt;

&lt;h3 class="relative group"&gt;The bummer?
 &lt;div id="the-bummer" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-bummer" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="Report Only ID Protection Policy"
 src="https://nicolasuter.ch/content/images/2026/eidp/id-protection-report-only.png"
 &gt;&lt;/figure&gt;
&lt;p&gt;The environment had a Conditional Access policy in place that would have blocked users with high sign-in risk, but the policy was only in &lt;em&gt;report-only&lt;/em&gt; mode, so the user could sign in without any issues.&lt;/p&gt;</description></item></channel></rss>