# Microsoft Entra ID & Identity

This book section is for MS Entra ID &amp; Identity services documentation. Plus d<span>ocumentation for application authentication across the Tech Infrastructure stack, including SSO integrations, identity providers, authentication protocols, and configuration guidance.</span>

# OIDC SSO with Entra ID - Integration Guide

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="margin-left:36pt;border-collapse:collapse;border:none;width:86.0714%;height:126.562px;" title=""><tbody><tr style="height:25.3125px;"><td style="width:21.0531%;border:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Field</span>

</td><td style="width:78.9491%;border-top:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Details</span>

</td></tr><tr style="height:25.3125px;"><td style="width:21.0531%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Document Type</span>

</td><td style="width:78.9491%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">How-To Guide - SSO Integration</span>

</td></tr><tr style="height:25.3125px;"><td style="width:21.0531%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Applies To</span>

</td><td style="width:78.9491%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Microsoft Entra ID, Any OIDC-compatible SaaS or Third-Party Application</span>

</td></tr><tr style="height:25.3125px;"><td style="width:21.0531%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Audience</span>

</td><td style="width:78.9491%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">2nd Line / Systems Administrator / IT Engineer</span>

</td></tr><tr><td style="width:21.0531%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Author</span>

</td><td style="width:78.9491%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">AK. Udofeh</span>

</td></tr><tr style="height:25.3125px;"><td style="width:21.0531%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Last Updated</span>

</td><td style="width:78.9491%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">March 2026</span>

</td></tr></tbody></table>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Overview</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">This article covers how to configure Single Sign-On (SSO) using the OpenID Connect (OIDC) protocol between Microsoft Entra ID and any third-party or SaaS application that supports OIDC for authentication. It is intended for systems administrators who need to integrate enterprise applications with Entra ID to centralise identity management, enforce MFA, and control user access. The guide covers App Registration in Entra ID, redirect URI configuration, required API permissions, and the standard OIDC configuration values expected by most OIDC-compliant applications.</span>

<span style="color:rgb(255,255,255);"> </span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Root Cause</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">OIDC SSO works by delegating authentication to Entra ID as the Identity Provider (IdP). The application (Service Provider) redirects the user to Microsoft's authorisation endpoint, which authenticates the user and returns an ID token containing identity claims. The application then validates the token using signing keys retrieved from Microsoft's OIDC discovery document.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Common Failure Points</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Redirect URI mismatch between the application config and Entra App Registration</span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">OIDC Issuer URL malformed (e.g. missing </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">/v2.0</span><span style="font-size:12pt;font-family:pplxSerif, serif;">, or a full URL stored where only a GUID is expected)</span></span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Application server cannot reach Microsoft's discovery endpoint outbound</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">API permissions not granted admin consent in Entra</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Client secret expired or incorrect</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Auto-discovery disabled, causing the application to expect manually specified signing keys</span><span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Before You Start</span>**</span>

<table class="MsoNormalTable" id="bkmrk-check-where-you-have" style="margin-left:36pt;border-collapse:collapse;border:none;width:88.6905%;" title=""><tbody><tr><td style="width:60.8187%;border:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Check</span>

</td><td style="width:39.1813%;border-top:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Where</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">You have Global Administrator or Application Administrator rights in Entra ID</span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Entra ID → Roles and Administrators</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">The target application supports OIDC (not only SAML)</span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Application vendor documentation</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">You know the exact Redirect URI format expected by the application</span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Application vendor documentation</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="color:rgb(255,255,255);"><span style="font-family:pplxSans, serif;">Outbound HTTPS (port 443) from the application server to </span><span style="font-family:pplxSansMono, serif;">login.microsoftonline.com</span><span style="font-family:pplxSans, serif;"> is permitted</span></span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Firewall / network policy</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">You have admin access to the application's configuration settings</span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Application admin console or hosting environment</span>

</td></tr><tr><td style="width:60.8187%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">A client secret can be created and stored securely</span>

</td><td style="width:39.1813%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Azure Key Vault or organisation secrets manager</span>

</td></tr></tbody></table>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 1: Create an App Registration in Entra ID</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;"><span style="color:rgb(255,255,255);">Navigate to</span> </span><span style="font-size:12pt;">[<span style="font-family:unset, serif;color:#0000FF;">portal.azure.com</span>](https://portal.azure.com/)</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> <span style="color:rgb(255,255,255);">&gt; Entra ID &gt; App Registrations &gt; New Registration.</span></span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Enter a meaningful display name (e.g. </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">AppName SSO</span><span style="font-size:12pt;font-family:pplxSerif, serif;">).</span></span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Under Supported account types, select Accounts in this organisational directory only (Single tenant) unless multi-tenant access is required.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Leave the Redirect URI blank for now - you will add it in Step 3.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Click Register.</span>

<p class="callout info"><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">Note the following values from the</span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;"> </span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">Overview</span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;"> </span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">page </span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;">-</span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;"> you will need these later:</span></p>

<p class="callout info"><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">• Application (client) ID - this is your OIDC Client ID  
• Directory (tenant) ID - this is used to construct your OIDC Issuer URL  
</span></p>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 2: Create a Client Secret</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Inside the App Registration, go to Certificates &amp; Secrets &gt; Client Secrets &gt; New client secret.</span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Enter a description (e.g. </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">AppName OIDC Secret</span><span style="font-size:12pt;font-family:pplxSerif, serif;">) and set an appropriate expiry period.</span></span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Click Add.</span>

<p class="callout warning"><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">Copy the secret</span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;"> </span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">Value</span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;"> </span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;">immediately </span><span style="font-size:12pt;line-height:115%;font-family:Cambria, serif;">-</span><span style="font-size:12pt;line-height:115%;font-family:pplxSerif, serif;"> it will not be displayed again after you navigate away. Store it securely in a secrets manager or vault.</span></p>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 3: Configure the Redirect URI</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Inside the App Registration, go to Authentication &gt; Add a platform &gt; Web.</span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Enter the Redirect URI in the format specified by your application's documentation. A common pattern is:</span>` https://<your-app-domain>/oidc/callback` </span>
    - <p class="callout warning">This value must exactly match what the application expects. Refer to the application's OIDC integration documentation for the precise path. Common variants include /auth/callback, /sso/callback, and /oauth/callback.</p>
    - <p class="callout warning">  
        Ensure "Access tokens" and "ID tokens" under Implicit grant and hybrid flows are NOT ticked unless the application vendor explicitly requires them.  
        Click Save.  
        </p>
    - <p class="callout info">Confirm the Redirect URI appears under Redirect URI configuration with Platform Type: Web.</p>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 4: Grant API Permissions</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Go to API Permissions &gt; Add a permission &gt; Microsoft Graph &gt; Delegated permissions.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Add the following permissions:</span>

<table class="MsoNormalTable" id="bkmrk-permission-purpose-o" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:64.95pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Permission</span>

</td><td style="width:187pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Purpose</span>

</td></tr><tr><td style="width:63.5pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;color:rgb(255,255,255);">openid</span>

</td><td style="width:188.35pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Required - enables OIDC sign-in</span>

</td></tr><tr><td style="width:63.5pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;color:rgb(255,255,255);">profile</span>

</td><td style="width:193.4pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Provides basic profile claims (name, etc.)</span>

</td></tr><tr><td style="width:63.5pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;color:rgb(255,255,255);">email</span>

</td><td style="width:188.35pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Provides the user's email address claim</span>

</td></tr></tbody></table>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Click Grant admin consent for &lt;your tenant&gt; and confirm.</span>

<p class="callout info"><span style="font-size:12pt;font-family:pplxSerif, serif;">All three permissions should show a green tick with</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">"Granted for &lt;tenant&gt;"</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">status.</span></p>

<span style="color:rgb(255,255,255);"> </span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 5: Configure the Application</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Add the following configuration values to your application. The exact setting names vary per application — refer to your application's OIDC documentation. The values below represent the standard OIDC parameters used across most platforms:</span>

<table class="MsoNormalTable" id="bkmrk-configuration-key-va" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Configuration Key</span>

</td><td style="width:300.9pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Value</span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Auth Method / SSO Protocol</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;color:rgb(255,255,255);">oidc</span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Client ID</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Application (client) ID from Entra App Registration</span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Client Secret</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Secret value created in Step 2</span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Issuer URL</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">[<span style="color:#0000FF;">https://login.microsoftonline.com/&lt;Directory</span>](https://login.microsoftonline.com/%3CDirectory) <span style="color:rgb(255,255,255);">(tenant) ID&gt;/v2.0</span></span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Auto-Discovery</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="color:rgb(255,255,255);"><span style="font-family:pplxSansMono, serif;">true</span><span style="font-family:pplxSans, serif;"> (recommended — eliminates need to manually specify endpoints)</span></span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Redirect / Callback URI</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Must match exactly what was registered in Step 3</span>

</td></tr><tr><td style="width:134.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Scopes</span>

</td><td style="width:300.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;color:rgb(255,255,255);">openid profile email</span>

</td></tr></tbody></table>

<p class="callout warning"><span style="font-size:12pt;font-family:pplxSerif, serif;">Critical: </span><span style="font-size:12pt;font-family:pplxSerif, serif;">Issuer URL format:</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">The Issuer URL must contain only the tenant GUID in the path and must end with </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">/v2.0</span><span style="font-size:12pt;font-family:pplxSerif, serif;">. A common misconfiguration is storing a full URL in a variable and substituting it into the Issuer field, producing a doubled path such as </span><span style="font-size:12pt;">[<span style="font-family:pplxSansMono, serif;color:#0000FF;">https://login.microsoftonline.com/https://login.../v2.0/v2.0</span>](https://login.microsoftonline.com/https:/login.../v2.0/v2.0)</span><span style="font-size:12pt;font-family:pplxSerif, serif;">. This will cause discovery to fail. </span><span style="font-size:12pt;font-family:pplxSerif, serif;">Correct format: </span><span style="font-size:12pt;font-family:inherit, serif;color:#686a69;">[<span style="color:#0000FF;">https://login.microsoftonline.com/e21b46c3-367f-4ced-b138-2c57e76746f6/v2.0</span>](https://login.microsoftonline.com/e21b46c3-349f-4ced-b138-29d7e76746f6/v2.0)</span></p>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 6: Restrict Access via Enterprise Application (Recommended)</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">By default, any user in your Entra tenant can attempt SSO into the application. To restrict access to specific users or groups:</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">In Entra ID, go to Enterprise Applications &gt; find your application by display name.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Go to Properties &gt; set "Assignment required?" to Yes &gt; Save.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Go to Users and groups &gt; Add user/group &gt; assign the relevant users or Entra security groups.</span>

<p class="callout success"><span style="font-size:12pt;font-family:pplxSerif, serif;">Only assigned users will be permitted to authenticate. All others will receive an Entra-side access denied message before reaching the application.</span></p>

<span> </span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 7: Optional: Group-to-Role Synchronisation</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">If the application supports mapping identity provider groups to application roles, you can automate role assignment via Entra group membership:</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">In the App Registration &gt; Token configuration &gt; Add groups claim &gt; select Security groups &gt; Save.</span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">In the application's OIDC settings, enable group synchronisation and set the groups claim name to </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">groups</span><span style="font-size:12pt;font-family:pplxSerif, serif;">.</span></span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">In the application's role configuration, map each role to the corresponding Entra group Object ID (GUID).</span>

<p class="callout warning"><span style="font-size:12pt;font-family:pplxSerif, serif;">Entra sends group</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">Object IDs, not display names, in the token. Always use the group's Object ID when mapping groups to application roles -</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> not the group's display name.</span></p>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Troubleshooting</span>**</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSansMono, serif;">OIDC Discovery Error</span><span style="font-size:18pt;font-family:pplxSerif, serif;"> / Discovery endpoint unreachable</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** The application cannot fetch the OIDC discovery document from Microsoft, or the Issuer URL is malformed.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;"><span style="color:rgb(255,255,255);">Verify the Issuer URL is not doubled &gt; check error messages for patterns like</span> </span><span style="color:rgb(255,255,255);"><span style="font-size:12pt;">[<span style="font-family:pplxSansMono, serif;">https://login.microsoftonline.com/https://</span>](https://login.microsoftonline.com/https:/)</span><span style="font-size:12pt;font-family:pplxSansMono, serif;">...</span></span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the Issuer URL ends with </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">/v2.0</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> and contains only the tenant GUID (not a full URL).</span></span>
    - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Test outbound connectivity from the application server to Microsoft:</span> </span>

<span style="font-size:12pt;font-family:pplxSansMono, serif;color:rgb(255,255,255);">bash</span>

`<span style="font-size:12pt;font-family:inherit, serif;color:#686a69;">curl -s "<a href="https://login.microsoftonline.com/%3Ctenant-id%3E/v2.0/.well-known/openid-configuration"><span style="color:#0000FF;">https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration</span></a>" | head -c 200</span>`

- - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">If the </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">curl</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> fails, verify firewall rules permit outbound HTTPS (port 443) to </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">login.microsoftonline.com</span><span style="font-size:12pt;font-family:pplxSerif, serif;">.</span></span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSansMono, serif;">Missing required configuration "keys" value</span><span style="font-size:18pt;font-family:pplxSerif, serif;"> or similar</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** Auto-discovery is disabled or not correctly configured. The application is expecting manually specified JWKS signing keys.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Ensure auto-discovery is enabled in the application's OIDC settings.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Confirm the Issuer URL is correct - a malformed URL will cause discovery to silently fail.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Clear the application's configuration cache and restart the service.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSansMono, serif;">redirect\_uri\_mismatch</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** The Redirect URI registered in Entra does not exactly match the callback URL the application is generating or sending.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="color:rgb(255,255,255);"><span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the application's configured domain uses </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">https://</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> and matches exactly.</span></span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Update the Redirect URI in Entra: App Registration &gt; Authentication &gt; Web &gt; Edit.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Ensure no trailing slashes, port numbers, or scheme mismatches exist between the two values.</span>

<span style="color:rgb(255,255,255);">**<span> </span><span style="font-size:18pt;font-family:pplxSansMono, serif;">invalid\_client</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** The Client ID or Client Secret is incorrect, or the client secret has expired.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Verify the Client ID matches the Application (client) ID in the App Registration overview not the Object ID or any other GUID.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Check the secret expiry date in Certificates &amp; Secrets - create a new secret if expired.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Confirm the secret Value is used (not the Secret ID, which is a different field).</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">User authenticates successfully in Entra but receives an error or no access in the application</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** The user account was provisioned in the application with no role or permissions assigned.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Log in to the application as an administrator.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Assign an appropriate role to the SSO-provisioned user account.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">To automate this for future users, configure a default role for SSO-registered accounts in the application's settings, or implement group-to-role synchronisation (Step 7).</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSansMono, serif;">invalid\_grant</span><span style="font-size:18pt;font-family:pplxSerif, serif;"> or token validation failure</span>**</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">**Cause:** Clock skew between the application server and Microsoft's servers, or the authorisation code was already consumed.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Ensure the application server's system clock is synchronised via NTP. A skew of more than 5 minutes will cause token validation to fail.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;color:rgb(255,255,255);">Confirm the application is not attempting to reuse an authorisation code - these are single-use and expire within seconds.</span>

<span style="color:rgb(255,255,255);">**<span style="font-size:18pt;font-family:pplxSerif, serif;">Expected Outcome</span>**</span>

<table class="MsoNormalTable" id="bkmrk-factor-detail-resolu" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:92.25pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="color:rgb(255,255,255);">**<span style="font-family:pplxSans, serif;">Factor</span>**</span>

</td><td style="width:342.85pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;"><span style="color:rgb(255,255,255);">**<span style="font-family:pplxSans, serif;">Detail</span>**</span>

</td></tr><tr><td style="width:92.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Resolution Time</span>

</td><td style="width:342.85pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">30–60 minutes for initial configuration; 15 minutes for troubleshooting known issues</span>

</td></tr><tr><td style="width:92.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">User Impact</span>

</td><td style="width:342.85pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Zero - SSO login is additive; existing local accounts remain functional during migration</span>

</td></tr><tr><td style="width:92.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Recurrence Risk</span>

</td><td style="width:342.85pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Low - primary recurring issue is client secret expiry; set a calendar reminder before the secret's expiry date</span>

</td></tr><tr><td style="width:92.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Ongoing Maintenance</span>

</td><td style="width:342.85pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;color:rgb(255,255,255);">Rotate client secrets before expiry; manage user access via Enterprise Application user/group assignments</span>

</td></tr></tbody></table>

# SAML v2.0 SSO with Entra ID - Integration Guide

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:82.95pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;">**Field**</td><td style="width:348.2pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;">**<span style="font-family:pplxSans, serif;">Details</span>**

</td></tr><tr><td style="width:84.3pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Document Type</span>

</td><td style="width:346.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">How-To Guide: SSO Integration</span>

</td></tr><tr><td style="width:82.95pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Applies To</span>

</td><td style="width:353.15pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Microsoft Entra ID, Any SAML 2.0-compatible SaaS or Third-Party Application</span>

</td></tr><tr><td style="width:82.95pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Audience</span>

</td><td style="width:348.2pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">2nd Line / Systems Administrator / IT Engineer</span>

</td></tr><tr><td style="width:82.95pt;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;"><span style="font-family:pplxSans, serif;">Author</span>

</td><td style="width:348.2pt;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;"><span style="font-family:pplxSans, serif;">AK. Udofeh</span>

</td></tr><tr><td style="width:82.95pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Last Updated</span>

</td><td style="width:348.2pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">March 2026</span>

</td></tr></tbody></table>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Overview</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">This article covers how to configure Single Sign-On (SSO) using the SAML 2.0 protocol between Microsoft Entra ID and any third-party or SaaS application that supports SAML for authentication. It is intended for systems administrators who need to integrate enterprise applications with Entra ID to centralise identity management, enforce MFA, and control user access. The guide covers Enterprise Application creation in Entra ID, SAML endpoint configuration, certificate handling, and attribute claim mapping.</span>

<span> </span>

<span style="font-size:12pt;font-family:pplxSerif, serif;">SAML SSO works by delegating authentication to Entra ID as the Identity Provider (IdP). The application (Service Provider / SP) redirects the user to Entra's SAML endpoint, which authenticates the user and returns a signed SAML assertion containing identity attributes. The application validates the assertion signature using Entra's signing certificate and establishes a user session.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Common Failure Points</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Incorrect ACS (Assertion Consumer Service) URL registered in Entra</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Entity ID mismatch between the application and Entra configuration</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Entra signing certificate not imported into the application, or certificate has expired</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Attribute claims not mapping to the fields the application expects</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">SLO (Single Logout) URL misconfigured, causing logout failures</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">User not assigned to the Enterprise Application in Entra</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Before You Start</span>**

<table class="MsoNormalTable" id="bkmrk-check-where-you-have" style="margin-left:36pt;border-collapse:collapse;border:none;width:95%;height:189.875px;" title=""><tbody><tr style="height:25.3125px;"><td style="width:50%;border:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;">**<span style="font-family:pplxSans, serif;">Check</span>**

</td><td style="width:50%;border-top:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:none;padding:2pt 3pt;height:25.3125px;">**<span style="font-family:pplxSans, serif;">Where</span>**

</td></tr><tr style="height:44.3125px;"><td style="width:50%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:44.3125px;"><span style="font-family:pplxSans, serif;">You have Global Administrator or Application Administrator rights in Entra ID</span>

</td><td style="width:50%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:44.3125px;"><span style="font-family:pplxSans, serif;">Entra ID &gt; Roles and Administrators</span>

</td></tr><tr style="height:25.3125px;"><td style="width:50%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">The target application supports SAML 2.0 (not only OIDC)</span>

</td><td style="width:50%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">Application vendor documentation</span>

</td></tr><tr style="height:25.3125px;"><td style="width:50%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">You have the application's ACS URL, Entity ID, and SLO URL</span>

</td><td style="width:50%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">Application vendor documentation or SP metadata XML</span>

</td></tr><tr style="height:44.3125px;"><td style="width:50%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:44.3125px;"><span style="font-family:pplxSans, serif;">Outbound HTTPS (port 443) from the application server to </span><span style="font-family:pplxSansMono, serif;">login.microsoftonline.com</span><span style="font-family:pplxSans, serif;"> is permitted</span>

</td><td style="width:50%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:44.3125px;"><span style="font-family:pplxSans, serif;">Firewall / network policy</span>

</td></tr><tr style="height:25.3125px;"><td style="width:50%;border-right:1pt solid rgb(163,163,163);border-bottom:1pt solid rgb(163,163,163);border-left:1pt solid rgb(163,163,163);border-top:none;padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">You have admin access to the application's configuration</span>

</td><td style="width:50%;border-top:none;border-left:none;border-bottom:1pt solid rgb(163,163,163);border-right:1pt solid rgb(163,163,163);padding:2pt 3pt;height:25.3125px;"><span style="font-family:pplxSans, serif;">Application admin console or hosting environment</span>

</td></tr></tbody></table>

<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 1: Create an Enterprise Application in Entra ID</span>

<p class="callout info"><span style="font-size:12pt;font-family:pplxSerif, serif;">For SAML SSO, configuration is done through</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">Enterprise Applications, not App Registrations. An App Registration is created automatically in the background.</span></p>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Navigate to </span><span style="font-size:12pt;color:rgb(53,152,219);">[<span style="font-family:unset, serif;">portal.azure.com</span>](https://portal.azure.com/)</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> &gt; Entra ID &gt; Enterprise Applications &gt; New application.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Click Create your own application.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Enter a display name (e.g. </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">AppName SAML SSO</span><span style="font-size:12pt;font-family:pplxSerif, serif;">).</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Select "Integrate any other application you don't find in the gallery".</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Click Create.</span>

<p class="callout success"><span style="font-size:12pt;font-family:pplxSerif, serif;"> You will be taken to the application overview page.</span></p>

<span> </span>

<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 2: Configure SAML Settings</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Inside the Enterprise Application, go to Single Sign-On &gt; SAML.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Click Edit on the Basic SAML Configuration panel.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Fill in the following fields using values from your application's documentation or SP metadata:</span><span style="font-family:pplxSans, serif;">Identifier (Entity ID)\*: <span style="font-family:pplxSansMono, serif;color:rgb(53,152,219);">[https://app.yourdomain.com/saml/metadata](https://app.yourdomain.com/saml/metadata)</span></span>
        
        <span style="font-family:pplxSans, serif;">(this is a Unique URI that identifies the Service Provider)</span>
        
        <span style="font-family:pplxSans, serif;">Reply URL </span><span style="color:rgb(221,221,221);font-family:'-apple-system', BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Roboto, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;font-size:0.94em;font-weight:400;">(Assertion Consumer Service URL)\*: <span style="font-family:pplxSansMono, serif;color:rgb(53,152,219);">[https://app.yourdomain.com/saml/acs](https://app.yourdomain.com/saml/acs)</span></span><span style="font-family:pplxSans, serif;">(this is where Entra ID posts the signed SAML assertion)</span>
        
        <div class="azc-required-balloon fxc-base azc-control azc-dockedballoon-requiredwidget azc-dockedballoon-required"><div class="azc-dockedballoon-anchor"><div class="azc-required-anchor"></div></div></div><span style="font-family:pplxSans, serif;">Sign-on URL (optional): <span style="font-family:pplxSansMono, serif;color:rgb(53,152,219);">[https://app.yourdomain.com/login](https://app.yourdomain.com/login)</span></span>
        
        <span style="font-family:pplxSans, serif;">(SP-initiated login entry point)</span>
        
        <span style="font-family:pplxSans, serif;">Logout URL (optional): <span style="font-family:pplxSansMono, serif;color:rgb(53,152,219);">[https://app.yourdomain.com/saml/sls](https://app.yourdomain.com/saml/sls)</span></span>
        
        <span style="font-family:pplxSans, serif;">(SP's Single Logout endpoint)</span>

<p class="callout info"><span style="font-size:12pt;font-family:pplxSerif, serif;">If the application provides a metadata XML URL (e.g<span style="color:rgb(53,152,219);">. </span></span><span style="font-size:12pt;color:rgb(53,152,219);">[<span style="font-family:pplxSansMono, serif;">https://app.yourdomain.com/saml/metadata</span>](https://app.yourdomain.com/saml/metadata)</span><span style="font-size:12pt;font-family:pplxSerif, serif;"><span style="color:rgb(53,152,219);">), </span>Entra can import these values automatically — click Upload metadata file at the top of the Basic SAML Configuration panel.</span></p>

<p class="callout info"><span style="font-size:12pt;font-family:pplxSerif, serif;">Click Save.</span></p>

<span> </span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 3: Download the Entra Signing Certificate</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Still in the SAML configuration view, scroll to Section 3 &gt; SAML Certificates.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Download Certificate (Base64) &gt; this produces a </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">.cer</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> or </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">.pem</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> file.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Open the file in a text editor. The content between </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">-----BEGIN CERTIFICATE-----</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> and </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">-----END CERTIFICATE-----</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> is the base64-encoded certificate value you will need for the application.</span>

<p class="callout warning"><span style="font-size:12pt;font-family:pplxSerif, serif;">Store a copy of this certificate securely. If Entra's signing certificate is rotated (e.g. on expiry), the application will fail to validate assertions until the new certificate is imported.</span></p>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 4: Collect IdP Configuration Values</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">In the SAML configuration page, note the following values in the "Set up &lt;app name&gt;":</span>

<table class="MsoNormalTable" id="bkmrk-value-description-lo" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:98.65pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Value</span>

</td><td style="width:336.55pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Description</span>

</td></tr><tr><td style="width:98.65pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Login URL</span>

</td><td style="width:336.55pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Entra's SAML SSO endpoint - set as the IdP SSO URL in the application</span>

</td></tr><tr><td style="width:98.65pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Logout URL</span>

</td><td style="width:336.55pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Entra's SAML SLO endpoint - set as the IdP SLO URL in the application</span>

</td></tr><tr><td style="width:98.65pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Entra ID Identifier</span>

</td><td style="width:336.55pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Entra's Entity ID - set as the IdP Entity ID in the application</span>

</td></tr><tr><td style="width:98.65pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Certificate (Base64)</span>

</td><td style="width:336.55pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Signing certificate from Step 3 - used by the application to validate assertions</span>

</td></tr></tbody></table>

<span style="font-size:12pt;font-family:pplxSerif, serif;">Alternatively, download the Federation Metadata XML from the same section - many applications can import this file directly to auto-populate all IdP settings.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 5: Configure Attribute Claims in Entra</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">By default, Entra sends a standard set of SAML attribute claims. Verify these match what the application expects:</span>

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">In the Enterprise Application SAML configuration, click Edit on Section 2 - Attributes &amp; Claims.</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;"> The default claims sent by Entra are:</span>

<table class="MsoNormalTable" id="bkmrk-claim-name-value-ema" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:73.8pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;">**<span style="font-family:pplxSans, serif;">Claim Name</span>**

</td><td style="width:111.9pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;">**<span style="font-family:pplxSans, serif;">Value</span>**

</td></tr><tr><td style="width:75.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">emailaddress</span>

</td><td style="width:110.5pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">user.mail</span>

</td></tr><tr><td style="width:73.8pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">givenname</span>

</td><td style="width:111.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">user.givenname</span>

</td></tr><tr><td style="width:73.8pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">surname</span>

</td><td style="width:111.9pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">user.surname</span>

</td></tr><tr><td style="width:73.8pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">name</span>

</td><td style="width:116.95pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">user.userprincipalname</span>

</td></tr></tbody></table>

- <span style="font-size:12pt;font-family:pplxSerif, serif;">If the application requires different attribute names or additional claims, click Add new claim to add or rename them.</span>
- <span style="font-size:12pt;font-family:pplxSerif, serif;">To include group membership in the assertion (for role mapping), click Add a group claim &gt; select Security groups.</span>

<p class="callout warning"><span style="font-size:12pt;font-family:pplxSerif, serif;">By default, Entra sends group</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">Object IDs</span><span style="font-size:12pt;font-family:Cambria, serif;"> </span><span style="font-size:12pt;font-family:pplxSerif, serif;">(GUIDs) in the group claim, not display names. Configure the application's role mapping to use Object IDs, or change the group claim's source attribute to display names if supported.</span></p>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 6: Restrict Access via Enterprise Application (Recommended)</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">In the Enterprise Application, go to Properties.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Set "Assignment required?" to Yes &gt; Save.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Go to Users and groups &gt; Add user/group &gt; assign the relevant users or Entra security groups.</span><p class="callout success">Only assigned users will be permitted to authenticate via SAML SSO. Unassigned users receive an Entra-side access denied error before reaching the application.</p>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Step 7: Configure the Application</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">In the Service Provider application, enter the values collected in Step 4 into the application's SAML configuration. The exact setting names vary per application - refer to the application vendor's SAML documentation. The standard SAML parameters are:</span>

<table class="MsoNormalTable" id="bkmrk-application-setting-" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Application Setting</span>

</td><td style="width:289.75pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Value to Enter</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">IdP Entity ID</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Entra ID Identifier from Step 4</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">IdP SSO URL</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Login URL from Step 4</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">IdP SLO URL</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Logout URL from Step 4</span>

</td></tr><tr><td style="width:106.65pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">IdP X.509 Certificate</span>

</td><td style="width:288.3pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Certificate base64 content from Step 3</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">SP Entity ID</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Must match the Identifier (Entity ID) entered in Entra Step 2</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">ACS URL</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Must match the Reply URL entered in Entra Step 2</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Name ID Format</span>

</td><td style="width:294.7pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">emailAddress</span><span style="font-family:pplxSans, serif;"> or </span><span style="font-family:pplxSansMono, serif;">persistent</span><span style="font-family:pplxSans, serif;"> - check application documentation</span>

</td></tr><tr><td style="width:105.25pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Binding</span>

</td><td style="width:289.75pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSansMono, serif;">HTTP-POST</span><span style="font-family:pplxSans, serif;"> for ACS; </span><span style="font-family:pplxSansMono, serif;">HTTP-Redirect</span><span style="font-family:pplxSans, serif;"> for AuthnRequest</span>

</td></tr></tbody></table>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">=========================Troubleshooting====================</span>**

<span style="font-size:18pt;font-family:pplxSansMono, serif;">AADSTS750054: SAMLRequest or SAMLResponse must be present as query string parameters</span>

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The application is not correctly forming the SAML AuthnRequest, or the binding type does not match Entra's expectation.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the application is using HTTP Redirect binding for the AuthnRequest - Entra requires this for SP-initiated flows.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Check the application's SAML configuration for a "request binding" or "binding type" setting and ensure it is set to </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">HTTP-Redirect</span><span style="font-size:12pt;font-family:pplxSerif, serif;">.</span>

**<span style="font-size:18pt;font-family:pplxSansMono, serif;">AADSTS70011: The provided value for the input parameter 'redirect\_uri' is not valid</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The ACS URL registered in Entra does not match the URL the application is posting to.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Retrieve the application's SP metadata from its metadata URL or admin panel.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Compare the </span><span style="font-size:12pt;font-family:pplxSansMono, serif;">AssertionConsumerService</span><span style="font-size:12pt;font-family:pplxSerif, serif;"> URL in the metadata against the Reply URL (ACS URL) registered in Entra.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Update the Reply URL in Entra to match exactly - including scheme (</span><span style="font-size:12pt;font-family:pplxSansMono, serif;">https://</span><span style="font-size:12pt;font-family:pplxSerif, serif;">), full path, and no trailing slash.</span>

**<span style="font-size:18pt;font-family:pplxSansMono, serif;">AADSTS750057: Invalid SAML response or no SAML response</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The Entity ID in the application does not match what is registered in Entra, or the SAML response is malformed.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the SP Entity ID configured in the application exactly matches the Identifier (Entity ID) in Entra.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the IdP Entity ID configured in the application matches the Entra ID Identifier shown in Section 4 of the Entra SAML page.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">These values are case-sensitive and must match character for character.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Assertion signature validation fails / </span><span style="font-size:18pt;font-family:pplxSansMono, serif;">Invalid signature</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The X.509 certificate used for validation in the application does not match the current Entra signing certificate, or the certificate has expired.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">In the Enterprise Application SAML configuration &gt; Certificates &gt; check the expiry date of the active certificate.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">If expired or rotated, click New Certificate, make it active, and download the new Base64 certificate.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Import the new certificate into the application's SAML configuration.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Restart the application service if required.</span>

<p class="callout warning"><span style="font-size:12pt;font-family:pplxSerif, serif;">Entra signing certificates expire every 3 years by default. Set a calendar reminder 60 days before expiry to plan a rotation window.</span></p>

<span> </span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Single Logout (SLO) does not work - user remains signed in to Entra after signing out of the application</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The SLO URL is not configured in either Entra or the application, or the binding types do not match.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the Logout URL field in Entra's Basic SAML Configuration points to the application's SLO endpoint.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Confirm the application's IdP SLO URL is set to the Logout URL shown in Entra Section 4.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Entra uses HTTP Redirect binding for logout requests - confirm the application's SLO endpoint accepts GET/Redirect binding, not only POST.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">User authenticates successfully in Entra but receives an error or no access in the application</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The SAML assertion was accepted, but the user account was provisioned with no role or permissions in the application.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">Log in to the application as an administrator.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Assign an appropriate role to the SSO-provisioned user account.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">To automate this for future users, configure a default role for SSO-registered accounts, or implement group-to-role mapping using the group claim configured in Step 6.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Attribute claims are empty or not recognised by the application</span>**

<span style="font-size:12pt;font-family:pplxSerif, serif;">**Cause:** The attribute claim names sent by Entra do not match the names the application is expecting.</span>

**<span style="font-size:12pt;font-family:pplxSerif, serif;">Resolution:</span>**

- - <span style="font-size:12pt;font-family:pplxSerif, serif;">In Entra → Enterprise Application &gt; Attributes &amp; Claims, note the full claim URI names being sent (e.g. </span><span style="font-size:12pt;color:rgb(53,152,219);">[<span style="font-family:pplxSansMono, serif;">http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress</span>](http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress)</span><span style="font-size:12pt;font-family:pplxSerif, serif;"><span style="color:rgb(53,152,219);">)</span>.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Cross-reference these with the application's expected attribute names from the vendor documentation.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Either rename claims in Entra to match the application, or update the application's attribute mapping to match Entra's output.</span>
    - <span style="font-size:12pt;font-family:pplxSerif, serif;">Use a SAML tracer browser extension or the application's debug mode to inspect the raw assertion during a test login.</span>

**<span style="font-size:18pt;font-family:pplxSerif, serif;">Expected Outcome</span>**

<table class="MsoNormalTable" id="bkmrk-factor-detail-resolu" style="margin-left:36pt;border-collapse:collapse;border:none;" title=""><tbody><tr><td style="width:93.45pt;border:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;">**<span style="font-family:pplxSans, serif;">Factor</span>**

</td><td style="width:341.65pt;border:solid #A3A3A3 1pt;border-left:none;padding:2pt 3pt 2pt 3pt;">**<span style="font-family:pplxSans, serif;">Detail</span>**

</td></tr><tr><td style="width:93.45pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Resolution Time</span>

</td><td style="width:346.6pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">45–90 minutes for initial configuration; additional time if attribute mapping requires investigation</span>

</td></tr><tr><td style="width:93.45pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">User Impact</span>

</td><td style="width:341.65pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Zero - SAML SSO is additive; existing local accounts remain functional during migration</span>

</td></tr><tr><td style="width:93.45pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Recurrence Risk</span>

</td><td style="width:341.65pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Low - primary recurring issue is Entra signing certificate expiry (every 3 years by default)</span>

</td></tr><tr><td style="width:93.45pt;border:solid #A3A3A3 1pt;border-top:none;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Ongoing Maintenance</span>

</td><td style="width:341.65pt;border-top:none;border-left:none;border-bottom:solid #A3A3A3 1pt;border-right:solid #A3A3A3 1pt;padding:2pt 3pt 2pt 3pt;"><span style="font-family:pplxSans, serif;">Rotate Entra signing certificate before expiry; manage user access via Enterprise Application assignments</span>

</td></tr></tbody></table>

# WebApp Authentication with Social IDPs (Google, Facebook & Apple ID)

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:78.2143%;height:200px;" title=""><tbody><tr style="height:29.7969px;"><td style="width:16.2614%;height:29.7969px;">**Field**

</td><td style="width:83.7386%;height:29.7969px;">**Details**

</td></tr><tr style="height:46.5938px;"><td style="width:16.2614%;height:46.5938px;">Document Type

</td><td style="width:83.7386%;height:46.5938px;">Runbook / How-To Guide

</td></tr><tr style="height:46.5938px;"><td style="width:16.2614%;height:46.5938px;">Applies To

</td><td style="width:83.7386%;height:46.5938px;">Microsoft Entra ID External Identities (CIAM), Social Identity Providers (Google, Facebook, Apple), Third-party Web Applications

</td></tr><tr style="height:29.7969px;"><td style="width:16.2614%;height:29.7969px;">Audience

</td><td style="width:83.7386%;height:29.7969px;">Systems Administrators / Identity Engineers / 2nd Line Support

</td></tr><tr style="height:29.7969px;"><td style="width:16.2614%;height:29.7969px;">Author

</td><td style="width:83.7386%;height:29.7969px;">AK. Udofeh

</td></tr><tr style="height:46.5938px;"><td style="width:16.2614%;height:46.5938px;">Last Updated

</td><td style="width:83.7386%;height:46.5938px;">March 2026

</td></tr></tbody></table>

##### **Overview**

##### This guide documents how to integrate Social Identity Providers (Google, Facebook, and Apple) with a SAML-based web application for authentication using Microsoft Entra ID External Identities and Customer Identity &amp; Access Management (CIAM). The configuration allows users to authenticate using social accounts while Microsoft Entra acts as the identity broker and issues a SAML assertion to the third-party or line-of-business (LOB) web application.

##### The process involves creating an external tenant, registering social identity providers, creating a user flow, configuring a SAML enterprise application, and updating the application configuration.

##### **The Issue**

##### Organisations often require users to authenticate using Social Identities (e.g. Google or Facebook) while maintaining a centralised identity broker for security and policy enforcement.

##### Without a configured identity broker:

- ##### Applications must integrate individually with each social provider.
- ##### Identity attributes are inconsistent between providers.
- ##### Access control and auditing become difficult to manage.

##### Basic authentication methods such as:

- ##### Local application accounts
- ##### Direct OAuth integration within the application

##### do not provide centralised identity management or federation capabilities.

##### Using Microsoft Entra External Identities resolves this by brokering authentication from social providers and issuing a standard SAML assertion to the application.

##### [![Authentication via Socials IDP.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/jzrauthentication-via-socials-idp.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/jzrauthentication-via-socials-idp.png)

##### **Context**

##### Modern applications often require authentication from multiple identity providers while maintaining centralised access control.

##### Without a broker, the authentication flow typically looks like this:

```powershell
User
  ↓
Application
  ↓
Direct OAuth with Google/Facebook
```

##### **This causes several issues:**

- ##### Applications must implement provider-specific authentication logic
- ##### Identity attributes differ between providers
- ##### Access control cannot be centrally enforced

##### Using Microsoft Entra External Identities introduces an identity broker layer:

```powershell
User
  ↓
Google / Facebook / Apple
  ↓  (OAuth / OIDC)
Microsoft Entra External Tenant (CIAM)
  ↓  (User Flow)
Enterprise Application (SAML)
  ↓
Flask Web Application
```

##### In this architecture:

- ##### Social providers authenticate the user.
- ##### Entra External Identities brokers the authentication.
- ##### A SAML assertion is issued to the web application.

##### Before You Start

<table id="bkmrk-check-where-external" style="height:220px;width:80.9524%;"><thead><tr><th style="width:49.9265%;">##### Check

</th><th style="width:49.9265%;">##### Where

</th></tr></thead><tbody><tr><td style="width:49.9265%;">##### External tenant created

</td><td style="width:49.9265%;">##### Microsoft Entra admin centre

</td></tr><tr><td style="width:49.9265%;">##### Azure subscription linked

</td><td style="width:49.9265%;">##### Tenant creation wizard

</td></tr><tr><td style="width:49.9265%;">##### Google Developer Console account

</td><td style="width:49.9265%;">##### console.cloud.google.com

</td></tr><tr><td style="width:49.9265%;">##### Meta Developer account

</td><td style="width:49.9265%;">##### developers.facebook.com

</td></tr><tr><td style="width:49.9265%;">##### Apple Developer account (optional)

</td><td style="width:49.9265%;">##### developer.apple.com

</td></tr><tr><td style="width:49.9265%;">##### SAML web application deployed

</td><td style="width:49.9265%;">##### Flask service

</td></tr><tr><td style="width:49.9265%;">##### Service Provider metadata configured

</td><td style="width:49.9265%;">##### `settings.json`

</td></tr></tbody></table>

#### **Implementation Steps (Per Environment)**

#### **Phase 1 - Create External Tenant**

##### Step 1: Sign in to the Microsoft Entra admin centre:

##### [https://entra.microsoft.com](https://entra.microsoft.com) 

##### Navigate to:

```
Microsoft Entra ID> Overview> Manage Tenants
```

#### Click:

```powershell
Create> External
```

##### Enter the tenant details:

- ##### Tenant Name: &lt;Your tenant name&gt;
- ##### Domain Name: &lt;Your domain name&gt;
- ##### Location: Europe or Africa
- ##### Subscription: Azure subscription

##### Click:

```powershell
Review + Create> Create
```

##### Provisioning may take up to **30 minutes**.

##### Switch to the new tenant:

```powershell
Settings> Directories + Subscriptions> Switch
```

#### **Phase 2 - Add Social Identity Providers**

##### Navigate to:

```powershell
External Identities
> All Identity Providers
```

#### **Integrate with Google Identity Provider**

##### **Step 1: Configure Google OAuth**

##### Visit: [https://console.cloud.google.com/](https://console.cloud.google.com/) 

##### In Google Cloud Console:

```powershell
APIs & Services
> Credentials
> OAuth2 Client ID
```

##### Fill in the Name of the Webapp

##### Add the Authorized redirect URI:

```powershell
https://<tenant-subdomain>.ciamlogin.com/<tenant-subdomain>.onmicrosoft.com/federation/oauth2
```

Copy the following values and keep is save

```powershell
> Client ID
> Client Secret
```

##### **Step 2: Register Google as Idp in Entra ID**

##### In Entra ID (Ext tenant directory) navigate to:

```powershell
External Identities
> All Identity Providers
```

##### Enter:

```powershell
Client ID
Client Secret
```

##### Click:

```powershell
Save
```

#### **Integrate with Facebook Identity Provider**

##### Step 1: Create Meta Developer App

##### Visit to:

##### [https://developers.facebook.com](https://developers.facebook.com) 

##### Select:

```powershell
My Apps > Create App
```

##### Choose:

```powershell
Authenticate and request data from users with Facebook Login
```

##### Select platform:

```powershell
Web
```

##### Add redirect URI:

```powershell
https://<tenant-subdomain>.ciamlogin.com/<tenant-subdomain>.onmicrosoft.com/federation/oauth2
```

##### In **App Settings &gt; Basic**, copy:

```powershell
App ID
App Secret
```

##### Add application domain:

```powershell
<your domain here> (e.g: example.com)
```

<p class="callout warning">Without adding the domain, Facebook login will fail with: "Can't load URL — domain isn't included in the app's domains"</p>

##### Switch the application to:

```powershell
Live Mode
```

##### **Step 2: Register Facebook Idp in Entra ID**

##### In Entra ID (Ext tenant directory) navigate to:

```powershell
External Identities
> All Identity Providers
> + Facebook
```

##### Enter:

```powershell
App ID
App Secret
```

##### Click:

```powershell
Save
```

#### **Integrate with Apple Identity Provider**

<p class="callout info">Prerequisite: ● An active Apple Developer Account (Paid membership).  
</p>

##### Step 1: Configure Apple Developer Portal

##### Navigate to:

##### [https://developer.apple.com](https://developer.apple.com)

##### Create an **App ID** with:

```powershell
Sign in with Apple enabled
```

##### Create a **Services ID**

##### **Example:**

```powershell
com.example.samllab
```

##### Configure redirect URI:

```powershell
https://<tenant-subdomain>.ciamlogin.com/<tenant-subdomain>.onmicrosoft.com/federation/oauth2
```

##### Create **Sign In with Apple Key**

##### Download:

```powershell
.p8 private key
```

##### Record:

```powershell
Key ID
Team ID
```

##### Step 2: **Register Apple Idp in Entra ID**

##### In Entra ID (Ext tenant directory) navigate to:

```powershell
External Identities
> All Identity Providers
> + Apple
```

##### Configure:

```powershell
Client ID: Your Apple services ID
Apple developer team ID: Your Apple Team ID here
Key ID: Your Apple Key ID here
Client Secret: Upload the .p8 key file here
```

#### **Phase 3: Create a User Flow**

##### In Entra ID (Ext tenant directory) navigate to:

```powershell
External Identities
> User Flows
> + New User Flow
```

##### Configure:

##### Name: (e.g) PilotApp-Auth-via-Socials

##### Enable identity providers:

```powershell
Email with Password
Google
Facebook
```

##### Select attributes:

```powershell
Display Name
Email Address
Given Name
Surname
```

##### Click:

```powershell
Create
```

#### **Phase 4: Register the SAML Application in Entra ID Ext Tenant directory**

##### Navigate to:

```powershell
Enterprise Applications
> New Application
> Create Your Own Application
```

##### Name:

```postgresql
My PilotApp with Socials Idp
```

##### Select:

##### Integrate any other application you don't find in the gallery

##### Configure SAML

##### Navigate to:

```powershell
Single Sign-On
> SAML
```

##### Configure:

##### **Identifier (Entity ID)**

```powershell
https://mypilot-app.example.com
```

##### **Reply URL (ACS)**

```powershell
https://mypilot-app.example.com/acs
```

##### Configure Attributes &amp; Claims

##### Map attributes:

<table id="bkmrk-claim-value-givennam"><thead><tr><th>Claim</th><th>Value</th></tr></thead><tbody><tr><td>givenname</td><td>user.givenname</td></tr><tr><td>surname</td><td>user.surname</td></tr><tr><td>emailaddress</td><td>user.mail</td></tr></tbody></table>

##### Obtain Federation Metadata

##### Download:

```powershell
Federation Metadata XML
```

##### Extract:

```powershell
IdP Entity ID
SSO URL
Signing Certificate
```

##### **In Entra ID Ext Tenant Directory Link the Application to the User Flow**

##### Navigate to:

```powershell
External Identities
> User Flows
> saml_lab_signin
> Applications
```

##### Click: Add Application

##### Select: &lt;The Enterprise App you want to integrate&gt;

#### **Phase 5: Update Third-party or LOB App that you want to integrate with Socials IDP**

##### Replace workforce tenant values with the external tenant values.

```powershell
# External Tenant Configuration

SAML_IDP_ENTITY_ID=https://<external-tenant-id>.ciamlogin.com/<external-tenant-id>/
SAML_IDP_SSO_URL=https://<tenant-name>.ciamlogin.com/<tenant-name>.onmicrosoft.com/saml2
SAML_IDP_X509CERT=<base64-certificate>
```

##### Save the configuration.

##### **The application will now authenticate users through the External Tenant user flow.**

**[![SAML - social idp UI.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/saml-social-idp-ui.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/saml-social-idp-ui.png)**

#### **--------------------------------- Troubleshooting -----------------------------------**

##### **Facebook - Domain Not Included in App Domains**

##### **Error:** 

##### `Can't load URLThe domain of this URL isn't included in the app's domains`

##### **Resolution:**

##### Add the application domain in:

##### Meta Developer Console  
&gt; App Settings  
&gt; Basic  
&gt; App Domains

##### Facebook - Invalid Scopes Email

##### **Error:**

##### `Invalid Scopes: email`

##### **Resolution:**

##### Add the permission:

##### Permissions and Features  
&gt; email

##### **Google - Redirect URI Mismatch**

##### **Error:**

##### `redirect_uri_mismatch`  


##### **Resolution:**

##### Ensure the redirect URI in Google Console matches:

##### https://.ciamlogin.com/.onmicrosoft.com/oauth2/authresp

##### **SAML Login Failure**

##### **Error:**

##### AADSTS75011 Authentication method mismatch

##### **Resolution:**

##### Disable strict authentication context in the Service Provider configuration.

<table id="bkmrk-metric-result-resolu"><thead><tr><th>##### **Metric**

</th><th>##### **Result**

</th></tr></thead><tbody><tr><td>##### Resolution Time

</td><td>##### ~45–90 minutes

</td></tr><tr><td>##### User Impact

</td><td>##### Users can authenticate using social providers

</td></tr><tr><td>##### Authentication Method

</td><td>##### Google, Facebook, Apple, or local account

</td></tr><tr><td>##### Recurrence Risk

</td><td>##### Low once identity providers are configured

</td></tr></tbody></table>

# Entra ID Self-Service Password Reset (SSPR) Implementation

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:73.6905%;height:180px;" title=""><tbody><tr><td style="width:20.5175%;">**Field**

</td><td style="width:79.485%;">**Details**

</td></tr><tr><td style="width:20.5175%;">Document Type

</td><td style="width:79.485%;">How-To Guide: Enterprise Implementation Runbook

</td></tr><tr><td style="width:20.5175%;">Applies To

</td><td style="width:79.485%;">Microsoft Entra ID, Microsoft Entra Connect Sync, Microsoft 365

</td></tr><tr><td style="width:20.5175%;">Audience

</td><td style="width:79.485%;">Identity Engineers / Entra ID Administrators / Systems Administrators

</td></tr><tr><td style="width:20.5175%;">Author</td><td style="width:79.485%;">AK. Udofeh

</td></tr><tr><td style="width:20.5175%;">Last Updated

</td><td style="width:79.485%;">March 2026

</td></tr></tbody></table>

##### **Overview**

**[![SSPR image.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/sspr-image.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/sspr-image.png)**

This document provides a complete runbook for implementing **Self-Service Password Reset (SSPR)** in Microsoft Entra ID within an enterprise environment using **Entra Connect Sync with Password Writeback**. The guide walks through prerequisites, configuration steps, authentication method setup, hybrid password writeback, monitoring, and troubleshooting.

The configuration enables users and administrators to reset their own passwords securely using **Microsoft Authenticator, SMS, and Security Questions**, with passwords written back to on-premises Active Directory.

##### **The Issue**

In organisations without Self-Service Password Reset enabled:

- Users must contact the **Service Desk** to reset forgotten passwords.
- Password resets generate **high ticket volume**.
- Account lockouts reduce productivity.
- Password resets outside support hours may delay business operations.

Common symptoms in such environments include:

- Frequent password reset tickets.
- Users locked out of Microsoft 365 services.
- Helpdesk manually resetting passwords in **Active Directory Users and Computers (ADUC)**.

Basic remediation steps such as:

- Clearing browser cache
- Waiting for lockout timers
- Logging into another device

do **not resolve the underlying issue**, because the problem is structural: users lack a secure self-service mechanism.

##### **Context**

The root cause is the absence of **Self-Service Password Reset capability integrated with the organisation’s identity infrastructure**.

In hybrid identity environments, password changes must occur across two identity planes:

```bash
User → Entra ID Authentication
       ↓
SSPR Validation (Authenticator / SMS / Questions)
       ↓
Entra ID Password Reset Engine
       ↓
Password Writeback via Entra Connect
       ↓
On-Prem Active Directory Password Update
       ↓
Password Sync Back to Entra ID
```

##### **Normal Process (with SSPR)**

1. User initiates password reset.
2. Entra ID verifies identity using configured authentication methods.
3. Password reset is approved.
4. Password writeback sends the new password to on-prem AD.
5. Entra Connect synchronises the updated password hash.

##### **What Breaks Without SSPR**

- Users cannot reset passwords independently.
- Password resets must be performed by administrators.
- Hybrid environments create delays due to manual intervention.

##### **Known Triggers for Password Reset Demand**

- Password expiry policies.
- Account lockout thresholds.
- New device sign-ins triggering authentication.
- VPN credential usage.
- Conditional Access enforcing re-authentication.

##### **Before You Start**

<table id="bkmrk-check-where-entra-id" style="width:85.9524%;height:238.375px;"><thead><tr style="height:29.7969px;"><th style="width:48.2826%;height:29.7969px;">**Check**</th><th style="width:51.7174%;height:29.7969px;">**Where**</th></tr></thead><tbody><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Entra ID P1 or P2 licenses assigned</td><td style="width:51.7174%;height:29.7969px;">Microsoft 365 Admin Center</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Microsoft Entra Connect Sync installed</td><td style="width:51.7174%;height:29.7969px;">On-prem identity server</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Password Writeback feature enabled</td><td style="width:51.7174%;height:29.7969px;">Entra Connect configuration</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Hybrid identity synchronisation healthy</td><td style="width:51.7174%;height:29.7969px;">Entra Connect Health</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Security group created for SSPR pilot scope</td><td style="width:51.7174%;height:29.7969px;">Entra ID → Groups</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Users registered for authentication methods</td><td style="width:51.7174%;height:29.7969px;">Security Info portal</td></tr><tr style="height:29.7969px;"><td style="width:48.2826%;height:29.7969px;">Required firewall ports open</td><td style="width:51.7174%;height:29.7969px;">Identity infrastructure</td></tr></tbody></table>

##### **Implementation steps**

**Step 1: Create the SSPR Security Group**

1\. Open the **Microsoft Entra Admin Center**

```bash
https://entra.microsoft.com
```

2\. Navigate to:

```
Identity > Groups
```

3\. Select **New Group**

Configuration:

<div class="TyagGW_tableContainer" id="bkmrk-setting-value-group-"><div class="group TyagGW_tableWrapper flex flex-col-reverse w-fit" tabindex="-1"><table class="w-fit min-w-(--thread-content-width)"><thead><tr><th>**Setting**</th><th>**Value**</th></tr></thead><tbody><tr><td>Group Type</td><td>Security</td></tr><tr><td>Name</td><td>SSPR-Enabled-Users</td></tr><tr><td>Membership</td><td>Assigned</td></tr></tbody></table>

</div></div>4\. Add users who should have SSPR enabled.

<p class="callout info">This group will be used to scope the SSPR policy.</p>

**Step 2: Enable Self-Service Password Reset**

Navigate to:

```bash
Entra ID > Password Reset
```

<table id="bkmrk-setting-value-self-s"><thead><tr><th>**Setting**</th><th>**Value**</th></tr></thead><tbody><tr><td>Self Service Password Reset Enabled</td><td>Selected</td></tr><tr><td>Selected Group</td><td>SSPR-Enabled-Users</td></tr></tbody></table>

Save the configuration.

**Step 3: Configure Authentication Methods**

Navigate to:

```bash
Entra ID > Authentication Methods
```

<table id="bkmrk-method-enabled-micro" style="width:46.0714%;height:89.3907px;"><thead><tr style="height:29.7969px;"><th style="width:50.002%;">Method</th><th style="width:50.002%;">Enabled</th></tr></thead><tbody><tr style="height:29.7969px;"><td style="width:50.002%;">Microsoft Authenticator</td><td style="width:50.002%;">Enabled</td></tr><tr style="height:29.7969px;"><td style="width:50.002%;">SMS</td><td style="width:50.002%;">Enabled</td></tr><tr><td style="width:50.002%;">Email OTP</td><td style="width:50.002%;">Enabled</td></tr></tbody></table>

<p class="callout info">Choose and enable all required Auth methods and add the Entra ID group with the SSPR-Enabled-Users group to the policy.</p>

Navigate to:

```bash
Entra ID > Password Reset > Authentication Methods
```

<table id="bkmrk-setting-value-number" style="width:43.9286%;"><thead><tr><th style="width:65.797%;">Setting</th><th style="width:34.203%;">Value</th></tr></thead><tbody><tr><td style="width:65.797%;">Number of methods required</td><td style="width:34.203%;">1</td></tr></tbody></table>

<p class="callout info">Choose the desired number of authentication methods required to reset a password and save.</p>

**Step 4: Enable Password Writeback**

Open the **Microsoft Entra Connect Windows Server**.

Launch:

```
Azure AD Connect
```

Select:

```
Configure → Customize synchronization options
```

During configuration:

Enable:

```
Password writeback
```

[![Entra ID Connect setup.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/entra-id-connect-setup.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/entra-id-connect-setup.png)

Complete the configuration wizard.

Verify status in:

```
Entra Admin Center
Identity → Hybrid Management → Entra Connect
```

<p class="callout warning">Password writeback must show **Enabled**.</p>

**Step 5: Enable Administrator SSPR**

In Entra ID navigate to:

```
Entra ID > Password Reset > Administration Policy
```

Administrators require stricter security.

Recommended configuration:

<table id="bkmrk-setting-value-number-1"><thead><tr><th>Setting</th><th>Value</th></tr></thead><tbody><tr><td>Number of authentication methods required</td><td>2</td></tr><tr><td>Allowed methods</td><td>Authenticator, SMS</td></tr></tbody></table>

<p class="callout warning">Security questions are **not recommended for administrators**.</p>

**Step 6: Verify Combined Security Information Registration**

Combined registration allows users to configure **MFA and Self-Service Password Reset authentication methods in a single workflow**.

Navigate to:

```
Entra ID > Authentication Methods > Settings
```

Verify the tenant is using the **modern Authentication Methods policy framework**.

If the **Combined registration toggle is not visible**, the feature is already enabled by Microsoft and no further configuration is required.

User registration portal:

```
https://aka.ms/mysecurityinfo
```

Users will register the following methods during onboarding:

- Microsoft Authenticator
- SMS verification
- Security questions (if enabled in SSPR policy)

<p class="callout success">This portal supports both **MFA and SSPR authentication method registration**.</p>

**Step 7: Configure User Notification Settings**

Navigate to:

```
Password Reset > Notifications
```

Recommended configuration:

<table id="bkmrk-setting-value-notify" style="width:42.2619%;"><thead><tr><th style="width:79.9392%;">Setting</th><th style="width:20.0608%;">Value</th></tr></thead><tbody><tr><td style="width:79.9392%;">Notify users on password reset</td><td style="width:20.0608%;">Enabled</td></tr><tr><td style="width:79.9392%;">Notify admins on admin password reset</td><td style="width:20.0608%;">Enabled</td></tr></tbody></table>

**==================================== Monitoring and Reporting ==============================**

##### **Entra Audit Logs**

Navigate to:

```
Entra Admin Center
Password reset > Audit Logs
```

Filter for:

```
Activity: Self-service password reset
```

Events recorded:

- Password reset initiated
- Password reset completed
- Password writeback success/failure

##### **Sign-In Logs**

Navigate to:

```
Password reset > Audit Logs
```

Review authentication challenges and method usage.

##### **SSPR Usage Reports**

Navigate to:

```
Entra ID > Password Reset > Usage & Insights
```

Metrics include:

<table id="bkmrk-metric-description-p"><thead><tr><th>Metric</th><th>Description</th></tr></thead><tbody><tr><td>Password resets</td><td>Total resets performed</td></tr><tr><td>Registrations</td><td>Users who registered authentication methods</td></tr><tr><td>Success rate</td><td>Successful resets vs attempts</td></tr></tbody></table>

These reports help measure adoption and identify issues.

##### **============================Troubleshooting=====================**

##### **Password Writeback Failed**

Error example:

```
Password reset failed to write back to on-premises directory
```

Possible causes:

- Entra Connect not running
- Password writeback disabled
- Domain controller connectivity issues

Resolution:

1. Verify Entra Connect service status.
2. Confirm writeback is enabled.
3. Check **Event Viewer - Application Logs** on the Entra Connect server.

##### **User Not Allowed to Reset Password**

Possible cause:

User not included in the **SSPR security group**.

Resolution:

1. Add the user to the SSPR group.
2. Wait for directory replication.

##### **User Not Registered for Authentication**

Error example:

```
You need to register for password reset
```

Resolution:

Direct the user to:

https://aka.ms/mysecurityinfo

```
https://aka.ms/mysecurityinfo
```

Complete registration before attempting password reset.

##### **Administrator Reset Fails**

Possible cause:

Administrator policy requires stronger authentication.

Resolution:

Ensure the administrator has registered:

- Microsoft Authenticator
- SMS

##### **Expected Outcome**

<table id="bkmrk-metric-result-resolu"><thead><tr><th>**Metric**</th><th>**Result**</th></tr></thead><tbody><tr><td>Resolution Time</td><td>Immediate user password reset</td></tr><tr><td>User Impact</td><td>Reduced helpdesk dependency</td></tr><tr><td>Recurrence Risk</td><td>Low once authentication registration is completed</td></tr></tbody></table>

# SAML Transformation Fallback Workaround (Microsoft Entra ID)

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:69.2857%;height:178.781px;" title=""><tbody><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">**Field**

</td><td style="width:80.1653%;height:29.7969px;">**Details**

</td></tr><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">Document Type

</td><td style="width:80.1653%;height:29.7969px;">How-To Guide - SSO SAML Transformation Runbook

</td></tr><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">Applies To

</td><td style="width:80.1653%;height:29.7969px;">Microsoft Entra ID, 3rd-Party WebApps &amp; Single-name user accounts

</td></tr><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">Audience

</td><td style="width:80.1653%;height:29.7969px;">2nd Line / Entra ID Admins / IT Engineer

</td></tr><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">Author

</td><td style="width:80.1653%;height:29.7969px;">AK. Udofeh

</td></tr><tr style="height:29.7969px;"><td style="width:19.6199%;height:29.7969px;">Last Updated

</td><td style="width:80.1653%;height:29.7969px;">Jan 2026

</td></tr></tbody></table>

##### **Overview**

This document describes a targeted workaround implemented within Microsoft Entra ID to address a SAML single sign-on (SSO) integration limitation with 3rd-Party or InHouse LOB WebApp, where the service provider requires the givenName (first name) attribute to be present during authentication.

The workaround enables successful authentication for users who have a single name recorded in Entra ID (i.e. no givenName or surname attribute populated), without modifying directory data.

##### **Background**

During an investigation of a user login issue raised by a 3rd-Party Service Provider support team, it was identified that:

- The WebApp requires all user accounts to have both givenName and surName attributes to be populated in Entra ID.
- Microsoft Entra ID successfully completes SAML authentication even when givenName is empty.
- The WebApp enforces givenName as a mandatory SAML attribute and rejects authentication if it is missing.

This behaviour is Service Provider side and outside of Entra ID control. However, a controlled, application-scoped workaround is possible using SAML claim transformations.

##### **Design Principles**

The workaround was designed with the following principles in mind:

- **Application-scoped only** – no tenant-wide or directory-wide impact
- **Non-destructive** – no changes to user objects or identity source data
- **Least privilege / minimal impact** – only activates when givenName is empty
- **Reversible** – easy to remove if Service Provider configuration changes

##### **Technical Summary**

The SAML givenName claim for the WebApp Enterprise Application is configured using a conditional transformation:

- If user.givenName is populated &gt; send user.givenName
- If user.givenName is empty &gt; fall back to user.displayName

This ensures that the WebApp always receives a non-null givenName value, allowing authentication to complete successfully.

No other SAML claims are affected.

##### **Implementation Details**

Microsoft Entra ID &gt; Enterprise Applications &gt; WebApp &gt; Single sign-on &gt;Attributes &amp; Claims

##### **Claim:**

- Name: givenname
- Namespace: <span><span class="loader-wrapper"><span class="hover-card-trigger-wrapper">[<span class="_19itglyw _vchhusvi _r06hglyw _o5721jtm _1nmz9jpi _16d9qvcn _ca0qv77o _u5f31b66 _n3tdv77o _19bv1b66"><span class="_19itglyw _vchhusvi _r06hglyw">Default</span></span>](http://schemas.xmlsoap.org/ws/2005/05/identity/claims)</span></span></span>

##### **Transformation Logic:**

1. IfNotEmpty(user.surname) &gt; output user.surname
2. IfEmpty(previous output) &gt; output user.givenname

[![f173a4ac-8b74-4c80-87e1-36e746334983.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/f173a4ac-8b74-4c80-87e1-36e746334983.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/f173a4ac-8b74-4c80-87e1-36e746334983.png)

This transformation is evaluated at authentication time and does not write back to Entra ID.

##### **Impact Assessment**

##### **Who is affected:**

- Only users authenticating to WebApp via SAML
- Only users whose givenName attribute is empty

##### **What changes:**

- WebApp receives a synthetic givenName value for single-name users

##### **What does NOT change:**

- Entra ID user attributes
- Other enterprise applications
- Authentication behaviour for users with a populated givenName

##### **Risks and Considerations**

- The givenName value provided to the WebApp may not represent a true first name.
- If the WebApp stores or reuses the attribute internally, the fallback value may persist within their system.
- This workaround compensates for a Service Provider SAML attribute mandatory requirement and should be reviewed if Service Provider updates its SAML requirements.

This implementation should not be used as a general pattern unless explicitly required.

# Configuring Phishing‑Resistant MFA (PR‑MFA) in Entra ID Conditional Access

<table class="MsoNormalTable" id="bkmrk-field-details-docume" title=""><tbody><tr><td>**Field**

</td><td>**Details**

</td></tr><tr><td>Document Type

</td><td>How-To Guide - Configure Phishing‑Resistant MFA (PR‑MFA)

</td></tr><tr><td>Applies To

</td><td>Microsoft Entra ID, Conditional Access policy

</td></tr><tr><td>Audience

</td><td>2nd Line / Entra ID Admins / IT Engineer

</td></tr><tr><td>Author

</td><td>AK. Udofeh

</td></tr><tr><td>Last Updated

</td><td>March 2026

</td></tr></tbody></table>

##### **Overview**

Phishing‑Resistant MFA (PR‑MFA) is the strongest authentication assurance level available in Microsoft Entra ID. It requires cryptographically bound authentication methods such as **FIDO2 security keys, device‑bound passkeys, or Windows Hello for Business**.

Microsoft formally introduced **Phishing‑resistant MFA Authentication Strength** as part of Conditional Access by 2025. This prevents attackers from bypassing MFA via techniques like real‑time phishing proxies, MFA fatigue, push spam, or OTP interception.

##### **Use Cases**

Use PR‑MFA for:

<div id="bkmrk-administrators-and-p">- **Administrators and privileged roles** (Global Admin, Security Admin, Conditional Access Admin)
- **Users accessing high‑value or regulated workloads**
- **Teams handling sensitive data**: finance, HR, legal
- **Zero‑Trust access strategies requiring high authentication assurance**

</div>**Prerequisites**  
**Licensing**

- Microsoft Entra ID P1/P2 (Authentication Strengths supported).

**Technical Requirements**

- Supported phishing‑resistant methods enabled (FIDO2, Windows Hello, Passkeys).
- Users must have registered a phishing‑resistant method before enforcement to avoid lockouts

**Supported Authenticators**

- FIDO2 security keys (hardware)
- Windows Hello for Business
- Device‑bound passkeys (Windows/macOS/iOS/Android, depending on platform)

<p class="callout warning">**Do not enforce PR‑MFA without ensuring users have registered the required method.** Risk of tenant lockout. Break‑glass (emergency access) accounts **must be excluded**. Legacy apps that do not support modern authentication may require exceptions or re‑architecture.</p>

##### **Step‑by‑Step Configuration**

**Step 1: Enable Phishing‑Resistant Authentication Methods**

- Go to Entra Admin Center &gt; Identity &gt; Protection &gt; Authentication Methods.
- Enable: Passkeys (FIDO2) and Windows Hello for Business

**Step 2: Create a Security Group for Pilot Users**

- Create a group like PR‑MFA‑Pilot.
- Add admin users or a testing cohort.

**Step 3: Configure Authentication Strength**

- Go to Identity &gt; Protection &gt; Conditional Access &gt; Authentication Strengths.
- Select Phishing‑resistant MFA strength.

*This explicitly enforces device‑bound cryptographic methods.*

**Step 4: Create the PR‑MFA Conditional Access Policy**

- Go to Conditional Access &gt; Policies &gt; + New Policy.
- Name: Require Phishing‑Resistant MFA
- Assignments: 
    - Users: select PR‑MFA‑Pilot group
    - Cloud apps: All cloud apps (recommended for admins)
- Access Controls &gt; Grant &gt; Require Authentication Strength
- Select Phishing‑resistant MFA
- Enable policy = Report‑only (first phase).
- After validation, switch to ON.

##### **Validation Steps**

- Validate sign‑in logs to confirm Phishing‑Resistant MFA was the effective control.  
    Entra Admin Center &gt; Monitoring &amp; Logs &gt; Sign‑in logs.
- Test phishing‑resistant methods: 
    - FIDO2 key
    - Windows Hello
    - Device‑bound passkey

These should satisfy the authentication requirement if configured correctly.

##### **====================== Troubleshooting =========================**

<div id="bkmrk-issue-resolution-use"><table><tbody><tr><th>**Issue**</th><th>**Resolution**</th></tr><tr><td>Users locked out</td><td>Confirm registration at https://aka.ms/mysecurityinfo and exclude user temporarily</td></tr><tr><td>FIDO2 key not accepted</td><td>Ensure attestation not restricted &amp; key model supported</td></tr><tr><td>Windows Hello not offered</td><td>Check if device is Entra‑joined/registered</td></tr><tr><td>App can't satisfy PR‑MFA</td><td>App may be legacy / does not support modern auth</td></tr></tbody></table>

</div>

# Enabling Token Protection in Entra ID Conditional Access

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:73.8095%;height:178.781px;" title=""><tbody><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">**Field**</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">**Details**</span>

</td></tr><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">Document Type</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">How-To Guide - Enable Token Protection in Entra ID Conditional Access</span>

</td></tr><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">Applies To</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">Microsoft Entra ID, Conditional Access policy</span>

</td></tr><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">Audience</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">2nd Line / Entra ID Admins / IT Engineer</span>

</td></tr><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">Author</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">AK. Udofeh</span>

</td></tr><tr style="height:29.7969px;"><td style="width:22.694%;height:29.7969px;"><span style="color:rgb(255,255,255);">Last Updated</span>

</td><td style="width:77.306%;height:29.7969px;"><span style="color:rgb(255,255,255);">March 2026</span>

</td></tr></tbody></table>

##### <span style="color:rgb(255,255,255);">**Overview**</span>

<span style="color:rgb(255,255,255);">Token Protection is a Conditional Access session control that cryptographically binds authentication tokens (e.g., Primary Refresh Tokens) to a specific device. This prevents token replay, pass‑the‑cookie attacks, and AiTM token theft. It ensures that even if an attacker steals a token, they cannot use it on another machine.</span>

##### <span style="color:rgb(255,255,255);">**Use Cases**</span>

<span style="color:rgb(255,255,255);">**Use Token Protection when:**</span>

- <span style="color:rgb(255,255,255);">Protecting Exchange Online, SharePoint Online, Teams, and Microsoft 365 native applications.</span>
- <span style="color:rgb(255,255,255);">Hardening admin or power‑user endpoints</span>
- <span style="color:rgb(255,255,255);">Preventing AiTM attacks that harvest tokens after MFA completion</span>
- <span style="color:rgb(255,255,255);">Enforcing Zero‑Trust principles</span>

##### <span style="color:rgb(255,255,255);">**Prerequisites**</span>

<p class="callout info"><span style="color:rgb(255,255,255);">**Licensing -** Microsoft Entra ID P1 is required for Token Protection.</span></p>

<span style="color:rgb(255,255,255);">**Device Requirements**</span>  
<span style="color:rgb(255,255,255);">Supported Platforms (per Microsoft):</span>

<div id="bkmrk-platform-support-lev"><table style="width:77.9762%;"><tbody><tr><th style="width:19.9021%;"><span style="color:rgb(255,255,255);">**Platform**</span></th><th style="width:21.6966%;"><span style="color:rgb(255,255,255);">**Support Level**</span></th><th style="width:58.4013%;"><span style="color:rgb(255,255,255);">**Requirements**</span></th></tr><tr><th scope="row" style="width:19.9021%;"><span style="color:rgb(255,255,255);">**Windows 10+**</span></th><td style="width:21.6966%;"><span style="color:rgb(255,255,255);">GA</span></td><td style="width:58.4013%;"><span style="color:rgb(255,255,255);">Entra‑joined, Hybrid‑joined, or Entra‑registered devices</span></td></tr><tr><th scope="row" style="width:19.9021%;"><span style="color:rgb(255,255,255);">**macOS 14+**</span></th><td style="width:21.6966%;"><span style="color:rgb(255,255,255);">Preview</span></td><td style="width:58.4013%;"><span style="color:rgb(255,255,255);">Must be **MDM‑managed** + Enterprise SSO plug‑in</span></td></tr><tr><th scope="row" style="width:19.9021%;"><span style="color:rgb(255,255,255);">**iOS/iPadOS 16+**</span></th><td style="width:21.6966%;"><span style="color:rgb(255,255,255);">Preview</span></td><td style="width:58.4013%;"><span style="color:rgb(255,255,255);">Must be **MDM‑managed** + Enterprise SSO plug‑in</span></td></tr><tr><th scope="row" style="width:19.9021%;"><span style="color:rgb(255,255,255);">**Android**</span></th><td style="width:21.6966%;"><span style="color:rgb(255,255,255);">❌ Not Supported</span></td><td style="width:58.4013%;"><span style="color:rgb(255,255,255);">- </span></td></tr></tbody></table>

</div><span style="color:rgb(255,255,255);">**Application Requirements**</span>  
<span style="color:rgb(255,255,255);">Token Protection currently supports:</span>

- <span style="color:rgb(255,255,255);">Exchange Online</span>
- <span style="color:rgb(255,255,255);">SharePoint Online</span>
- <span style="color:rgb(255,255,255);">Microsoft Teams</span>
- <span style="color:rgb(255,255,255);">Supported Microsoft 365 native clients (Outlook, OneDrive, Teams)</span>

<p class="callout warning"><span style="color:rgb(255,255,255);">Browser‑based sessions NOT supported (only native apps). Deploy in Report‑only mode first to prevent app/device disruption. MDM is required for macOS/iOS preview support.</span></p>

##### <span style="color:rgb(255,255,255);">**Step‑by‑Step Configuration**</span>

<span style="color:rgb(255,255,255);">**Step 1: Validate Device Registration**</span>  
<span style="color:rgb(255,255,255);">Devices must be:</span>

- <span style="color:rgb(255,255,255);">Entra‑joined</span>
- <span style="color:rgb(255,255,255);">Hybrid‑joined</span>
- <span style="color:rgb(255,255,255);">Entra‑registered</span>  
    <span style="color:rgb(255,255,255);">*This ensures PRT issuance.*</span>

<span style="color:rgb(255,255,255);">**Step 2: Create a Pilot Group**</span>  
<span style="color:rgb(255,255,255);">Create group: TokenProtection‑Pilot.</span>

<span style="color:rgb(255,255,255);">**Step 3: Create Token Protection Conditional Access Policy**</span>

- <span style="color:rgb(255,255,255);">Go to Entra Admin Center &gt; Entra ID &gt; Conditional Access</span>
- <span style="color:rgb(255,255,255);">Click + New Policy.</span>
- <span style="color:rgb(255,255,255);">Name it Enable Token Protection (Pilot).</span>
- <span style="color:rgb(255,255,255);">Assign:</span>
    - <span style="color:rgb(255,255,255);">Users: Choose a Pilot Security Group</span>
        - <span style="color:rgb(255,255,255);">Cloud Apps: </span>Office 365 Exchange Online, Office 365 SharePoint Online, Microsoft Teams Services

<p class="callout info">The Conditional Access policy should only be configured for these applications. Selecting the Office 365 application group might result in unintended failures. This change is an exception to the general rule that the Office 365 application group should be selected in a Conditional Access policy. - According to Microsoft Learn.</p>

- <span style="color:rgb(255,255,255);">Conditions &gt; Device Platform &gt; Set Configure to Yes &gt; Include: Windows</span>
- <span style="color:rgb(255,255,255);">Select Done</span>
- <span style="color:rgb(255,255,255);">Under Client apps &gt; Set Configure to Yes</span>

<p class="callout warning"><span style="color:rgb(255,255,255);">Not configuring the **Client Apps** condition, or leaving **Browser** selected might cause applications that use MSAL.js, such as Teams Web to be blocked.</span></p>

- <span style="color:rgb(255,255,255);">Under Modern authentication clients, only select **Mobile apps and desktop clients**. Leave other items unchecked.</span>
- <span style="color:rgb(255,255,255);">Select Done</span>
- <span style="color:rgb(255,255,255);">Access Controls &gt; Session &gt; Enable Token Protection</span>
- <span style="color:rgb(255,255,255);">Set Require token protection for sign-ins.</span>
- <span style="color:rgb(255,255,255);">Enable policy in Report‑only mode.</span>

<span style="color:rgb(255,255,255);">**Step 4: Move to Full Enforcement**</span>  
<span style="color:rgb(255,255,255);">After reviewing logs:</span>

- <span style="color:rgb(255,255,255);">Set policy to ON</span>
- <span style="color:rgb(255,255,255);">Gradually expand target groups</span>

##### <span style="color:rgb(255,255,255);">**Validation Steps**</span>

##### <span style="color:rgb(236,240,241);">**Capture logs and analyze**</span>

<span style="color:rgb(236,240,241);">Monitor Conditional Access enforcement of token protection before and after enforcement by using features like<span style="color:rgb(53,152,219);"> [Policy impact](https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-conditional-access-report-only#policy-impact), </span>[<span style="color:rgb(53,152,219);">Sign-in</span> <span style="color:rgb(53,152,219);">logs</span>](https://learn.microsoft.com/en-us/entra/identity/conditional-access/deployment-guide-token-protection-windows#sign-in-logs), and <span style="color:rgb(53,152,219);">[Log Analytics](https://learn.microsoft.com/en-us/entra/identity/conditional-access/deployment-guide-token-protection-windows#log-analytics).</span></span>

##### <span style="color:rgb(236,240,241);">**Sign-in logs**</span>

<span style="color:rgb(236,240,241);">Use Microsoft Entra sign-in log to verify the outcome of a token protection enforcement policy in report only mode or in enabled mode.</span>

1. <span style="color:rgb(236,240,241);">Sign in to the<span style="color:rgb(53,152,219);"> [Microsoft Entra admin center](https://entra.microsoft.com/) </span>as at least a<span style="color:rgb(53,152,219);"> [Conditional Access Administrator](https://learn.microsoft.com/en-us/entra/identity/role-based-access-control/permissions-reference#conditional-access-administrator).</span></span>
2. <span style="color:rgb(236,240,241);">Browse to **Entra ID** &gt; **Monitoring &amp; health** &gt; **Sign-in logs**.</span>
3. <span style="color:rgb(236,240,241);">Select a specific request to determine if the policy is applied or not.</span>
4. <span style="color:rgb(236,240,241);">Go to the **Conditional Access** or **Report-Only** pane depending on its state and select the name of your policy requiring token protection.</span>
5. <span style="color:rgb(236,240,241);">Under **Session Controls** check to see if the policy requirements were satisfied or not.</span>
6. <span style="color:rgb(236,240,241);">To find more details about the binding state of the request, select the pane **Basic Info** and see the field **Token Protection - Sign In Session**. Possible values are:</span>
    1. <span style="color:rgb(236,240,241);">Bound: the request was using bound protocols. Some sign-ins might include multiple requests, and all requests must be bound to satisfy the token protection policy. Even if an individual request appears to be bound, it doesn't ensure compliance with the policy if other requests are unbound. To see all requests for a sign-in, you can filter all requests for a specific user or look by correlation ID.</span>
    2. <span style="color:rgb(236,240,241);">Unbound: the request wasn't using bound protocols. Possible `statusCodes` when request is unbound are:</span>
        1. <span style="color:rgb(236,240,241);">1002: The request is unbound due to the lack of Microsoft Entra ID device state.</span>
        2. <span style="color:rgb(236,240,241);">1003: The request is unbound because the Microsoft Entra ID device state doesn't satisfy Conditional Access policy requirements for token protection. This error could be due to an unsupported device registration type, or the device wasn't registered using fresh sign-in credentials.</span>
        3. <span style="color:rgb(236,240,241);">1005: The request is unbound for other unspecified reasons.</span>
        4. <span style="color:rgb(236,240,241);">1006: The request is unbound because the OS version is unsupported.</span>
        5. <span style="color:rgb(236,240,241);">1008: The request is unbound because the client isn't integrated with the platform broker, such as Windows Account Manager (WAM).</span>

[![image.png](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/scaled-1680-/7bWimage.png)](https://docs.aktechnoservices.com/uploads/images/gallery/2026-03/7bWimage.png)

#####  

##### <span style="color:rgb(255,255,255);">***========================* Troubleshooting =======================**</span>

<div id="bkmrk-issue-cause-solution"><table><tbody><tr><th><span style="color:rgb(255,255,255);">**Issue**</span></th><th><span style="color:rgb(255,255,255);">**Cause**</span></th><th><span style="color:rgb(255,255,255);">**Solution**</span></th></tr><tr><td><span style="color:rgb(255,255,255);">User blocked from Outlook/Teams</span></td><td><span style="color:rgb(255,255,255);">Device not registered / not supported</span></td><td><span style="color:rgb(255,255,255);">Verify Entra join/registration status</span></td></tr><tr><td><span style="color:rgb(255,255,255);">macOS/iOS failing</span></td><td><span style="color:rgb(255,255,255);">Not MDM‑managed</span></td><td><span style="color:rgb(255,255,255);">Enforce MDM requirement for preview support</span></td></tr><tr><td><span style="color:rgb(255,255,255);">Browser apps unaffected</span></td><td><span style="color:rgb(255,255,255);">Browsers not supported</span></td><td><span style="color:rgb(255,255,255);">Use native apps or combine with CA blocking controls</span></td></tr><tr><td><span style="color:rgb(255,255,255);">Token still reusable</span></td><td><span style="color:rgb(255,255,255);">App not in supported list</span></td><td><span style="color:rgb(255,255,255);">Only Teams/SharePoint/Exchange supported currently</span></td></tr></tbody></table>

</div>

# Passwordless MFA Method Registration in Entra ID

<table class="MsoNormalTable" id="bkmrk-field-details-docume" title=""><tbody><tr><td>**Field**

</td><td>**Details**

</td></tr><tr><td>Document Type

</td><td>How-To Guide / Runbook

</td></tr><tr><td>Applies To

</td><td>Microsoft Entra ID, Microsoft 365, Windows 10/11, Web sign-ins

</td></tr><tr><td>Audience

</td><td>Entra ID / Microsoft 365 Administrators (2nd Line / Systems Admin)

</td></tr><tr><td>Author

</td><td>AK. Udofeh

</td></tr><tr><td>Last Updated

</td><td>March 2026

</td></tr></tbody></table>

##### **Overview**

This document explains how to enable and configure passwordless authentication methods (Microsoft Authenticator phone sign-in, FIDO2 / Passkey security keys, and Windows Hello for Business) in Microsoft Entra ID, and how admins should guide users to register them. It is intended for Entra ID administrators responsible for identity security, MFA, and Conditional Access in Microsoft 365 environments.

##### Background

- Users currently authenticate primarily with passwords and traditional MFA (SMS/voice/OTP), which are weak against phishing, replay, and credential stuffing attacks.
- Standard self-service MFA registration does not guarantee that users will enrol in passwordless methods unless those methods are explicitly enabled and promoted by administrators.
- Regulatory or internal security policies may require stronger, phishing-resistant or passwordless authentication for privileged roles, high-value apps, or all users over time.

Basic steps that do not resolve the issue on their own:

- Enabling MFA “per user” without configuring modern authentication methods policy.
- Relying on SMS / voice codes alone, which remain phishable and weaker than passwordless methods.
- Asking users to “use the Authenticator app” without enabling phone sign-in or FIDO2 / Passkey in the Authentication methods policy.

Other affected services/systems:

- Microsoft 365 workloads (Exchange Online, SharePoint Online, Teams, Entra admin center, Azure portal, etc.) rely on Entra ID sign-in and benefit directly from passwordless configuration.

##### Current setup

- By default, Entra ID tenants may only have legacy MFA methods widely used (phone call, SMS, app OTP) and password-based sign-in, while modern passwordless options are disabled or scoped to no users.
- This leaves accounts exposed to phishing and password-based attacks and prevents admins from enforcing phishing-resistant authentication strengths in Conditional Access.

##### Desired End state 

1. Admin enables passwordless authentication methods in Entra admin center &gt; Protection &gt; Authentication methods and targets appropriate groups.
2. Users register Microsoft Authenticator phone sign-in, FIDO2 / Passkey security keys, or Windows Hello for Business via My Sign-ins or Windows enrolment flows.
3. Conditional Access and authentication strengths can then require passwordless / phishing-resistant MFA for specific users and apps.

##### What currently missing:

- Passwordless methods are not enabled or targeted correctly, so users cannot register them, Conditional Access cannot require them reliably, and the organisation remains password-dependent.

Known triggers:

- New tenant where no Authentication methods policy is configured.
- Tenants migrated from legacy per-user MFA, where admins never moved to a unified authentication methods policy.<span class="inline-flex">​</span>
- Hybrid or legacy Windows devices are not meeting Windows Hello for Business prerequisites.

##### <span class="inline-flex">​</span>Before You Start

Use this checklist before enabling passwordless methods.

<div class="group relative my-[1em]" id="bkmrk-check-where-confirm-"><div class="w-full overflow-auto scrollbar-subtle rounded-lg border md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-raised"><table class="[&_tr:last-child_td]:border-b-0 my-0 w-full table-auto border-separate border-spacing-0 text-sm font-sans rounded-lg [&_tr:last-child_td:first-child]:rounded-bl-lg [&_tr:last-child_td:last-child]:rounded-br-lg"><thead><tr><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">Check</th><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">Where</th></tr></thead><tbody><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Confirm you have at least Authentication Administrator / Authentication Policy Administrator role</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra admin centre &gt; Roles and administrators<span class="inline-flex">​</span></td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Ensure modern MFA is already in use (at least for admins)</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra admin centre &gt; Protection &gt; MFA or Conditional Access<span class="inline-flex">​</span></td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Identify break-glass / emergency access accounts and exclude them from strong requirements initially</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra admin centre &gt; Users &gt; Filter for emergency accounts<span class="inline-flex">​</span></td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Verify users have compatible devices (iOS/Android for Authenticator, Windows 10/11 for Hello, supported FIDO2 keys)</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Hardware/software inventory, Intune, or asset list</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Communicate upcoming changes and registration steps to end users</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Internal IT communications plan<span class="inline-flex">​</span></td></tr></tbody></table>

</div></div>##### Implementation Steps

##### 1. Enable Microsoft Authenticator Passwordless Sign-in

1. Sign in to [<span class="text-box-trim-both">https://entra.microsoft.com</span>](https://entra.microsoft.com/) with an account that has Authentication Policy Administrator or Global Administrator role.
2. Go to Entra ID &gt; Authentication methods &gt; Policies.<span class="inline-flex">​</span>
3. Select Microsoft Authenticator from the list of built-in methods.
4. Set Enable to On.<span class="inline-flex">​</span>
5. Under Target, select All users or a dedicated pilot group (recommended initially).

<p class="callout warning">Be sure that at least two admins are in the pilot group.</p>

 6. Confirm Authentication mode includes Passwordless sign-in (phone sign-in) as allowed.<span class="inline-flex">​</span>

 7 Click Save.<span class="inline-flex">​</span>

##### 2. Enable FIDO2 / Passkey Security Keys

1. In Authentication methods &gt; Policies, select Passkey (FIDO2) (may appear as FIDO2 security key in some portals).
2. Set Enable to On.<span class="inline-flex">​</span>
3. Under Target, select a pilot group or All users depending on readiness.

<p class="callout warning"> Start with a small group if you have never deployed keys before.<span class="inline-flex">​</span></p>

 4. Open the Configure tab and ensure Allow self-service setup is enabled so users can register keys at

 [<span class="text-box-trim-both">https://mysignins.microsoft.com/security-info</span>](https://mysignins.microsoft.com/security-info**.)<span class="inline-flex">​</span>

 5. (Optional but recommended) In the same Configure tab:

- - Enable Enforce attestation in production so only trusted hardware keys from approved manufacturers can be registered.<span class="inline-flex">​</span>
    - Configure Key restriction policy with allowed AAGUIDs if you want to restrict to specific key models.<span class="inline-flex">​</span>

 6. Click Save.<span class="inline-flex">​</span>

##### 3. Configure Windows Hello for Business (if required)

1. Confirm devices run Windows 10 version 1809+ or Windows 11 and are Entra-joined or hybrid-joined as per your design.
2. Configure Windows Hello for Business via Intune device configuration or Group Policy according to Microsoft guidance (PIN and biometrics on devices with TPM).<span class="inline-flex">​</span>
3. Ensure Windows Hello for Business is enabled as an authentication method in Authentication methods &gt; Policies and targeted to groups/devices that meet prerequisites.<span class="inline-flex">​</span>
4. For hybrid environments requiring on-prem sign-in with FIDO2, ensure you also follow passwordless security key sign-in to on-premises resources guidance.<span class="inline-flex">​</span>

##### 4. Instruct Users to Register Passwordless Methods

1. Ask users in the pilot group to sign in to [<span class="text-box-trim-both">https://mysignins.microsoft.com/security-info</span>](https://mysignins.microsoft.com/security-info**.)<span class="inline-flex">​</span>
2. For Microsoft Authenticator phone sign-in:
    
    
    1. Install the Microsoft Authenticator app on iOS/Android.
    2. Add the work/school account and enable phone sign-in when prompted in the app.
3. For FIDO2 / Passkey security keys:
    
    
    1. Users open Security info &gt; Add sign-in method.
    2. Choose Security key and follow browser prompts to register the FIDO2 key (USB/NFC/Bluetooth).
4. For Windows Hello for Business:
    
    
    1. During Windows out-of-box experience or after sign-in, users will be prompted or can go to Settings &gt; Accounts &gt; Sign-in options to configure PIN and biometric sign-in.<span class="inline-flex">​</span>
5. Confirm that at least two passwordless-capable methods are configured for each admin account where possible.<span class="inline-flex">​</span>

##### 5. Validate Sign-in Behaviour

1. In a test browser, go to [<span class="text-box-trim-both">https://portal.office.com</span>](https://portal.office.com/) or [<span class="text-box-trim-both">https://portal.azure.com</span>](https://portal.azure.com/) and initiate sign-in as a pilot user.<span class="inline-flex">​</span>
2. Verify that passwordless options (Authenticator notification number match, security key, or Windows Hello) are available and functioning.
3. Check Entra admin centre &gt; Protection &gt; Authentication methods &gt; Activity or sign-in logs to confirm passwordless usage.

##### **Automated / Script Option (PowerShell for Policy Creation – Example for FIDO2)**

<p class="callout warning">This is an example script using Microsoft Graph PowerShell to enable FIDO2 (Passkey) for all users; adjust scoping for production.</p>

```powershell
# Connect to Microsoft Graph with appropriate scopesConnect-MgGraph -Scopes "Policy.Read.All","Policy.ReadWrite.AuthenticationMethod"# Get existing FIDO2 authentication method policy$fidoPolicy = Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `  -Filter "id eq 'Fido2'"# If the policy does not exist, throw an errorif (-not $fidoPolicy) {    throw "FIDO2 authentication method policy not found."}# Enable the FIDO2 policy and target all users$updateBody = @{    state  = "enabled"                       # Turn the method on    includeTargets = @(        @{            id   = "all_users"              # Target all users (adjust for groups if needed)            targetType = "group"            # TargetType can be group or user            isRegistrationRequired = $true  # Require registration        }    )}# Update the FIDO2 policyUpdate-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `  -AuthenticationMethodConfigurationId $fidoPolicy.Id `  -BodyParameter $updateBody# Output the updated policy to confirm changesGet-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `  -AuthenticationMethodConfigurationId $fidoPolicy.Id
```

<div class="w-full md:max-w-[90vw]" id="bkmrk-%E2%80%8Bdeployment-notes%3A"><div class="codeWrapper bg-subtle text-light selection:text-super selection:bg-super/10 my-md relative flex flex-col rounded-lg font-mono text-sm font-medium"><div class="translate-y-xs -translate-x-xs bottom-xl mb-xl flex h-0 items-start justify-end sm:sticky sm:top-xs"><div class="overflow-hidden border-subtlest ring-subtlest divide-subtlest bg-base rounded-full"><div class="border-subtlest ring-subtlest divide-subtlest bg-subtle"><span class="inline-flex">​</span>**Deployment notes:**</div></div></div></div></div>- Run from an admin workstation or Cloud Shell as a **Global Administrator / Authentication Policy Administrator**.<span class="inline-flex">​</span>
- Requires Microsoft Graph PowerShell SDK and appropriate API permissions (delegated or app).

Expected output / success indicators:

- Final `Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration` output shows `state` as `enabled` and `includeTargets` scoped as configured.

##### **Script Breakdown**

- `Connect-MgGraph -Scopes ...` connects to Microsoft Graph with permissions to read and update authentication method policies.
- `Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration` retrieves the current FIDO2 authentication method configuration by ID (`Fido2`).
- The `if (-not $fidoPolicy)` block ensures the script fails fast if the FIDO2 configuration is not present.
- `$updateBody` defines the new policy state and targeting, setting the method to **enabled** and targeting `all_users` (which you may replace with a specific group object ID).
- `Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration` applies the update to the existing FIDO2 policy.
- The final `Get-...` call outputs the updated policy so you can verify the changes.

##### **Troubleshooting**

<span class="inline-flex">​</span>**Users do not see passwordless options at sign-in**

- Confirm the relevant method (Authenticator, FIDO2, Windows Hello) is **enabled** and targeted to the user in **Authentication methods &gt; Policies**.
- Verify the user has successfully registered the method at [<span class="text-box-trim-both">**https://mysignins.microsoft.com/security-info**</span>](https://mysignins.microsoft.com/security-info) and that the device/app is healthy.<span class="inline-flex">​</span>

**FIDO2 key registration fails in the browser**

- Ensure the browser and OS support WebAuthn/FIDO2 (modern versions of Edge, Chrome, etc.).
- Check if **Enforce attestation** or key restriction policies are blocking the model; test with a known-good, supported key.<span class="inline-flex">​</span>

**Windows Hello for Business not offered**

- Confirm device meets OS and TPM requirements and is Entra-joined or hybrid-joined.
- Verify Windows Hello policies are enabled via Intune or Group Policy and that no conflicting policies disable it.<span class="inline-flex">​</span>

**Graph script fails with permission/403 errors**

- Ensure the signed-in admin has the required Graph permissions and has granted consent where needed.
- Confirm the Microsoft Graph PowerShell module is up to date.

##### **Expected Outcome**

<div class="group relative my-[1em]" id="bkmrk-item-detail-resoluti"><div class="w-full overflow-auto scrollbar-subtle rounded-lg border md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-raised"><table class="[&_tr:last-child_td]:border-b-0 my-0 w-full table-auto border-separate border-spacing-0 text-sm font-sans rounded-lg [&_tr:last-child_td:first-child]:rounded-bl-lg [&_tr:last-child_td:last-child]:rounded-br-lg"><thead><tr><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Item**</th><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Detail**</th></tr></thead><tbody><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Resolution time</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">30–90 minutes for tenant policy configuration, plus phased user enrolment over days/weeks</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">User impact</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Users see new sign-in experiences (Authenticator notification, FIDO2 key prompts, Windows Hello) and fewer password prompts</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Recurrence risk</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Low once configured; periodic review needed for new apps, roles, and user groups<span class="inline-flex">​</span></td></tr></tbody></table>

</div><div class="sticky z-10 h-0">  
</div></div>

# Configure Phishing-Resistant MFA Policy in Entra ID

<table class="MsoNormalTable" id="bkmrk-field-details-docume" title=""><tbody><tr><td>**Field**

</td><td>**Details**

</td></tr><tr><td>Document Type

</td><td>How-To Guide / Runbook

</td></tr><tr><td>Applies To

</td><td>Microsoft Entra ID, Microsoft 365, Azure portals, Cloud Apps integrated with Entra ID

</td></tr><tr><td>Audience

</td><td>Entra ID / Security Administrators (2nd Line / Systems Admin / Security Ops)

</td></tr><tr><td>Author

</td><td>AK. Udofeh

</td></tr><tr><td>Last Updated

</td><td>March 2026

</td></tr></tbody></table>

##### **Overview**

This document explains how to configure a **phishing-resistant MFA** Conditional Access policy using **Authentication Strengths** in Microsoft Entra ID. It covers report-only testing, scope control, and safe enforcement for privileged roles and high-value applications.

##### **Background**

- Standard Conditional Access policies using **“Require multi-factor authentication”** allow weaker methods (SMS, phone call, basic app OTP) which are still vulnerable to phishing and adversary-in-the-middle attacks.
- Organisations need to ensure that privileged accounts and sensitive applications can only be accessed with **phishing-resistant** methods such as FIDO2 security keys or other certified resistant mechanisms.
- Without Authentication Strength-based policies, admins cannot reliably enforce use of only strong, passwordless MFA for high-risk scenarios.

Basic steps that do **not** resolve this:

- Enabling MFA per user or via a simple Conditional Access “Require MFA” without specifying authentication strength.<span class="inline-flex">​</span>
- Relying solely on security defaults for tenants with advanced security requirements.

Other affected services/systems:

- Admin portals (Entra admin centre, Azure portal, Exchange admin centre), Microsoft 365 apps, and any SSO-integrated SaaS app federated via Entra ID will be subject to this policy when in scope.

##### **Usecase**

- Older Conditional Access policies were designed before **Authentication Strengths** and only distinguished “MFA vs no MFA”, not **which** MFA methods are acceptable.<span class="inline-flex">​</span>
- Attackers now commonly bypass weak MFA using real-time phishing and token replay, so stronger, phishing-resistant methods must be enforced where feasible.

##### **Desired End State**

1. Admins enable passwordless / phishing-resistant methods (Authenticator phone sign-in, FIDO2, etc.).
2. Admins create Conditional Access policies that require **Phishing-resistant MFA strength** or **Passwordless MFA strength** for sensitive scenarios.
3. Users in scope can satisfy the policy only with compliant strong methods; weaker methods are rejected.<span class="inline-flex">​</span>

What currently breaks:

- Existing CA policies allow weak MFA methods, so users can still sign in with SMS or legacy app codes, leaving privileged access exposed to phishing.

Known triggers:

- High-risk user roles (Global Admin, Security Admin, Exchange Admin, etc.).
- Access to high-value applications, admin portals, or from risky locations/devices.

##### **Before You Start**

<div class="group relative my-[1em]" id="bkmrk-check-where-confirm-"><div class="w-full overflow-auto scrollbar-subtle rounded-lg border md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-raised"><table class="[&_tr:last-child_td]:border-b-0 my-0 w-full table-auto border-separate border-spacing-0 text-sm font-sans rounded-lg [&_tr:last-child_td:first-child]:rounded-bl-lg [&_tr:last-child_td:last-child]:rounded-br-lg"><thead><tr><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Check**</th><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Where**</th></tr></thead><tbody><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Confirm passwordless / phishing-resistant methods are configured and piloted (Authenticator phone sign-in, FIDO2, etc.)</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">See the previous document and Entra &gt; Protection &gt; Authentication methods</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Ensure you have break-glass accounts excluded from Conditional Access</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra admin centre &gt; Users / Groups list<span class="inline-flex">​</span></td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Verify you have **Conditional Access Administrator** or equivalent permissions</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra admin centre &gt; Roles and administrators<span class="inline-flex">​</span></td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Identify target scope (directory roles/groups/apps) and rollout phases</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Security design docs/identity architecture</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Confirm security defaults or conflicting policies won’t block testing</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Entra &gt; Protection &gt; Conditional Access &gt; Policies<span class="inline-flex">​</span></td></tr></tbody></table>

</div></div>##### **Implementation Steps** 

##### **1. Create a Report-Only Phishing-Resistant Policy**

1. Sign in to [<span class="text-box-trim-both">**https://entra.microsoft.com**</span>](https://entra.microsoft.com/) as a Conditional Access or Security Administrator.
2. Go to **Entra ID &gt; Conditional Access &gt; Policies** and select **New policy**.
3. Name the policy clearly, for example: **`CA01 - Phishing-resistant MFA for Admins (Report-only)`.**
4. Under **Assignments &gt; Users**, select **Directory roles** and choose roles such as Global Administrator, Security Administrator, Exchange Administrator, and other privileged roles. ***(Ensure to exclude break glass and service accounts)***
5. Under **Cloud apps or actions**, select **All cloud apps** or a subset of high-value apps (Exchange Online, SharePoint Online, Entra admin centre, Azure portal).
6. Under **Conditions**, configure any additional conditions as needed (e.g. include all device platforms initially, or exclude trusted Workload identities).<span class="inline-flex">​</span>
7. Under **Access controls &gt; Grant**, choose **Require authentication strength** and select **Phishing-resistant MFA strength**.<span class="inline-flex">​</span>
8. Set **Enable policy** to **Report-only**.

<p class="callout warning"> This allows sign-ins to proceed but logs whether they would satisfy the policy.<span class="inline-flex">​</span></p>

 9. Click **Create** to save the policy.<span class="inline-flex">​</span>

##### **2. Monitor Report-Only Results**

1. Allow at least some days of normal usage for covered users.
2. In the Entra admin centre, go to **Entra ID &gt; Conditional Access &gt; Insights and reporting** and review the policy’s impact.<span class="inline-flex">​</span>
3. Use filters such as **Policy not satisfied** to identify sign-ins that would be blocked if enforced (e.g. users still using SMS).<span class="inline-flex">​</span>
4. Export reports for further analysis and plan user remediation or enrolment in passwordless methods where required.<span class="inline-flex">​</span>

##### **3. Create / Adjust Production Enforcement Policy**

1. Duplicate the tested report-only policy or create a new production policy with the same conditions.
2. Under **Assignments &gt; Users**, keep scope limited initially (e.g. only core admin roles or a pilot group).

<p class="callout warning">Avoid tenant-wide enforcement until adoption is high.</p>

 3. Under **Assignments &gt; Users &gt; Exclude**, add:

- - Break-glass accounts.
    - Conditional Access / Global Admins used for emergency recovery (per your policy).

 4. Under **Access controls &gt; Grant**, ensure **Require authentication strength** is set to **Phishing-resistant MFA strength** (or a custom

 strength including FIDO2, etc.).

 5. Set **Enable policy** to **On**.

 6. Save the policy and notify in-scope admins to use their phishing-resistant methods going forward.<span class="inline-flex">​</span>

##### **4. (Optional) Use Authentication Strength with Passwordless MFA**

- For broader user populations that may not yet be able to use fully phishing-resistant methods, create another Conditional Access policy:
    
    
    - **Grant &gt; Require authentication strength &gt; Passwordless MFA strength** for high-value apps, allowing strong but not necessarily certified phishing-resistant methods.<span class="inline-flex">​</span>
- Apply similar report-only and enforcement phases to minimise disruption.

##### **Automated / Script Option (Graph PowerShell Example)**

<p class="callout warning">Example policy that creates a **report-only** Conditional Access policy requiring phishing-resistant MFA strength for key admin roles.</p>

```powershell
# Connect to Microsoft Graph with appropriate scopes
Connect-MgGraph -Scopes "Policy.Read.All","Policy.ReadWrite.ConditionalAccess"

# Built-in Phishing-resistant MFA authentication strength ID
$phishResistantStrengthId = "00000000-0000-0000-0000-000000000004"

# Define key admin roles (template IDs)
$adminRoles = @(
    "62e90394-69f5-4237-9190-012177145e10", # Global Administrator
    "194ae4cb-b126-40b2-bd5b-6091b380977d", # Security Administrator
    "29232cdf-9323-42fd-ade2-1d097af3e4de"  # Exchange Administrator
)

# Build the Conditional Access policy body
$policyParams = @{
    DisplayName = "Require phishing-resistant MFA for admins (Report-only)"
    State       = "enabledForReportingButNotEnforced" # Report-only mode
    Conditions  = @{
        Users = @{
            IncludeRoles = $adminRoles             # Target listed directory roles
        }
        Applications = @{
            IncludeApplications = @("All")         # All cloud apps
        }
    }
    GrantControls = @{
        Operator = "OR"
        AuthenticationStrength = @{
            Id = $phishResistantStrengthId        # Built-in Phishing-resistant MFA strength
        }
    }
}

# Create the Conditional Access policy
New-MgIdentityConditionalAccessPolicy -BodyParameter $policyParams

```

##### **Deployment notes:**

- Run as a privileged admin with permission to manage Conditional Access.
- Adjust `$adminRoles` and `IncludeApplications` to suit your environment.

**Expected output / success indicators:**

- `New-MgIdentityConditionalAccessPolicy` returns the created policy object with `state` set to `enabledForReportingButNotEnforced` and the correct authentication strength ID.<span class="inline-flex">​</span>

##### **Script Breakdown**

- `Connect-MgGraph` establishes a session with Microsoft Graph using scopes for Conditional Access policy management.<span class="inline-flex">​</span>
- `$phishResistantStrengthId` holds the known ID of the built-in **Phishing-resistant MFA strength**, which defines allowed methods such as FIDO2 keys.
- `$adminRoles` lists the directory role template IDs for privileged admin roles that will be included in the policy.<span class="inline-flex">​</span>
- `$policyParams` defines policy properties:
    
    
    - `DisplayName` gives a descriptive name.
    - `State` as `enabledForReportingButNotEnforced` places the policy in report-only mode.
    - `Conditions.Users.IncludeRoles` targets specific directory roles.
    - `Conditions.Applications.IncludeApplications = "All"` targets all cloud apps.
    - `GrantControls.AuthenticationStrength.Id` references the phishing-resistant MFA strength.
- `New-MgIdentityConditionalAccessPolicy` sends the policy definition to Graph and creates the policy in Entra ID.

##### **Troubleshooting**

**Users are blocked after policy enforcement**

- Use **Sign-in logs** to verify which policy blocked access and what authentication method was used.
- Check whether affected users have registered any phishing-resistant methods (FIDO2, etc.). If not, move them temporarily out of scope or provide registration guidance.

**Policy does not appear to have any effect**

- Confirm the policy is **Enabled** (not just in report-only) for enforcement scenarios.
- Verify the user and app in question are actually within **Assignments** and not excluded by another condition or exclusion.

**Graph script fails with insufficient privileges**

- Ensure the account running the script has Conditional Access Administrator or equivalent role and that Graph scopes include `Policy.ReadWrite.ConditionalAccess`.<span class="inline-flex">​</span>
- If using app-only auth, ensure the app registration has `Policy.ReadWrite.ConditionalAccess` application permissions and admin consent granted.

**Conflicts with existing policies**

- Review other Conditional Access policies in **What If** or simulation tools to check aggregate effect.<span class="inline-flex">​</span>
- Consolidate overlapping policies or adjust priority/scope to avoid unexpected blocks.

##### **Expected Outcome**

<div class="group relative my-[1em]" id="bkmrk-item-detail-resoluti"><div class="w-full overflow-auto scrollbar-subtle rounded-lg border md:max-w-[90vw] border-subtlest ring-subtlest divide-subtlest bg-raised"><table class="[&_tr:last-child_td]:border-b-0 my-0 w-full table-auto border-separate border-spacing-0 text-sm font-sans rounded-lg [&_tr:last-child_td:first-child]:rounded-bl-lg [&_tr:last-child_td:last-child]:rounded-br-lg"><thead><tr><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Item**</th><th class="border-subtlest p-sm min-w-[48px] break-normal border-b text-left align-bottom border-r last:border-r-0 font-bold bg-subtle first:border-radius-tl-lg last:border-radius-tr-lg">**Detail**</th></tr></thead><tbody><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Resolution time</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">30–60 minutes to create report-only and enforcement policies plus a 7–10 day observation window</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">User impact</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Privileged users and scoped users must use phishing-resistant or passwordless MFA methods to access targeted apps; legacy MFA may no longer be accepted</td></tr><tr><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Recurrence risk</td><td class="border-subtlest px-sm min-w-[48px] break-normal border-b border-r last:border-r-0">Low once adopted; policies should be reviewed periodically as roles, apps, and methods evolve</td></tr></tbody></table>

</div></div>

# How-To: Set Up App Registrations for Automated Entra ID Administration

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:84.5238%;" title=""><tbody><tr><td style="width:25.1101%;">**Field**

</td><td style="width:74.8899%;">**Details**

</td></tr><tr><td style="width:25.1101%;">Document Type

</td><td style="width:74.8899%;">How-To Guide / Runbook

</td></tr><tr><td style="width:25.1101%;">Applies To

</td><td style="width:74.8899%;">Microsoft Entra ID, PowerShell, Microsoft Graph SDK

</td></tr><tr><td style="width:25.1101%;">Audience

</td><td style="width:74.8899%;">Systems Administrators / DevOps

</td></tr><tr><td style="width:25.1101%;">Author

</td><td style="width:74.8899%;">AK. Udofeh

</td></tr><tr><td style="width:25.1101%;">Last Updated

</td><td style="width:74.8899%;">April 2026

</td></tr></tbody></table>

##### **Overview**

<div class="Y3BBE" id="bkmrk-this-article-provide">This article provides a structured guide on creating and configuring a Microsoft Entra ID App Registration. This setup allows for secure authentication from a local terminal or automated scripts to perform administrative tasks such as SSO configuration and directory management.</div>##### **Background**

To interact with Entra ID via automation or the command line without using personal user credentials, a Service Principal is required. Standard user accounts often have MFA or conditional access policies that interfere with headless automation; an App Registration provides a controlled, auditable, and secure method for programmatic access.

##### **Before You Start**

<div class="Fv6NCb" id="bkmrk-check-where-sufficie"><table class="NRefec"><tbody><tr class="cZCYO"><th class="iry6k">**Check**</th><th class="iry6k">**Where**</th></tr><tr class="cZCYO"><td class="cOeeGf">Sufficient Permissions</td><td class="cOeeGf">Ensure you have 'Application Developer' or 'Cloud Application Administrator' roles.</td></tr><tr class="cZCYO"><td class="cOeeGf">Microsoft Graph SDK</td><td class="cOeeGf">Install the module: `Install-Module Microsoft.Graph`</td></tr><tr class="cZCYO"><td class="cOeeGf">Client Credentials</td><td class="cOeeGf">Have a naming convention ready (e.g., `Svc-Entra-Config`).</td></tr></tbody></table>

</div>##### **Configuration Steps**

1. <span class="T286Pc">**Register the Application**:</span>
    - Navigate to [https://entra.microsoft.com](https://portal.azure.com/)&gt; Entra ID &gt; App Registrations &gt; New Registration.
    - Enter a meaningful display name (e.g. AppName SSO).
    - Under Supported account types, select Accounts in this organisational directory only (Single tenant) unless multi-tenant access is required.
    - Leave the Redirect URI blank.
    - Click Register.
2. <span class="T286Pc">**Generate Credentials**:</span>
    - <span class="T286Pc">Go to **Certificates &amp; secrets &gt; Client secrets**.</span>
    - <span class="T286Pc">Create a new secret.</span>
    - <span class="T286Pc">Give it a description for future reference.</span>

<p class="callout info"><span class="T286Pc">Copy the secret Value immediately; it will be masked permanently once you leave the blade.</span></p>

<span class="T286Pc"> <span class="Yjhzub"> 3. </span>**Configure API Permissions**:</span>

1. - <span class="T286Pc">Go to **API permissions &gt; Add a permission &gt; Microsoft Graph**.</span>
    - <span class="T286Pc">Select **Application permissions**.</span>
    - <span class="T286Pc">Add `Application.ReadWrite.All` (for SSO/App config) and `Directory.Read.All`.</span>
    - <span class="T286Pc">Select:, G**rant admin consent for \[Tenant\]**.</span>

<span class="T286Pc"> 4. </span>**Elevate via Directory Roles (Conditional)**:

<p class="callout info"><span class="T286Pc">Only perform this step if API permissions above result in "Access Denied" for specific administrative tasks.</span></p>

- - - <span class="T286Pc">Navigate to **Identity &gt; Roles &amp; admins**.</span>
        - <span class="T286Pc">Search for **Cloud Application Administrator**.</span>
        - <span class="T286Pc">Select **Add assignments** and search for the **Name** of your App Registration to assign the role directly.</span>

##### **<span class="T286Pc">Automated / Script Option - PowerShell</span>**

```powershell
# Define connection variables
$TenantId = "your-tenant-id"
$ClientId = "your-client-id"
$ClientSecret = "your-client-secret" | ConvertTo-SecureString -AsPlainText -Force

# Create credential object for non-interactive login
$Credential = New-Object System.Management.Automation.PSCredential($ClientId, $ClientSecret)

# Connect to Microsoft Graph using the App Registration
# This uses the Client Credentials flow
Connect-MgGraph -TenantId $TenantId -Credential $Credential

# Success Indicator: Retrieve Tenant details to verify connection
Get-MgOrganization | Select-Object DisplayName, Id

```

##### **Script Breakdown**

- <span class="T286Pc">**Variable Definition**: Stores the IDs and secrets generated in the portal. The secret is converted to a `SecureString` for compatibility with PowerShell credential objects.</span>
- <span class="T286Pc">**Connect-MgGraph**: Establishes the session. Because a `Credential` object is passed, it bypasses the interactive browser login.</span>
- <span class="T286Pc">**Get-MgOrganization**: A simple test command. If the terminal returns your organisation's name, the authentication was successful.</span>

##### **<span class="T286Pc">Automated / Script Option - zsh</span>**

```bash
export ARM_CLIENT_ID="your-app-id"
export ARM_CLIENT_SECRET="your-app-password"
export ARM_SUBSCRIPTION_ID="your-sub-id"
export ARM_TENANT_ID="your-tenant-id"

```

##### **Troubleshooting**

<div class="otQkpb" id="bkmrk-access-denied-%28403-e">**Access Denied (403 Error)**</div>- <span class="T286Pc">**Cause**: The App Registration lacks the specific Graph API scope or the Directory Role required for the task.</span>
- <span class="T286Pc">**Fix**: Ensure **Admin Consent** was clicked in the portal. If the error persists, assign the **Cloud Application Administrator** directory role to the app as detailed in the manual steps.</span>

<div class="otQkpb" id="bkmrk-conflicting-authenti">**Conflicting Authentication Context**</div>- <span class="T286Pc">**Cause**: An existing interactive session is active in the terminal.</span>
- <span class="T286Pc">**Fix**: Run `Disconnect-MgGraph` before attempting to connect with the App Registration credentials.</span>

##### **Expected Outcome**

<div class="Fv6NCb" id="bkmrk-metric-detail-resolu"><table class="NRefec" style="height:105px;width:80.8333%;"><tbody><tr class="cZCYO"><th class="iry6k" style="width:10%;">Metric</th><th class="iry6k" style="width:10%;">Detail</th></tr><tr class="cZCYO"><td class="cOeeGf" style="width:10%;">**Resolution Time**</td><td class="cOeeGf" style="width:10%;">10–15 Minutes</td></tr><tr class="cZCYO"><td class="cOeeGf" style="width:10%;">**User Impact**</td><td class="cOeeGf" style="width:10%;">None (Backend configuration only)</td></tr><tr class="cZCYO"><td class="cOeeGf" style="width:10%;">**Recurrence Risk**</td><td class="cOeeGf" style="width:10%;">Low (Credentials expire based on secret lifetime)</td></tr></tbody></table>

</div>

# Blocking Device Code Flow in Microsoft Entra ID

<table class="MsoNormalTable" id="bkmrk-field-details-docume" style="width:60.119%;height:178.781px;" title=""><tbody><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">**Field**

</td><td style="width:77.1905%;height:29.7969px;">**Details**

</td></tr><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">Document Type

</td><td style="width:77.1905%;height:29.7969px;">Blocking Device Code Flow in Microsoft Entra ID

</td></tr><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">Applies To

</td><td style="width:77.1905%;height:29.7969px;">Microsoft Entra ID, Conditional Access policy

</td></tr><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">Audience

</td><td style="width:77.1905%;height:29.7969px;">2nd Line / Entra ID Admins / IT Engineer

</td></tr><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">Author

</td><td style="width:77.1905%;height:29.7969px;">AK. Udofeh

</td></tr><tr style="height:29.7969px;"><td style="width:22.6115%;height:29.7969px;">Last Updated

</td><td style="width:77.1905%;height:29.7969px;">April 2026

</td></tr></tbody></table>

##### **Overview**

Device Code Flow allows users to authenticate on one device by entering a code on another. While useful for devices with limited input, it introduces significant phishing risk and can enable access from unmanaged devices.

This guide walks through configuring a Conditional Access policy to block Device Code Flow.

##### **Prerequisites**

- Microsoft Entra ID P1 (or higher)
- Conditional Access Administrator (or equivalent role)
- Emergency / break-glass accounts identified

##### **Step 1: Access Conditional Access Policies**

1. Sign in to the Microsoft Entra admin center
2. Navigate to:  
    **Entra ID &gt; Conditional Access &gt; Policies**
3. Select **+ New policy**

##### **Step 2: Define Policy Scope**

**Users**

- Include: **All users (recommended)**
- Exclude: 
    - Emergency access accounts
    - Break-glass accounts

<p class="callout warning">Always maintain at least one account excluded to prevent lockout</p>

##### **Step 3: Target Resources**

- Select **Target resources (Cloud apps)**
- Include: **All resources (recommended)**

##### **Step 4: Configure Authentication Flow Condition**

1. Navigate to:  
    **Conditions &gt; Authentication Flows**
2. Set **Configure = Yes**
3. Select: 
    - **Device Code Flow**
4. Click **Done**

##### **Step 5: Block Access**

1. Go to:  
    **Access Controls &gt; Grant**
2. Select: 
    - **Block access**
3. Click **Select**

##### **Step 6: Enable in Report-Only Mode (Recommended)**

- Set policy state to: **Report-only**
- Click **Create**

<p class="callout info">This allows you to assess impact before enforcing</p>

##### **Step 7: Validate Impact**

- Navigate to:  
    **Monitoring &gt; Sign-in logs**
- Filter by: 
    - Authentication Protocol = Device Code Flow

**Identify:**

- Users
- Applications
- Dependencies

##### **Step 8: Enforce Policy**

Once validated:

- Change policy state from **Report-only &gt; On**
- Monitor for failures and adjust exclusions if required

##### **Important Considerations**

- Device Code Flow is often used by: 
    - Azure CLI / PowerShell
    - Teams Rooms / shared devices
- Blocking may impact these scenarios

<p class="callout info">Microsoft recommends blocking unless explicitly required</p>

##### **Best Practices**

- Start in report-only mode
- Keep exclusions minimal and reviewed regularly
- Monitor sign-in logs continuously
- Prefer modern, secure authentication methods

##### **Summary**

Blocking Device Code Flow reduces exposure to phishing attacks that exploit cross-device authentication. This control strengthens identity security by eliminating a high-risk authentication path.

# Blocking Authentication Transfer in Microsoft Entra ID

<table class="MsoNormalTable" id="bkmrk-field-details-docume" title=""><tbody><tr><td>**Field**

</td><td>**Details**

</td></tr><tr><td>Document Type

</td><td>Blocking Authentication Transfer in Microsoft Entra ID

</td></tr><tr><td>Applies To

</td><td>Microsoft Entra ID, Conditional Access policy

</td></tr><tr><td>Audience

</td><td>2nd Line / Entra ID Admins / IT Engineer

</td></tr><tr><td>Author

</td><td>AK. Udofeh

</td></tr><tr><td>Last Updated

</td><td>April 2026

</td></tr></tbody></table>

##### **Overview**

Authentication Transfer allows a user to authenticate on one device and transfer that session to another (e.g. scanning a QR code to sign into a mobile app).

While convenient, it introduces risks where authentication can be extended to unmanaged or untrusted devices.

This guide shows how to restrict or block this behaviour using Conditional Access.

##### **Prerequisites**

- Microsoft Entra ID P1 (or higher)
- Conditional Access Administrator role
- Identified exclusion accounts (break-glass)

##### **Step 1: Access Conditional Access Policies**

1. Sign in to the Microsoft Entra admin center
2. Navigate to:  
    **Entra ID &gt; Conditional Access &gt; Policies**
3. Select **+ New policy**

##### **Step 2: Define Policy Scope**

##### Users

- Include: 
    - All users OR specific groups
- Exclude: 
    - Emergency / break-glass accounts

<p class="callout warning">Exclusions should be tightly controlled and reviewed regularly</p>

##### **Step 3: Target Resources**

- Select:  
    **Target resources (Cloud apps)**
- Include: 
    - **All resources** or specific applications

##### **Step 4: Configure Authentication Flow Condition**

1. Navigate to:  
    **Conditions &gt; Authentication Flows**
2. Set **Configure = Yes**
3. Select: 
    - **Authentication Transfer**
4. Click **Done**

##### **Step 5: Block Access**

1. Go to:  
    **Access Controls &gt; Grant**
2. Select: 
    - **Block access**
3. Click **Select**

##### **Step 6: Enable Policy**

- Set policy state to: **On**
- Click **Create**

##### **Step 7: Validate Behaviour**

- Test scenarios: 
    - QR-based login
    - Cross-device sign-in flows
- Review: 
    - Sign-in logs
    - Conditional Access results

##### **Important Considerations**

Blocking Authentication Transfer may impact:

- Mobile app onboarding flows
- QR code-based sign-ins
- Cross-device authentication experiences

<p class="callout warning">This feature is enabled by default and must be explicitly controlled via policy</p>

##### **Best Practices**

- Apply to high-risk user groups first
- Consider restricting instead of fully blocking where needed
- Combine with: 
    - Device compliance policies
    - MFA enforcement

##### **Summary**

Blocking Authentication Transfer prevents authentication from being silently extended across devices, reducing the risk of unauthorized access from unmanaged endpoints.

This ensures authentication remains tied to trusted and controlled environments.

# Configuring Entra ID CA Policies for Authentication Flows

<table class="MsoNormalTable" id="bkmrk-field-details-docume" title=""><tbody><tr><td>**Field**</td><td>**Details**

</td></tr><tr><td>Document Type

</td><td>Configuring Entra ID CA Policies for Authentication Flows

</td></tr><tr><td>Applies To

</td><td>Microsoft Entra ID, Conditional Access policy

</td></tr><tr><td>Audience

</td><td>2nd Line / Entra ID Admins / IT Engineer

</td></tr><tr><td>Author

</td><td>AK. Udofeh

</td></tr><tr><td>Last Updated

</td><td>May 2026

</td></tr></tbody></table>

##### **Overview**

This guide outlines how to configure Conditional Access policies in Microsoft Entra ID to control:

<span> \* </span>Device Code Flow

<span> \* </span>Authentication Transfer

These authentication methods can introduce elevated phishing and unmanaged device risks if not explicitly governed.

##### **Device Code Flow**

Device Code Flow is similar to signing in to Netflix or Xbox on a Smart TV, where the TV displays a code and instructs the user to complete sign-in on another device such as a phone or laptop. Once authentication is completed, the Smart TV is automatically signed in.

Example:

Example: Go to [https://microsoft.com/devicelogin](https://microsoft.com/devicelogin) or [https://www.netflix.com/tv2](https://www.netflix.com/tv2) and enter this code.

##### **Authentication Transfer**

Authentication Transfer is similar to being signed in on Device A and then scanning a QR code using Device B, allowing the authenticated session or trust to be transferred so that Device B becomes signed in without performing a full standalone authentication process again.

This guide demonstrates how to govern these flows using Conditional Access policies to reduce exposure to indirect authentication attacks.

#####  **Prerequisites**

<span><span style="font:7pt 'Times New Roman';"> \* </span></span>Microsoft Entra ID P1 or higher

<span> \* </span>Conditional Access Administrator role

<span> \* </span>Emergency / break-glass accounts identified

<span> \* </span>Access to Microsoft Entra admin center

**Step 1: Create New Conditional Access Policy**

<span>1. </span>Sign in to the Microsoft Entra admin center

<span>2. </span>Navigate to: **Entra ID &gt; Protection &gt; Conditional Access &gt; Policies**

<span>3. </span>Select **+ New policy**

<span>4. </span>Enter a policy name:

<span> \* <span style="font:7pt 'Times New Roman';"> </span></span>Example: CA - Block Authentication Flows

**Step 2: Configure User Scope**

Under **Assignments → Users**:

<span> \* </span>Include:

All users (recommended)

<span> \* </span>Exclude:

<span><span style="font:7pt 'Times New Roman';"> \*</span><span style="font:7pt 'Times New Roman';"> </span></span>Emergency access accounts

<span><span style="font:7pt 'Times New Roman';"> \* </span><span style="font:7pt 'Times New Roman';"> </span></span>Break-glass administrator accounts

<p class="callout warning">Avoid applying policies to all accounts without exclusions.</p>

**Step 3: Configure Target Resources**

Under **Assignments → Target resources**:

<span><span style="font:7pt 'Times New Roman';">\* </span><span style="font:7pt 'Times New Roman';"> </span></span>Select:

<span> \*. </span>**All cloud apps**

This ensures consistent enforcement across Microsoft 365 resources.

**Step 4: Configure Authentication Flows**

<span>1. </span>Navigate to:  
**Conditions &gt; Authentication flows**

<span>2. </span>Set:

<span> \* <span style="font:7pt 'Times New Roman';"> </span></span>**Configure = Yes**

<span>1. </span>Select required flows:

<span style="font-family:'Segoe UI Emoji';"> \* </span>Device Code Flow

<span> \* </span>Authentication Transfer

<span>2. </span>Click **Done**

**Step 5: Configure Access Control**

Under **Access controls → Grant**:

<span> \* </span>Select:

<span> \*</span> Block access

<span> \* </span>Click **Select**

This blocks authentication attempts using the selected flows.

**Step 6: Enable Report-Only Mode**

Before enforcement:

<span><span style="font:7pt 'Times New Roman';"> \* </span><span style="font:7pt 'Times New Roman';"> </span></span>Set policy state to:

<span> \* </span>**Report-only**

<span><span style="font:7pt 'Times New Roman';"> \* </span></span>Click **Create**

This allows impact analysis without disrupting users.

##### **Validation**

Review:

<span><span style="font:7pt 'Times New Roman';">\* </span><span style="font:7pt 'Times New Roman';"> </span></span>**Entra ID &gt; Monitoring &gt; Sign-in logs**

Validate:

<span>\* </span>Impacted users

<span><span style="font:7pt 'Times New Roman';">\*</span><span style="font:7pt 'Times New Roman';"> </span></span>Authentication flow usage

<span>\* </span>Conditional Access evaluation results

Monitor for:

<span>\* </span>Developer tooling dependencies

<span>\* </span>Shared device authentication

<span>\* </span>QR-based onboarding scenarios

##### **Enforcement**

Once validated:

<span>1. </span>Edit the Conditional Access policy

<span>2. </span>Change:

<span><span style="font:7pt 'Times New Roman';">\* </span></span>**Report-only &gt; On**

<span>3. </span>Continue monitoring sign-in activity and failures post-deployment.

##### **️ Flow Overview**

User Authentication Attempt  
<span style="font-family:'Times New Roman';">\* Authentication Flow Detection</span>  
<span style="font-family:'Times New Roman';">\* Conditional Access Evaluation</span>  
<span style="font-family:'Times New Roman';">\* Block / Allow Decision</span>  
<span style="font-family:'Times New Roman';">\* Resource Access Outcome</span>

Security Control Points:

<span>·<span style="font:7pt 'Times New Roman';"> </span></span>Device Code Flow restriction

<span>·<span style="font:7pt 'Times New Roman';"> </span></span>Authentication Transfer restriction

<span>·<span style="font:7pt 'Times New Roman';"> </span></span>Sign-in logging and monitoring

##### **Summary**

This configuration strengthens Microsoft Entra ID security posture by restricting high-risk authentication flows commonly associated with phishing and indirect access scenarios.