In this module
EI1.4 Authentication Details Deep Dive
The AuthenticationDetails array
The AuthenticationDetails field in the sign-in log is an array of JSON objects, each representing one step in the authentication process. A simple password-only sign-in has one element. A password + MFA sign-in has two elements. A passwordless sign-in (FIDO2 or passkey) has one element but with different properties than a password sign-in.
Each element in the array contains the following fields:
Reading the array in KQL
The AuthenticationDetails field is stored as a JSON array, which requires specific KQL operators to parse. Here is how to extract the authentication method details:
// EI1.4 — Extract authentication method from sign-in logs
// Shows exactly which method each user used for primary auth and MFA
SigninLogs
| where TimeGenerated > ago(24h)
| where ResultType == 0 // Successful sign-ins only
| extend AuthDetail = parse_json(AuthenticationDetails)
| extend PrimaryMethod = tostring(AuthDetail[0].authenticationMethod)
| extend PrimaryDetail = tostring(AuthDetail[0].authenticationStepResultDetail)
| extend MFAMethod = tostring(AuthDetail[1].authenticationMethod)
| extend MFADetail = tostring(AuthDetail[1].authenticationStepResultDetail)
| project
TimeGenerated,
UserPrincipalName,
PrimaryMethod, // "Password", "FIDO2 security key", "Passkey", etc.
PrimaryDetail, // "MFA requirement satisfied by claim in the token", etc.
MFAMethod, // The second factor method (if MFA was required)
MFADetail, // "MFA successfully completed", etc.
AppDisplayName,
ConditionalAccessStatus
| order by TimeGenerated desc
// Key lookups:
// PrimaryMethod = "Password" + MFAMethod = "Microsoft Authenticator" → phishing-capable
// PrimaryMethod = "FIDO2 security key" → phishing-resistant (no MFA step needed)
// PrimaryDetail = "MFA requirement satisfied by claim in the token" → MFA from prior sessionThe critical distinction is between "MFA requirement satisfied by claim in the token" and "MFA successfully completed." The first means the user completed MFA in a previous session and the claim carried over — the user was not actually challenged for MFA on this specific sign-in. The second means the user actively completed an MFA challenge during this sign-in. For security verification, you want to see active MFA challenges on sensitive sign-ins, not just claim carryover from a previous session that may have occurred hours or days ago.
Phishing-resistant vs phishing-capable
The authentication method detail is the field that determines your organization's exposure to AiTM attacks. Here is the security classification:
Phishing-resistant methods (cannot be proxied through AiTM because they cryptographically verify the domain): FIDO2 security key, Passkey (Microsoft Authenticator), Passkey (synced), Windows Hello for Business, X.509 certificate (certificate-based authentication). When these methods are used, the PrimaryMethod shows the method name and there is typically no second step — the method satisfies both primary authentication and MFA in a single cryptographic operation.
// EI1.4 — Classify all sign-ins by authentication strength
// Identifies phishing-resistant vs phishing-capable across your tenant
SigninLogs
| where TimeGenerated > ago(7d)
| where ResultType == 0
| extend AuthDetail = parse_json(AuthenticationDetails)
| extend PrimaryMethod = tostring(AuthDetail[0].authenticationMethod)
| extend MFAMethod = tostring(AuthDetail[1].authenticationMethod)
| extend AuthStrength = case(
PrimaryMethod in ("FIDO2 security key", "Passkey (Microsoft Authenticator)",
"Windows Hello for Business", "X.509 Certificate"), "Phishing-Resistant",
MFAMethod != "", "Phishing-Capable (MFA)",
PrimaryMethod == "Password", "Weak (Password Only)",
"Other"
)
| summarize
SignInCount = count(),
DistinctUsers = dcount(UserPrincipalName)
by AuthStrength
| order by SignInCount desc
// Goal: Phishing-Resistant should be the largest category for privileged users
// Weak (Password Only) should be zero if legacy auth is blockedMFA satisfaction: completed vs claimed
A subtle but important distinction in the AuthenticationDetails is how MFA was satisfied. There are three scenarios:
MFA actively completed on this sign-in. The user received a prompt and completed the challenge. The AuthenticationDetails show two steps: primary authentication (password) and MFA (Authenticator, phone, etc.) with authenticationStepResultDetail "MFA successfully completed." This is the most secure scenario — the user proved their identity at the moment of this specific sign-in.
// EI1.4 — Find sign-ins where MFA was satisfied by claim, not active challenge
// Combined with unusual IP — potential token replay indicator
SigninLogs
| where TimeGenerated > ago(24h)
| where ResultType == 0
| where AuthenticationRequirement == "multiFactorAuthentication"
| extend AuthDetail = parse_json(AuthenticationDetails)
| extend MFASatisfaction = tostring(AuthDetail[0].authenticationStepResultDetail)
| where MFASatisfaction has "claim in the token"
| project
TimeGenerated,
UserPrincipalName,
AppDisplayName,
IPAddress,
Location = strcat(tostring(LocationDetails.city), ", ",
tostring(LocationDetails.countryOrRegion)),
MFASatisfaction,
RiskLevelDuringSignIn
| order by TimeGenerated desc
// Review: Are these from expected IPs and locations?
// MFA-by-claim from an unexpected location = investigate immediatelyTry it yourself
Try It — Classify Your Authentication Methods
Environment: Your M365 developer tenant with Sentinel workspace.
Exercise: Run the authentication strength classification query from above against your developer tenant. Answer these questions:
1. What percentage of sign-ins are phishing-resistant vs phishing-capable? 2. Are any sign-ins in the "Weak (Password Only)" category? If so, which applications and users? 3. For your admin account, what PrimaryMethod appears? If it is "Password," your admin account is signing in with a phishing-capable method — EI2 will address this.
Then run the MFA satisfaction query. Look at how MFA was satisfied — was it actively completed or satisfied by a cached claim? For a developer tenant with few users and no configured sign-in frequency, you may see mostly active completions. In a production environment, claim-based satisfaction is common and expected.
The myth: We have a conditional access policy that requires MFA for all users. Every sign-in is protected by multi-factor authentication.
The reality: "MFA required" does not specify which MFA method. A user completing MFA with an SMS code satisfies the MFA requirement but uses a phishing-capable method. A user completing MFA with a push notification satisfies the requirement but is vulnerable to MFA fatigue. Only a user completing MFA with a FIDO2 key or passkey satisfies the requirement with a phishing-resistant method. The AuthenticationDetails array reveals exactly which method was used. If your policy says "require MFA" but your users are all using push notifications, you are protected against password spray but vulnerable to AiTM. EI4 teaches how to build conditional access policies that require specifically phishing-resistant methods — authentication strength policies, not just "require MFA."
You are reviewing NE's Entra ID security posture. You find 4 accounts with Global Administrator role, but NE's policy says maximum 2. The extra 2 were added during the AiTM incident for emergency response and never removed. Do you remove them?
Remove them — but through the proper process, not unilaterally. Notify the account owners that their emergency GA assignment is being revoked, confirm they have their standard role assignments restored, and document the removal with the rationale ('emergency assignment during INC-NE-2026-0227-001, no longer required'). Then add a PIR action item: 'Implement PIM time-limited role assignments for future incident response — emergency GA assignments auto-expire after 8 hours rather than persisting indefinitely.' The stale emergency assignment is a governance failure, not a technical failure — the fix is procedural.
You've mapped the identity threat landscape and learned to read sign-in logs.
EI0 established that every cloud attack starts with identity. EI1 took you through the signal that matters most — interactive, non-interactive, service principal, and managed identity sign-ins. Now you engineer the defences.
- 17 engineering modules — authentication methods, conditional access architecture, Identity Protection, PIM, token protection, application governance, and detection rules
- The Defense Design Method — the six-step framework applied to every identity control you'll build
- EI18 Capstone — Identity Security Architecture Design — design complete identity architectures for three realistic organisations (SMB, mid-market, regulated enterprise)
- Identity Security Toolkit lab pack — deployable conditional access policies, PIM configurations, and Identity Protection risk rules
- Cross-domain detection (EI16) — email-to-identity correlation and the full phishing-to-inbox-rule attack chain