Identity Bytes // IB-ENTRA-SEC Track
Intermediate Lab 02 of 12 Est. 75 minutes

Migrating Off SMS with the Authentication Methods Policy

Take the SMS-reliant population your Lab 01 baseline found and drive it onto Microsoft Authenticator and phishing-resistant methods. You will enable Authenticator for the estate, run a registration campaign that nudges SMS users to switch, scope SMS down to a shrinking exception group, then retire it, and prove the shift by re-running the baseline.

Section 1

Lab Metadata

Lab ID
IB-ENTRA-SEC-02
Difficulty
Intermediate
Scenario Org
Northgate Financial
Estimated Time
75 minutes

Core technologies

Authentication Methods policy Microsoft Authenticator Registration campaign SMS method scoping Microsoft Graph PowerShell Entra ID P1/P2
Section 2

Scenario and Description

IN PLAIN TERMS An SMS code is like a spare key left under the doormat. It works, but anyone who knows the trick, or who sweet-talks the postman, can lift it. The Microsoft Authenticator app is a key that lives only inside your own pocket and confirms who is asking before it turns. This lab hands everyone the pocket key first, nudges people to start using it, then removes the doormat key once nobody depends on it any more, in that careful order so nobody is left locked out.

Your Lab 01 baseline gave Northgate's programme board an uncomfortable number: a meaningful share of staff complete MFA over SMS text messages, and some administrators have no strong method registered at all. SMS is the weakest widely deployed second factor. It is exposed to SIM-swap fraud, SS7 interception and simple social engineering of mobile carriers. Regulators and the National Cyber Security Centre have moved firmly toward app-based and phishing-resistant factors.

Since 30 September 2025, Microsoft retired the ability to manage authentication methods in the legacy per-user MFA and legacy SSPR blades. There is now one place that governs which factors exist and who can use them: the Authentication Methods policy. This is a good thing. It is a single, targetable, Graph-manageable control plane, and it is where the whole of this lab lives.

You will enable Microsoft Authenticator for the estate, switch on the Authenticator registration campaign so that SMS users are prompted to adopt the app at sign-in, scope the SMS method down to a controlled exception group rather than the whole tenant, then disable SMS once the exception group is empty. This is the exact "migration away from SMS-based authentication to Microsoft Authenticator" work named in the specialist brief, done safely and reversibly.

Section 3

Prerequisites

Prior labs

Lab 01 is required. You need the seeded Northgate personas (asmith, jpatel, lokafor) and the baseline script, which you re-run at the end to measure the change. The tenant and P1/P2 licence set up in Lab 01 carry forward.

New Graph scope introduced

ScopeWhy it is needed
Policy.ReadWrite.AuthenticationMethodRead and change the Authentication Methods policy, including method state, targets and the registration campaign
Group.ReadWrite.AllCreate the SMS exception group used to scope the method down during migration
User.Read.All, GroupMember.ReadWrite.AllRead users and manage exception group membership
INFO: term check An "authentication method configuration" is one factor's settings inside the policy, for example the Microsoft Authenticator configuration or the SMS configuration. Each has a state (enabled or disabled) and includeTargets (which users or groups it applies to). You manage them individually.
Verify you are still connected and licensed
# From Lab 01 you already have PowerShell 7 and the Graph SDK.
Get-MgContext | Select-Object Account,TenantId

# Confirm the tenant has premium licensing (needed by later labs and the campaign):
(Get-MgSubscribedSku).ServicePlans |
  Where-Object { $_.ServicePlanName -match 'AAD_PREMIUM' } |
  Select-Object ServicePlanName,ProvisioningStatus -Unique
Section 4

Real-World Problem Statement

You cannot retire SMS with a single switch without risking lockouts for users who have no other factor. A safe migration reduces reliance gradually, gives users a prompted path to a stronger method, keeps a controlled exception for genuine edge cases, and measures progress the whole way.

DimensionWhy this migration matters
RiskSMS is defeated by SIM swap and interception. Moving to Authenticator with number matching removes an entire class of account-takeover attacks.
ComplianceApp-based and phishing-resistant MFA aligns with NCSC guidance and the direction of financial-sector supervisory expectations.
ProductivityThe registration campaign moves users to the app without a manual helpdesk drive, and the app is faster to use than waiting for a text.
Security postureYour Lab 01 SMS-reliant count becomes a metric that falls to zero, evidence the programme is working.

Concrete scenario: Northgate has 900 staff still registered for SMS, of whom around 200 have no app method. A hard cut-off would lock those 200 out on Monday morning. Your job is to move them across without a single preventable lockout, then close SMS behind them.

Section 5

Skills Mapped to Production Solutions

Skill learned in this labReal-world enterprise application
Reading and editing the Authentication Methods policy via GraphCentral, auditable control of which factors exist across the estate
Enabling Microsoft Authenticator with app and location contextReducing MFA fatigue attacks by showing users what they are approving
Running an Authenticator registration campaignEstate-wide method migration without a manual helpdesk programme
Scoping a method to a group, then disabling itPhased retirement of weak factors with a controlled exception path
Re-baselining to prove impactBefore-and-after metrics for the programme board and auditors
Section 6

Architecture Overview

Everything in this lab sits inside one object: the tenant's Authentication Methods policy. You edit three parts of it, the Microsoft Authenticator configuration, the SMS configuration, and the registration enforcement campaign, and you use one supporting group to hold the shrinking SMS exception list.

Authentication Methods policy /policies/authenticationMethodsPolicy Microsoft Authenticator state = enabled target = all_users app + location context on STRONGER factor Registration campaign state = enabled snooze = 0 days nudges SMS users to install the app SMS (Text message) state = enabled -> disabled target = SMS-Legacy group group shrinks to empty WEAK factor, retired SMS-Legacy-Allowed group controlled exception list

Data flow

  1. You enable Microsoft Authenticator for all users, so a stronger factor is available to everyone.
  2. The registration campaign intercepts SMS-only users at sign-in and prompts them to add the app.
  3. As users register the app, you remove them from the SMS-Legacy-Allowed group.
  4. When the group is empty, you set the SMS configuration state to disabled, retiring the weak factor.
PRODUCTION CONSIDERATION Never disable SMS globally on day one. In a real estate you enable the app and campaign first, watch the registration report climb over one to two weeks, and only then narrow and disable SMS. This lab compresses that timeline but keeps the same safe order.
Section 7

Step-by-Step Implementation

Phase A - Audit the current policy

REAL WORLD ANALOGYThe Authentication Methods policy is the building's rulebook of which kinds of keys are allowed through the front door: fobs, PIN codes, old metal keys. Before you rewrite the rulebook you read it, so you know exactly which key types are currently permitted and for whom. In an enterprise, this single policy is now the only rulebook, the old scattered notice boards were taken down in September 2025.

1Connect and read the existing method states

Purpose: know your starting point before you change anything.

Connect and list which methods are enabled
Connect-MgGraph -Scopes 'Policy.ReadWrite.AuthenticationMethod',
  'Group.ReadWrite.All','GroupMember.ReadWrite.All','User.Read.All' -NoWelcome

# List every method configuration and its current state.
Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration |
  Select-Object Id, State | Sort-Object Id | Format-Table -AutoSize

# Expected IDs include: MicrosoftAuthenticator, Sms, Fido2, Email,
# TemporaryAccessPass, SoftwareOath, Voice, X509Certificate.
VERIFICATION You get one row per method with a state of enabled or disabled. Note the current state of MicrosoftAuthenticator and Sms so you can confirm your changes later.

What just happened? You read the tenant's single source of truth for authentication factors. In many real tenants Authenticator is already enabled but scoped to a subset, and SMS is enabled for everyone, which is precisely the shape you are here to reverse.

Phase B - Enable Microsoft Authenticator for the estate

2Turn on Authenticator with app and location context

Purpose: make a strong factor available to everyone before you remove the weak one.

Context: number matching is enforced by Microsoft for all Authenticator push sign-ins and is not a toggle you set. What you do add here is application name and geographic location context, which show the user what they are approving and cut MFA-fatigue approvals.

Enable Authenticator, target all users, add context
$authenticatorBody = @{
  '@odata.type' = '#microsoft.graph.microsoftAuthenticatorAuthenticationMethodConfiguration'
  state = 'enabled'
  includeTargets = @(
    @{
      targetType = 'group'
      id = 'all_users'          # special built-in target meaning the whole tenant
      authenticationMode = 'any' # push or passwordless
    }
  )
  featureSettings = @{
    displayAppInformationRequiredState = @{
      state = 'enabled'
      includeTarget = @{ targetType = 'group'; id = 'all_users' }
    }
    displayLocationInformationRequiredState = @{
      state = 'enabled'
      includeTarget = @{ targetType = 'group'; id = 'all_users' }
    }
  }
}

Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'MicrosoftAuthenticator' `
  -BodyParameter $authenticatorBody
VERIFICATION
(Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'MicrosoftAuthenticator').State
# Expected: enabled

What just happened? Every user can now register and use the Authenticator app, and when they approve a sign-in they will see the requesting application and the sign-in location. That context is a direct, low-cost defence against push-fatigue attacks where a user blindly taps approve.

Phase C - Nudge SMS users onto the app

REAL WORLD ANALOGYThe registration campaign is the reception desk stopping you on your way in and handing you the new fob, rather than a memo email nobody reads. Because the prompt appears at sign-in itself, you physically cannot miss it, and it keeps appearing until you have the new key in hand. This is how enterprises migrate thousands of staff without a helpdesk campaign.

3Enable the Authenticator registration campaign

Purpose: prompt users who sign in with SMS to install and register Authenticator, without a manual helpdesk drive.

Context: the campaign lives in the policy's registrationEnforcement section. A snoozeDurationInDays of 0 means the prompt appears at every eligible sign-in until the user registers.

Configure the registration campaign for all users
$campaignBody = @{
  registrationEnforcement = @{
    authenticationMethodsRegistrationCampaign = @{
      state = 'enabled'
      snoozeDurationInDays = 0
      includeTargets = @(
        @{
          id = 'all_users'
          targetType = 'group'
          targetedAuthenticationMethod = 'microsoftAuthenticator'
        }
      )
    }
  }
}

Update-MgPolicyAuthenticationMethodPolicy -BodyParameter $campaignBody
VERIFICATION
(Get-MgPolicyAuthenticationMethodPolicy).RegistrationEnforcement.AuthenticationMethodsRegistrationCampaign.State
# Expected: enabled
INFO: who the campaign skips The campaign only prompts users who are eligible for Authenticator push and are not already registered for a stronger method. Users who already have the app, or who have FIDO2 keys, are left alone. That is why you enable the app in Phase B first.

What just happened? Entra will now interrupt SMS-only users at sign-in with a guided flow to set up the app. This is the engine of the migration, it moves the population for you rather than relying on emails nobody reads.

Phase D - Scope SMS down, then retire it

REAL WORLD ANALOGYScoping SMS to a group is turning the old side door into a guest-list door: it only opens for names on the list, and you cross names off one by one as each person collects their new fob. When the list is empty, you brick the door up. Retiring a factor this way means no one is ever locked out mid-migration, which is the difference between a managed change and a Monday-morning incident.

4Create the SMS exception group and re-target SMS

Purpose: stop SMS applying to everyone. Instead it applies only to a named group you can drain to zero.

Create the group and point the SMS method at it
# 1. Create a security group to hold the shrinking SMS exception list.
$grp = New-MgGroup -DisplayName 'SMS-Legacy-Allowed' `
  -MailEnabled:$false -MailNickname 'sms-legacy-allowed' `
  -SecurityEnabled:$true

# 2. Seed it with users who still genuinely need SMS (here: asmith as an example).
$domain = (Get-MgOrganization).VerifiedDomains | Where-Object IsDefault | Select-Object -ExpandProperty Name
$asmith = Get-MgUser -Filter "userPrincipalName eq 'asmith@$domain'"
New-MgGroupMember -GroupId $grp.Id -DirectoryObjectId $asmith.Id

# 3. Re-target the SMS method from everyone to just this group.
$smsBody = @{
  '@odata.type' = '#microsoft.graph.smsAuthenticationMethodConfiguration'
  state = 'enabled'
  includeTargets = @(
    @{ targetType = 'group'; id = $grp.Id; isUsableForSignIn = $true }
  )
}
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'Sms' -BodyParameter $smsBody
VERIFICATION
(Get-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'Sms').AdditionalProperties.includeTargets
# Expected: a single group target whose id matches $grp.Id, not all_users.

What just happened? SMS is no longer available to the whole tenant. Only members of SMS-Legacy-Allowed can use it. As users adopt the app you remove them from this group, and their SMS option disappears cleanly.

5Drain the group and disable SMS

Purpose: complete the retirement once the exception group is empty.

Remove a migrated user, then disable SMS when the group is empty
# As each user registers the app, remove them from the exception group.
Remove-MgGroupMemberByRef -GroupId $grp.Id -DirectoryObjectId $asmith.Id

# Check remaining members.
$remaining = Get-MgGroupMember -GroupId $grp.Id -All
"SMS exception members remaining: $($remaining.Count)"

# When the count is zero, disable SMS entirely.
if ($remaining.Count -eq 0) {
  Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
    -AuthenticationMethodConfigurationId 'Sms' `
    -BodyParameter @{ '@odata.type'='#microsoft.graph.smsAuthenticationMethodConfiguration'; state='disabled' }
  Write-Host 'SMS method disabled.' -ForegroundColor Green
}
SECURITY WARNING Confirm the registration report shows the affected users are MFA-capable via the app before you disable SMS. Disabling SMS for a user who has no other registered method will lock that user out at their next MFA prompt.

What just happened? SMS is retired for the tenant only after every dependent user has a stronger factor. This ordered drain is the difference between a clean migration and a Monday-morning flood of lockout tickets.

Section 8

Testing and Validation

  1. Sign in as asmith in a private browser window at office.com. You should be prompted by the registration campaign to set up Microsoft Authenticator.
  2. Complete the setup, approving a test prompt. Confirm the prompt shows the application name and location context you enabled in Phase B.
  3. Re-run the Lab 01 baseline script. The SMS-reliant count should fall and asmith should now report IsMfaCapable = true with microsoftAuthenticatorPush among the registered methods.
SymptomCauseResolution
Campaign never promptsUser already registered a strong method, or campaign targets exclude themTest with a fresh user, confirm campaign state = enabled and target is all_users
Update-Mg... returns 400 on SMSMissing or wrong @odata.type in the bodyInclude the exact type #microsoft.graph.smsAuthenticationMethodConfiguration
all_users target rejectedTypo, the literal string is requiredUse id = 'all_users' with targetType = 'group'
User locked out after SMS disableUser had no app method registeredRe-enable SMS for that user's group, register the app, then disable again
Section 9

Security Analysis

What makes this sound

Intentionally simplified for the lab

Production hardening

Section 10

Cleanup Instructions

INFO: preserve for the track Keep Authenticator enabled, it is assumed by every later lab. Only revert if you are resetting the tenant.
Revert SMS to enabled, disable the campaign, remove the group
# Re-enable SMS for all users (undo the scoping).
Update-MgPolicyAuthenticationMethodPolicyAuthenticationMethodConfiguration `
  -AuthenticationMethodConfigurationId 'Sms' `
  -BodyParameter @{ '@odata.type'='#microsoft.graph.smsAuthenticationMethodConfiguration'; state='enabled';
    includeTargets=@(@{ targetType='group'; id='all_users'; isUsableForSignIn=$true }) }

# Disable the registration campaign.
Update-MgPolicyAuthenticationMethodPolicy -BodyParameter @{
  registrationEnforcement=@{ authenticationMethodsRegistrationCampaign=@{ state='disabled' } } }

# Remove the exception group.
$g = Get-MgGroup -Filter "displayName eq 'SMS-Legacy-Allowed'"
if ($g) { Remove-MgGroup -GroupId $g.Id }
Disconnect-MgGraph
Section 12

Key Takeaways and Next Lab

Identity Bytes // IB-ENTRA-SEC Track // Lab 02 of 12. British English. For lab and training use against a disposable tenant only.