I recently ran into a frustrating Azure authentication error while working with ARM (Azure Resource Manager) APIs.
The error looked like this:
Cache-Control: no-cache
Pragma: no-cache
WWW-Authenticate: Bearer authorization_uri="https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", error="invalid_token", error_description="The primary access token is from the wrong issuer. It must match the tenant associated with this subscription. Please use correct authority to get the token."
x-ms-failure-cause: gateway
x-ms-request-id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
The Problem
The critical clue was:
The primary access token is from the wrong issuer. It must match the tenant associated with this subscription.
When I decoded the token using JWT.io, the iss (issuer)
claim was:
f8cdef31-a31e-4b4a-93e4-5f571e91255
That GUID is the Microsoft Services tenant — it appears when you sign in with a personal Microsoft account (MSA).
My Azure subscription, however, was tied to a specific Azure Active Directory (AAD) tenant, so Azure rejected the token because the issuer didn’t match.
What Caused It
- I logged in using a personal Microsoft account (MSA).
- The subscription belonged to an Azure AD tenant (not the Microsoft Services tenant).
- Using
VisualStudioCodeCredentialorDefaultAzureCredentialstill returned tokens from the wrong issuer because the underlying login session was wrong.
Solution — Steps to Fix
The fix is straightforward: log into the correct tenant, set the subscription, and use credentials that respect the CLI session.
1) Log in to the correct tenant
az login --tenant <your-tenant-id>
2) Set the subscription
az account set --subscription <your-subscription-id-or-name>
3) Use Azure CLI credentials in C#
Instead of DefaultAzureCredential, switch to AzureCliCredential and fetch the token directly (this uses the Azure CLI credentials stored during az login — so make sure you’re logged in from the terminal):
// using Azure.Identity and Azure.Core
// var credential = new DefaultAzureCredential();
var credential = new AzureCliCredential();
string[] scopes = new[] { "https://management.azure.com/.default" };
var token = (await credential.GetTokenAsync(new TokenRequestContext(scopes))).Token;
// Optional alternative with explicit cancellation token
// token = (await credential.GetTokenAsync(new TokenRequestContext(scopes),
// System.Threading.CancellationToken.None)).Token;
Note: This uses Azure CLI credentials stored during az login, so ensure you are logged in to the correct tenant and subscription in your terminal before running this code.
Key Takeaways
- If your JWT
issclaim isf8cdef31-a31e-4b4a-93e4-5f571e91255, you’re using a Microsoft Services tenant token (MSA) — it won’t work for subscriptions tied to an Azure AD tenant. - Fix the login by targeting the correct tenant with
az login --tenant <tenant-id>and then set the subscription withaz account set --subscription <subscription-id-or-name>. - Using
AzureCliCredentialin C# picks up tokens from your active Azure CLI session and helps avoid issuer mismatch issues.