AuthenticationDetails Explained
The email was delivered. The sender looked familiar. The user saw a message that appeared to belong in the mailbox.
But the authentication story did not fully line up.
AuthenticationDetails is one of the most useful fields in Microsoft Defender XDR, but it is also one of the easiest to misread. It can show DMARC, SPF, DKIM and Composite Authentication results inside the same email event.
This Agent Foskett investigation explains how to read AuthenticationDetails with KQL, how to recognise sender alignment problems, and why a message can look trusted even when the evidence says it deserves a closer review.
The goal is simple: stop reading authentication as pass or fail only. Read it as a story.
AuthenticationDetails summary
A practical Microsoft Defender guide to interpreting DMARC, SPF, DKIM and CompAuth results inside EmailEvents so authentication evidence can be explained clearly.
What we are looking for
Baseline query: view AuthenticationDetails in EmailEvents
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
EmailEvents
| where Timestamp > ago(30d)
| project
Timestamp,
SenderFromAddress,
SenderFromDomain,
SenderMailFromAddress,
SenderMailFromDomain,
RecipientEmailAddress,
Subject,
AuthenticationDetails,
DeliveryAction,
NetworkMessageId
| order by Timestamp descWhat AuthenticationDetails can tell you
Query: find DMARC failures in AuthenticationDetails
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
EmailEvents
| where Timestamp > ago(30d)
| where AuthenticationDetails has "dmarc=fail"
| project
Timestamp,
SenderFromAddress,
SenderFromDomain,
SenderMailFromAddress,
SenderMailFromDomain,
RecipientEmailAddress,
Subject,
AuthenticationDetails,
DeliveryAction
| order by Timestamp descQuery: sender mismatch with authentication evidence
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
EmailEvents
| where Timestamp > ago(30d)
| where SenderFromDomain != SenderMailFromDomain
| project
Timestamp,
SenderFromAddress,
SenderFromDomain,
SenderMailFromAddress,
SenderMailFromDomain,
RecipientEmailAddress,
Subject,
AuthenticationDetails,
DeliveryAction
| order by Timestamp descQuery: summarise AuthenticationDetails patterns
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
EmailEvents
| where Timestamp > ago(30d)
| summarize
MessageCount = count(),
RecipientCount = dcount(RecipientEmailAddress),
FirstSeen = min(Timestamp),
LastSeen = max(Timestamp)
by SenderFromDomain, SenderMailFromDomain, AuthenticationDetails, DeliveryAction
| where MessageCount >= 3
| order by MessageCount descQuery: pivot from authentication evidence to URL clicks
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
let SuspiciousAuthMail =
EmailEvents
| where Timestamp > ago(30d)
| where AuthenticationDetails has_any ("dmarc=fail", "spf=fail", "dkim=fail", "spoof")
| where DeliveryAction has_any ("Delivered", "Allowed", "Junked")
| project NetworkMessageId, EmailTime = Timestamp, SenderFromAddress, RecipientEmailAddress, Subject, AuthenticationDetails;
SuspiciousAuthMail
| join kind=inner (
UrlClickEvents
| where Timestamp > ago(30d)
| project NetworkMessageId, ClickTime = Timestamp, AccountUpn, Url, ActionType
) on NetworkMessageId
| order by ClickTime descWhat happens after authentication looks questionable?
View delivered DMARC case →
View session hijacking →
Investigate file access →
Continue your investigation
Open guide →
Review spoofing →
Open KQL hub →
