oeltayeb.com · Entra ID Toolkit

Reference

Sign-in log reading reference

Based on the article: Reading Microsoft Entra sign-in logs like an engineer · 6 min read

Every Entra ID problem ends up in the sign-in logs, and most wrong conclusions start there too: a "failure" that was just a prompt, a Conditional Access "Success" that enforced nothing, an IP that geolocates to the wrong country. In this post I'll explain the four log types, the fields that matter, how to trace one failed sign-in to its root cause, how to query the logs in Log Analytics, and the most common misreads.

How it works

You find the logs under Entra ID › Monitoring & health › Sign-in logs; Reports Reader is the least privileged role that can read them, and any user can see their own at https://mysignins.microsoft.com. Entries are system-generated and can't be edited or deleted. There are four tabs:

Log typeWhat it recordsTypical examples
Interactive user sign-insThe user provided an authentication factor: a password, an MFA response, a biometric, a QR code.Browser sign-in to Microsoft 365, MFA challenge, Windows Hello for Business unlock requesting a token.
Non-interactive user sign-insA client or OS component obtained a token on the user's behalf without prompting.Refresh token redeemed for an access token, authorization code redemption, SSO on an Entra joined PC, a second Office app on a phone using the same session.
Service principal sign-insAn application authenticated with its own certificate or secret.Automation scripts, SaaS integrations.
Managed identity sign-insAn Azure resource authenticated with a secret Azure manages.A Function App calling Key Vault.

Non-interactive entries are aggregated: when the application, user, IP address, status and resource ID match, the portal shows one row with a count in the # sign-ins column over a 1, 6 or 24 hour window. Expand the row to see each timestamp. For confidential clients the IP shown comes from the original token issuance, not the refresh request.

The fields that matter

Microsoft frames every sign-in as who (user), how (client application) and what (resource). Around those sit the fields you'll actually use:

FieldHow to read it
Status, Sign-in error code, Failure reason, Additional detailsStatus is Success, Failure or Interrupted. The code is the AADSTS number; the additional details often contain the fix.
Correlation IDGroups requests from the same sign-in session. Supplied by the client, so accuracy isn't guaranteed, but it's the key for joining interactive and non-interactive rows.
Request IDIdentifies one token request. The same Request ID can appear on an Interrupted row and then on the final Success or Failure row.
Client appBrowser, Mobile apps and desktop clients, or a legacy protocol such as Exchange ActiveSync, IMAP, POP, SMTP or MAPI.
Authentication requirementsingleFactorAuthentication or multiFactorAuthentication. If primary authentication failed before MFA was evaluated, it reads single-factor even though MFA would have been required.
Authentication details tabThe sequence of methods, whether each succeeded, and policies applied. "Satisfied by claim in the token" means no prompt was needed. Can be incomplete for a short while after the event.
Conditional Access tabEvery policy with its result: Success (evaluated for this user and app, even if nothing was enforced), Failure (controls not satisfied or block), Not applied, Disabled; plus a Report-only tab.
Device info tabDevice ID, browser, OS, and whether the device is compliant, managed or Microsoft Entra hybrid joined. Empty when the client sent no device state.
Token issuer type / Incoming token typeAzureAD, ADFederationServices, AzureADBackupAuth, ADFederationServicesMFAAdapter or NPSExtension; the incoming token type shows, for example, a primary refresh token or a SAML assertion.

Step-by-step: trace one failure end to end

  1. Isolate it. Filter by the user, set Status to Failure and narrow the date. If the user says "it just keeps prompting", look at Interrupted entries too.
  2. Read Basic info. Note the error code, failure reason and additional details, then copy the Request ID and Correlation ID. Look the code up at https://login.microsoftonline.com/error?code=<code> if the reason isn't clear.
  3. Check Conditional Access. A policy with Failure explains a 53003 or device error. A Report-only entry explains nothing yet, but shows what will break when you enable it.
  4. Check Authentication details. Did the password step succeed and MFA fail, or did it never reach MFA? Which method was attempted?
  5. Check Device info and Location. No device ID on a hybrid joined laptop points at a PRT or registration problem; an unexpected country is often a VPN egress, so treat location as best effort.
  6. Follow the Correlation ID into the non-interactive tab. A failed interactive sign-in is often preceded by a silent token refresh failure that explains the prompt.
  7. Use the Sign-in Diagnostic from the Basic info tab, and keep the Request ID, Correlation ID, timestamp and user ready if you open a support case.

Export, retention and KQL

The admin center keeps sign-ins for 7 days on Entra ID Free and 30 days on P1 and P2, and upgrading isn't retroactive. For longer, go to Entra ID › Monitoring & health › Diagnostic settings (Security Administrator) and send the categories you need to a Log Analytics workspace, a storage account, an event hub or a partner solution. SignInLogs, NonInteractiveUserSignInLogs, ServicePrincipalSignInLogs and ManagedIdentitySignInLogs land in the SigninLogs, AADNonInteractiveUserSignInLogs, AADServicePrincipalSignInLogs and AADManagedIdentitySignInLogs tables; add AuditLogs, RiskyUsers and UserRiskEvents while you're there. Query from Monitoring & health › Log Analytics or from the workspace.

In SigninLogs, ResultType is the error code as a string and 0 means success; Status, DeviceDetail and ConditionalAccessPolicies are dynamic columns you expand with dot notation. CreatedDateTime is when Entra ID processed the sign-in, TimeGenerated when the record was ingested.

kusto
// Failures for one user in the last 24 hours, grouped by code and app
SigninLogs
| where TimeGenerated > ago(24h)
| where UserPrincipalName =~ "sara@contoso.com" and ResultType != "0"
| summarize Count = count(), Reason = take_any(ResultDescription) by ResultType, AppDisplayName
| order by Count desc

// Everything that shares one session, interactive and non-interactive
union SigninLogs, AADNonInteractiveUserSignInLogs
| where CorrelationId == "aaaa0000-bb11-2222-33cc-444444dddddd"
| project TimeGenerated, Type, AppDisplayName, ResourceDisplayName, ResultType,
          ConditionalAccessStatus, AuthenticationRequirement, IPAddress
| order by TimeGenerated asc

// Portal-style view: the final outcome per correlation ID
SigninLogs
| where TimeGenerated > ago(7d)
| summarize FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated),
            FinalStatus = arg_max(TimeGenerated, ResultType, ConditionalAccessStatus), Count = count()
  by CorrelationId, UserPrincipalName

The last query matters because the portal merges every request in a session into one line, while Log Analytics stores each request: a user who fails an MFA prompt and then passes it produces one successful row in the portal and several rows in the workspace with the same Correlation ID. Programmatic access through Microsoft Graph (Get-MgAuditLogSignIn, AuditLog.Read.All) requires a P1 or P2 licence.

Tips & gotchas: common misreads

What you seeWhat it usually means
50058 failures with a GUID instead of a usernameThe user wasn't signed in yet, or a silent SSO attempt found no session. Expected noise, not a lockout.
50140, 50074, 50125, 50199Interrupts: the Keep me signed in prompt, an MFA challenge not yet passed, a password reset or registration step, and the app confirmation prompt in mobile browsers. Look for the follow-up row with the same Request ID.
500121The user didn't complete the MFA prompt, often because registration isn't finished.
50126 in volumeWrong password. Some is normal; a burst across many users from one ASN is a spray.
50053Smart lockout after repeated bad passwords, or a block because the IP showed malicious activity. The failure reason tells you which.
70043 / 70046A token expired because of a Conditional Access sign-in frequency or reauthentication check. Policy working as designed.
Conditional Access "Success" on a sign-in you expected blockedSuccess means the policy was evaluated for this user and app, not that its controls were enforced. Open the entry and read the conditions.
Windows Hello for Business sign-ins show "Not applied"Conditional Access protects tokens for cloud resources, not the Windows sign-in itself. Device registration and compliance bootstrap flows are exempt too.
Timestamps "don't match" the user's storyThe portal localises times to the admin's time zone, not the user's; Log Analytics stores UTC.
A passkey sign-in missing from the interactive tabSince April 2025, new sign-ins that obtain a refresh token with FIDO2 keys are logged as non-interactive.

References