Part 4 of my complete AADSTS reference covers every code Microsoft lists from AADSTS90002 to AADSTS90130, in the order of Microsoft's table. These 67 codes are mostly about the request itself: the tenant in the URL, missing or malformed parameters, national clouds, WS-Federation, Graph and consent, and the /common and /consumers endpoints. Each row gives the meaning in plain English, the usual cause and the first check.
Codes in this quick reference
AADSTS90002 InvalidTenantName: tenant not found (wrong tenant ID, domain or cloud)Sign-in page / app errorAADSTS90004 InvalidRequestFormat: the request isn't properly formattedApp error / token responseAADSTS90005 InvalidRequestWithMultipleRequirements: identifier and login hint used togetherSign-in page / app errorAADSTS90006 ExternalServerRetryableError: the service is temporarily unavailableSign-in page / app errorAADSTS90007 InvalidSessionId: the session ID passed can't be parsedSign-in pageAADSTS90008 TokenForItselfRequiresGraphPermission: app needs the sign-in and read user profile permissionSign-in page / app errorAADSTS90009 TokenForItselfMissingIdenticalAppIdentifier: use the GUID app ID to request a token for itselfApp error / token responseAADSTS90010 NotSupported: unable to create the algorithmApp error / token response
+ 52 more codes in the tables below.
Note: The series: part 1 (16000–50079), part 2 (50085–54005), part 3 (65001–81012), part 4 (this page) and part 5 (120000 and above). The codes admins meet most often are also in the AADSTS quick reference.
How to read these codes#
- Who sees them: mostly developers and admins running scripts. The code comes back in the token endpoint's JSON (
error,error_codes,error_description,correlation_id) or on the Microsoft sign-in page when a browser carries the bad request. A request that fails before Entra ID knows which tenant it belongs to, such as 90002, can't appear in your sign-in logs, so the app's output is your evidence. - Read the authority first. The URL either names a tenant (ID or verified domain) or uses
/organizations(work and school accounts),/consumers(personal accounts) or/common(both). Several codes here mean the app picked the wrong one for its supported account types. - National clouds have their own sign-in hosts, for example
login.microsoftonline.usfor Azure Government andlogin.partner.microsoftonline.cnfor Microsoft Azure operated by 21Vianet. A tenant can only sign in through its own cloud. - Capture the request with the browser's developer tools (Network tab, preserve log) or an HTTP capture tool such as Fiddler, which Microsoft suggests for malformed-request errors.
To see the raw error from a script, send a token request and print the JSON body:
$body = @{
client_id = '<application-id>'
client_secret = '<secret>' # prefer a certificate in production
scope = 'https://graph.microsoft.com/.default'
grant_type = 'client_credentials'
}
try {
Invoke-RestMethod -Method Post -ContentType 'application/x-www-form-urlencoded' `
-Uri 'https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token' -Body $body
} catch {
$_.ErrorDetails.Message | ConvertFrom-Json | Select-Object error, error_codes, error_description
}Tenant lookup and malformed requests (90002–90027)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
AADSTS90002 InvalidTenantName | The tenant name wasn't found | Wrong tenant ID or domain, the wrong cloud, or a tenant guessed from an unregistered email domain | Tenant in the authority URL. For hybrid join, see the Windows enrollment codes |
AADSTS90004 InvalidRequestFormat | The request isn't properly formatted | Malformed request from the app or a device in between | Capture the request and compare it with the protocol docs |
AADSTS90005 InvalidRequestWithMultipleRequirements | The identifier and the login hint can't be used together | The app sends both | Send only one of them |
AADSTS90006 ExternalServerRetryableError | The service is temporarily unavailable | Transient | Retry with backoff |
AADSTS90007 InvalidSessionId | Bad request: the session ID can't be parsed | Damaged or altered session value | Fresh sign-in in a clean browser session |
AADSTS90008 TokenForItselfRequiresGraphPermission | No consent: the app needs at least the "sign in and read user profile" permission | Microsoft Graph User.Read missing or not consented | Add User.Read and grant consent |
AADSTS90009 TokenForItselfMissingIdenticalAppIdentifier | The app requests a token for itself, which works only when the resource is its GUID app ID | Resource given as a name or URI | Use the client ID (GUID) as the resource |
AADSTS90010 NotSupported | Unable to create the algorithm | Microsoft's MSAL.NET docs also show 90010 for a grant type sent to /common | Use /organizations or a tenant-specific authority |
AADSTS9001023 | The grant type isn't supported over the /common or /consumers endpoints | Authority set to a global endpoint for this flow | Use /organizations or the tenant-specific endpoint |
AADSTS90012 RequestTimeout | The requests have timed out | Network or proxy delay, or a service problem | Retry; check the proxy path |
AADSTS90013 InvalidUserInput | The user's input isn't valid | Bad value typed on the page | Re-enter the value |
AADSTS90014 MissingRequiredField | An expected field is missing from the credential | Incomplete request from the app | Required fields for the flow |
AADSTS900144 | The request body must contain the parameter named in the message | Parameter missing, or the body isn't form-encoded | Send the body as application/x-www-form-urlencoded |
AADSTS90015 QueryStringTooLong | The query string is too long | Oversized parameters in the URL | What the app puts in state, scope and other parameters |
AADSTS90016 MissingRequiredClaim | The access token isn't valid: a required claim is missing | Token from the wrong flow or for another audience | Decode the token (for example at jwt.ms) and compare claims |
AADSTS90019 MissingTenantRealm | Entra ID can't work out the tenant from the request | Global endpoint with nothing that identifies the tenant | Use a tenant-specific authority |
AADSTS90020 | The SAML 1.1 assertion is missing the user's ImmutableID | The federation server doesn't issue the ImmutableID claim | Claim rules on the federation server (AD FS or third party) |
AADSTS90022 AuthenticatedInvalidPrincipalNameFormat | The principal name isn't in the expected name[/host][@realm] format | Malformed principal name from the client | The principal name the client sends |
AADSTS90023 InvalidRequest | The authentication service request isn't valid | Malformed or unsupported request | Capture and compare with the protocol docs |
AADSTS900236 InvalidRequestSamlPropertyUnsupported | The SAML request sets a property (named in the message) that isn't supported | Service provider setting | Remove that property in the app's SAML settings |
AADSTS9002313 InvalidRequest | The request is malformed or invalid | Something wrong in the request to an endpoint | Microsoft suggests a Fiddler trace of the failing request |
AADSTS9002332 | The app is for Microsoft Entra users only, so the /consumers endpoint can't serve the request | Personal-account flow against a work-only app | /organizations or tenant endpoint, or change supported account types |
AADSTS90024 RequestBudgetExceededError | A transient error occurred | Request budget exceeded | Retry with backoff |
AADSTS90027 | Tokens can't be issued from this API version for personal Microsoft accounts | The app uses the v1.0 protocol for consumer accounts | The vendor must move to the v2.0 protocol |
Directory service, national clouds and throttling (90033–900612)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
AADSTS90033 MsodsServiceUnavailable | The Microsoft Online Directory Service (MSODS) isn't available | Service-side problem | Service health; retry |
AADSTS90036 MsodsServiceUnretryableFailure | Unexpected, non-retryable error from the directory service | Service-side problem | Open a support case |
AADSTS90038 NationalCloudTenantRedirection | The tenant belongs to a national cloud that the current cloud doesn't federate with | The app signs in against the wrong cloud | Use the sign-in host of the tenant's cloud |
AADSTS900384 | The JWT token failed signature validation | Several; the returned exception says which | Exception text, then the signing key or certificate |
AADSTS90043 NationalCloudAuthCodeRedirection | The feature is disabled | An authorization-code flow crossing national clouds | Keep the whole flow in one cloud |
AADSTS900432 | Confidential clients aren't supported in a cross-cloud request | Confidential client used across clouds | Which cloud each step of the flow targets |
AADSTS90051 InvalidNationalCloudId | The national cloud identifier isn't valid | Wrong cloud or instance setting | The app's cloud or instance configuration |
AADSTS90055 TenantThrottlingError | Too many incoming requests; raised for blocked tenants | An app or script flooding the service | Find the noisy client; cache tokens |
AADSTS90056 BadResourceRequest | To redeem a code for a token, the app must POST it to the /token endpoint | Wrong endpoint or method | App registrations › Endpoints against the app's settings |
AADSTS900561 BadResourceRequestInvalidRequest | The endpoint accepts only certain HTTP verbs (such as POST) and got another (such as GET) | Developer error, or the user pressed Back | Ignore it after a Back press; otherwise fix the method |
AADSTS900612 | The provider's signing keys from its JWKS endpoint can't be parsed | An external identity provider publishes keys in an unexpected format | The provider's JWKS output |
External users and WS-Federation (90072–90087)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
AADSTS90072 PassThroughUserMfaError | The external account doesn't exist in the tenant, so it can't meet the tenant's MFA requirement | Guest never added, or an ImmutableID mismatch for synced users | Add the account as an external user. Guide |
AADSTS90081 OrgIdWsFederationMessageInvalid | A WS-Federation message couldn't be processed because it isn't valid | Malformed message from the app or the identity provider | Capture the WS-Federation request and response |
AADSTS90082 OrgIdWsFederationNotSupported | The authentication policy selected for the request isn't supported | The app requests an unsupported policy | The app's WS-Federation settings |
AADSTS90084 OrgIdWsFederationGuestNotAllowed | Guest accounts aren't allowed for this site | A guest opened a member-only site | Use a member account |
AADSTS90085 OrgIdWsFederationSltRedemptionFailed | No token: the company object isn't provisioned yet | Tenant still being provisioned | Wait, then retry |
AADSTS90086 OrgIdWsTrustDaTokenExpired | The user's DA token has expired | Expired token in a WS-Trust exchange | Sign in again |
AADSTS90087 OrgIdWsFederationMessageCreationFromUriFailed | The WS-Federation message couldn't be built from the URI | Malformed sign-in URL | Parameters in the WS-Federation URL |
Graph and consent (90090–90095)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
AADSTS90090 GraphRetryableError | The service is temporarily unavailable | Transient | Retry with backoff |
AADSTS90091 | The Graph service is unreachable | Service-side problem | Retry; service health |
AADSTS90092 | A non-retryable Graph error | Service-side problem | Support case with the correlation ID |
AADSTS90093 GraphUserUnauthorized | Graph returned a forbidden error: the user can't grant what the app requests | Permissions only an admin can grant | Admin consent. Guide |
AADSTS90094 AdminConsentRequired | Administrator consent is required | User consent restricted, or high-privilege permissions | Admin consent or the workflow. Guide |
AADSTS900382 | Confidential clients aren't supported in a cross-cloud request (same text as 900432) | Confidential client used across clouds | Which cloud each step targets |
AADSTS90095 AdminConsentRequiredRequestAccess | Admin consent workflow interrupt: the user is told to ask an admin for approval | Expected when the workflow is on | Review Enterprise apps › Admin consent requests |
Partner apps, parameters, device code and endpoints (90099–90130)#
| Code | Meaning | Usual cause | First check |
|---|---|---|---|
AADSTS90099 | The app isn't authorized in the tenant, so partner delegated admins can't use it | No pre-consent in the customer tenant | Pre-consent, or the Partner Center API that authorizes it |
AADSTS900971 | No reply address was provided | Request without a redirect URI | redirect_uri and the registered URIs |
AADSTS90100 InvalidRequestParameter | A parameter is empty or not valid | Bad value in the request | The parameter named in the message |
AADSTS901002 | The resource request parameter isn't supported | v1.0-style request sent to the v2.0 endpoint | Use scopes, such as https://graph.microsoft.com/.default |
AADSTS90101 InvalidEmailAddress | Not a valid email address (format: someone@example.com) | Typo | The address entered |
AADSTS90102 InvalidUriParameter | The value must be a valid absolute URI | Relative or malformed URI, such as a redirect URI | Use the full URI, including the scheme |
AADSTS90107 InvalidXml | The request isn't valid: the data contains invalid characters | Bad characters or encoding in XML (SAML, WS-Federation) | Encoding of the request |
AADSTS90112 | The application identifier is expected to be a GUID | Name or URI sent instead of the client ID | Use the application (client) ID |
AADSTS90114 InvalidExpiryDate | The bulk token's expiry time would produce a token that has already expired | Expiry set in the past | Request the bulk token again with a future expiry |
AADSTS90117 | Invalid request input | Bad input from the client | Capture the request |
AADSTS90119 InvalidUserCode | Device code flow: the user code is null or empty | No code entered | Enter the code shown on the device |
AADSTS90120 InvalidDeviceFlowRequest | The request was already authorized or declined | The device code was reused | Start a new device code sign-in |
AADSTS90121 InvalidEmptyRequest | Invalid empty request | The client sent nothing usable | Capture the request |
AADSTS90123 IdentityProviderAccessDenied | No token: the identity or claims provider denied the request | Refusal at the federated or external provider | The provider's own logs |
AADSTS90124 V1ResourceV2GlobalEndpointNotSupported | The resource isn't supported over /common or /consumers | Authority set to a global endpoint | Use /organizations or a tenant-specific endpoint |
AADSTS90125 DebugModeEnrollTenantNotFound | The user isn't in the system | Mistyped user name | Check the user name |
AADSTS90126 DebugModeEnrollTenantNotInferred | This user type isn't supported on the endpoint; the tenant can't be inferred from the user name | The authority can't resolve the tenant | User name, and a tenant-specific endpoint |
AADSTS90130 NonConvergedAppV2GlobalEndpointNotSupported | The app isn't supported over /common or /consumers | Authority set to a global endpoint | Use /organizations or a tenant-specific endpoint |
How to verify a fix#
- Re-run the same request. Good: the token endpoint returns an
access_token; if another problem was hiding behind the first, you get a different code inerror_codes. - Check that the authority in the app's settings matches its Supported account types: a tenant ID or
/organizationsfor work-only apps, and the right cloud's sign-in host. - Consent codes: after an admin approves the request under Admin consent requests, the user signs in without the prompt.
- Transient codes (90006, 90024, 90033, 90090): they should clear on retry with backoff. If they don't, check service health in the Microsoft 365 admin center and open a case with the correlation ID and timestamp.
- For app-only flows with sign-in logs in Log Analytics, confirm the failures stop:
KQL
AADServicePrincipalSignInLogs | where TimeGenerated > ago(7d) | where ResultType in ("90002", "90014", "900144", "9001023", "90055") | summarize Failures = count() by ResultType, ServicePrincipalName, bin(TimeGenerated, 1d)
For reading the entries themselves, see Reading Microsoft Entra sign-in logs like an engineer; for app registration hygiene, see App registrations and service principals.
References#
- Microsoft Entra authentication and authorization error codes (Microsoft Learn): the source table for every code on this page.
- Handle errors and exceptions in MSAL.NET (Microsoft Learn): how apps see these codes, including 90010 with
/common. - Microsoft Entra authentication and national clouds (Microsoft Learn): the sign-in hosts for each cloud instance.

