Skip to content

az acr login regression in 2.87.0 on AzureML compute MSI/SSO #33698

Description

@elonp

Describe the bug

az acr login regression in 2.87.0 on AzureML compute MSI/SSO

Summary

az acr login appears to regress between Azure CLI 2.81.0 and 2.87.0 on an AzureML Compute
Instance using az login --identity.

On the same AzureML compute instance, Azure CLI 2.81.0 succeeds with az acr login, while
Azure CLI 2.87.0 fails. A direct ACR OAuth /oauth2/exchange using the ARM access token succeeds,
so this does not appear to be an ACR RBAC issue.

Repro commands

az login --identity
az acr login -n $ACR

Observed behavior with Azure CLI 2.87.0

az account get-access-token --resource https://management.azure.com/
=> succeeds

az account get-access-token --resource https://containerregistry.azure.net
=> fails:
ERROR: {'error': 'SSO failure, to mitigated it please try to click Jupyter/JupyterLab.'}
Run the command below to authenticate interactively; additional arguments may be added as needed:
az logout
az login

az acr login -n $ACR--expose-token
=> fails:
WARNING: Unable to get AAD authorization tokens with message: {'error': 'SSO failure, to mitigated it please try to click Jupyter/JupyterLab.'}
WARNING: Unable to get admin user credentials with message: Admin user is disabled.
ERROR: Unable to authenticate using AAD or admin login credentials. Please specify both username and password in non-interactive mode.

az acr login -n $ACR
=> fails with the same warnings/errors

Expected behavior / behavior with Azure CLI 2.81.0

az account get-access-token --resource https://containerregistry.azure.net
=> fails with the same SSO error

az acr login -n $ACR --expose-token
=> succeeds and returns an accessToken

az acr login -n amlacraepije663sbqi
=> Login Succeeded

Installing Azure CLI 2.81.0 into an isolated venv on the same machine makes az acr login work:

python -m venv ~/azcli-2.81-test
source ~/azcli-2.81-test/bin/activate
pip install 'azure-cli==2.81.0'
az login --identity
az acr login -n $ACR --expose-token
az acr login -n $ACR

Additional evidence

A direct ACR OAuth exchange using the ARM access token succeeds on the failing Azure CLI 2.87.0
machine:

ARM token: ok
ACR OAuth exchange with ARM token: {"exchange": "ok", "has_refresh_token": true}

The direct exchange is:

POST https://$ACR.azurecr.io/oauth2/exchange

grant_type=access_token
service=$ACR.azurecr.io
tenant=<tenant-id>
access_token=<ARM access token for https://management.azure.com/>

Using the returned refresh token with Docker succeeds:

printf '%s' "$REFRESH_TOKEN" | docker login $ACR.azurecr.io \
  -u 00000000-0000-0000-0000-000000000000 \
  --password-stdin

Result:

Login Succeeded

This suggests ACR authorization and registry-side OAuth exchange are working, but the Azure CLI
2.87.0 az acr login implementation is not using, or is no longer falling back to, the ARM-token
exchange path that works in Azure CLI 2.81.0.

Suspected regression area

Likely area: built-in ACR command module / auth path used by az acr login.

The ACR module files differ between working 2.81.0 and failing 2.87.0 installations:

azure.cli.command_modules.acr custom.py: different SHA256
azure.cli.command_modules.acr _docker_utils.py: different SHA256
azure.cli.command_modules.acr _constants.py: different SHA256

The suspected behavior change is in how az acr login chooses between:

  1. acquiring an AAD token for https://containerregistry.azure.net, and
  2. exchanging an ARM token at https://<registry>/oauth2/exchange.

In this AzureML MSI/SSO environment, path (1) fails but path (2) succeeds. Azure CLI 2.81.0 still
logs in successfully; Azure CLI 2.87.0 fails.

Related command

az login --identity
az acr login -n $ACR

Errors

ERROR: {'error': 'SSO failure, to mitigated it please try to click Jupyter/JupyterLab.'}
Run the command below to authenticate interactively; additional arguments may be added as needed:
az logout
az login

Issue script & Debug output

(azureml_py38) azureuser@elonp2:~/repos/kblam/collabs/ct/image$ az acr login -n $ACR --debug
cli.knack.cli: Command arguments: ['acr', 'login', '-n', 'amlacraepije663sbqi', '--debug']
cli.knack.cli: init debug log:
Enable color in terminal.
cli.knack.cli: Event: Cli.PreExecute []
cli.knack.cli: Event: CommandParser.OnGlobalArgumentsCreate [<function CLILogging.on_global_arguments at 0x7ba1d766fac0>, <function OutputProducer.on_global_arguments at 0x7ba1d75dd990>, <function CLIQuery.on_global_arguments at 0x7ba1d740ad40>]
cli.knack.cli: Event: CommandInvoker.OnPreCommandTableCreate []
cli.azure.cli.core: Using packaged command index for profile 'latest'.
cli.azure.cli.core: Found installed extension 'azure-cli-ml' (azext_ml).
cli.azure.cli.core: Blending packaged core index with local extension index.
cli.azure.cli.core: Modules found from index for 'acr': ['azure.cli.command_modules.acr']
cli.azure.cli.core: Loading command modules...
cli.azure.cli.core: Loaded command modules in parallel:
cli.azure.cli.core: Name Load Time Groups Commands
cli.azure.cli.core: acr 0.055 36 150
cli.azure.cli.core: Total (1) 0.057 36 150
cli.azure.cli.core: These extensions are not installed and will be skipped: ['azext_ai_examples', 'azext_next']
cli.azure.cli.core: Loading extensions:
cli.azure.cli.core: Name Load Time Groups Commands Directory
cli.azure.cli.core: Total (0) 0.000 0 0
cli.azure.cli.core: Loaded 36 groups, 150 commands.
cli.azure.cli.core: Found a match in the command table.
cli.azure.cli.core: Raw command : acr login
cli.azure.cli.core: Command table: acr login
cli.knack.cli: Event: CommandInvoker.OnPreCommandTableTruncate [<function AzCliLogging.init_command_file_logging at 0x7ba1d7160a60>]
cli.azure.cli.core.azlogging: metadata file logging enabled - writing logs to '/home/azureuser/.azure/commands/2026-07-03.10-41-21.acr_login.85242.log'.
az_command_data_logger: command args: acr login -n {} --debug
cli.knack.cli: Event: CommandInvoker.OnPreArgumentLoad [<function register_global_subscription_argument..add_subscription_parameter at 0x7ba1d7179d80>]
cli.knack.commands: Configured default 'eyeson.heron.prod.e02fd9de-d296-41d1-bd86-efc4853e27da' for arg resource_group_name
cli.knack.cli: Event: CommandInvoker.OnPostArgumentLoad []
cli.knack.cli: Event: CommandInvoker.OnPostCommandTableCreate [<function register_ids_argument..add_ids_arguments at 0x7ba1d71a16c0>, <function register_global_policy_argument..add_global_policy_argument at 0x7ba1d71a17e0>, <function register_cache_arguments..add_cache_arguments at 0x7ba1d71a1870>, <function register_upcoming_breaking_change_info..update_breaking_change_info at 0x7ba1d71a1900>]
cli.knack.cli: Event: CommandInvoker.OnCommandTableLoaded []
cli.knack.cli: Event: CommandInvoker.OnPreParseArgs []
cli.knack.cli: Event: CommandInvoker.OnPostParseArgs [<function OutputProducer.handle_output_argument at 0x7ba1d75dda20>, <function CLIQuery.handle_query_parameter at 0x7ba1d740add0>, <function register_ids_argument..parse_ids_arguments at 0x7ba1d71a1750>]
cli.azure.cli.core.commands.client_factory: Getting management service client client_type=ContainerRegistryManagementClient
cli.azure.cli.core.auth.credential_adaptor: CredentialAdaptor.get_token_info: scopes=('https://management.core.windows.net//.default',), options={}
cli.azure.cli.core.auth.msal_credentials: ManagedIdentityCredential.acquire_token: scopes=['https://management.core.windows.net//.default'], kwargs={}
msal.managed_identity: Obtaining token via managed identity on Azure Machine Learning
urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:46808
urllib3.connectionpool: http://127.0.0.1:46808 "GET /MSI/auth?api-version=2017-09-01&resource=https%3A%2F%2Fmanagement.core.windows.net%2F HTTP/1.1" 200 None
msal.token_cache: event={
"client_id": null,
"data": {},
"params": {},
"response": {
"access_token": "***",
"expires_in": 2867,
"resource": "https://management.core.windows.net/",
"token_type": "Bearer"
},
"scope": [
"https://management.core.windows.net/"
],
"token_endpoint": "https://localhost/managed_identity"
}
cli.azure.cli.core.sdk.policies: Request URL: 'https://management.azure.com/subscriptions/08047947-f71e-4462-a09d-266e3d34c431/resourceGroups/eyeson.heron.prod.e02fd9de-d296-41d1-bd86-efc4853e27da/providers/Microsoft.ContainerRegistry/registries/amlacraepije663sbqi?api-version=2026-01-01-preview'
cli.azure.cli.core.sdk.policies: Request method: 'GET'
cli.azure.cli.core.sdk.policies: Request headers:
cli.azure.cli.core.sdk.policies: 'Accept': 'application/json'
cli.azure.cli.core.sdk.policies: 'x-ms-client-request-id': 'bb55ace4-76cb-11f1-b4c5-0022480137ed'
cli.azure.cli.core.sdk.policies: 'CommandName': 'acr login'
cli.azure.cli.core.sdk.policies: 'ParameterSetName': '-n --debug'
cli.azure.cli.core.sdk.policies: 'User-Agent': 'AZURECLI/2.87.0 (PIP) azsdk-python-core/1.39.0 Python/3.10.0 (Linux-6.8.0-1059-azure-x86_64-with-glibc2.35)'
cli.azure.cli.core.sdk.policies: 'Authorization': '
'
cli.azure.cli.core.sdk.policies: Request body:
cli.azure.cli.core.sdk.policies: This request has no body
urllib3.connectionpool: Starting new HTTPS connection (1): management.azure.com:443
urllib3.connectionpool: https://management.azure.com:443 "GET /subscriptions/08047947-f71e-4462-a09d-266e3d34c431/resourceGroups/eyeson.heron.prod.e02fd9de-d296-41d1-bd86-efc4853e27da/providers/Microsoft.ContainerRegistry/registries/amlacraepije663sbqi?api-version=2026-01-01-preview HTTP/1.1" 200 1582
cli.azure.cli.core.sdk.policies: Response status: 200
cli.azure.cli.core.sdk.policies: Response headers:
cli.azure.cli.core.sdk.policies: 'Cache-Control': 'no-cache'
cli.azure.cli.core.sdk.policies: 'Pragma': 'no-cache'
cli.azure.cli.core.sdk.policies: 'Content-Length': '1582'
cli.azure.cli.core.sdk.policies: 'Content-Type': 'application/json; charset=utf-8'
cli.azure.cli.core.sdk.policies: 'Expires': '-1'
cli.azure.cli.core.sdk.policies: 'Strict-Transport-Security': 'max-age=31536000; includeSubDomains'
cli.azure.cli.core.sdk.policies: 'api-supported-versions': '2026-01-01-preview'
cli.azure.cli.core.sdk.policies: 'x-ms-ratelimit-remaining-subscription-reads': '1099'
cli.azure.cli.core.sdk.policies: 'x-ms-ratelimit-remaining-subscription-global-reads': '16499'
cli.azure.cli.core.sdk.policies: 'x-ms-request-id': 'f8a0723f-70ae-4a26-bc44-4ac3a78c7de0'
cli.azure.cli.core.sdk.policies: 'x-ms-correlation-request-id': 'f8a0723f-70ae-4a26-bc44-4ac3a78c7de0'
cli.azure.cli.core.sdk.policies: 'x-ms-routing-request-id': 'EASTUS2:20260703T104122Z:f8a0723f-70ae-4a26-bc44-4ac3a78c7de0'
cli.azure.cli.core.sdk.policies: 'X-Content-Type-Options': 'nosniff'
cli.azure.cli.core.sdk.policies: 'X-Cache': 'CONFIG_NOCACHE'
cli.azure.cli.core.sdk.policies: 'X-MSEdge-Ref': 'Ref A: 9539786F689A4F4E9D71A27E71C381D3 Ref B: AMS231032609053 Ref C: 2026-07-03T10:41:22Z'
cli.azure.cli.core.sdk.policies: 'Date': 'Fri, 03 Jul 2026 10:41:22 GMT'
cli.azure.cli.core.sdk.policies: Response content:
cli.azure.cli.core.sdk.policies: {"sku":{"name":"Basic","tier":"Basic"},"type":"Microsoft.ContainerRegistry/registries","id":"/subscriptions/08047947-f71e-4462-a09d-266e3d34c431/resourceGroups/EYESON.HERON.PROD.e02fd9de-d296-41d1-bd86-efc4853e27da/providers/Microsoft.ContainerRegistry/registries/amlacraepije663sbqi","name":"amlacraepije663sbqi","location":"eastus2","tags":{},"systemData":{"createdBy":"54caada3-19bd-4b50-9eb8-70f6f6d4b32e","createdByType":"Application","createdAt":"2026-02-04T19:59:01.9248036+00:00","lastModifiedBy":"54caada3-19bd-4b50-9eb8-70f6f6d4b32e","lastModifiedByType":"Application","lastModifiedAt":"2026-06-18T03:53:06.5129871+00:00"},"properties":{"loginServer":"amlacraepije663sbqi.azurecr.io","creationDate":"2026-02-04T19:59:01.9248036Z","provisioningState":"Succeeded","adminUserEnabled":false,"policies":{"quarantinePolicy":{"status":"disabled"},"trustPolicy":{"type":"Notary","status":"disabled"},"retentionPolicy":{"days":7,"status":"disabled"},"exportPolicy":{"status":"enabled"},"azureADAuthenticationAsArmPolicy":{"status":"enabled"},"softDeletePolicy":{"retentionDays":7,"status":"disabled"}},"encryption":{"status":"disabled"},"dataEndpointEnabled":false,"regionalEndpoints":"Disabled","dataEndpointHostNames":[],"regionalEndpointHostNames":[],"endpointProtocol":"IPv4","privateEndpointConnections":[],"publicNetworkAccess":"Enabled","networkRuleBypassOptions":"AzureServices","networkRuleBypassAllowedForTasks":false,"zoneRedundancy":"Disabled","metadataSearch":"Disabled","roleAssignmentMode":"LegacyRegistryPermissions","autoGeneratedDomainNameLabelScope":"Unsecure"}}
cli.azure.cli.command_modules.acr._docker_utils: 2026-07-03 10:41:22.495061 Sending a HTTP Get request to https://amlacraepije663sbqi.azurecr.io/v2/
urllib3.connectionpool: Starting new HTTPS connection (1): amlacraepije663sbqi.azurecr.io:443
urllib3.connectionpool: https://amlacraepije663sbqi.azurecr.io:443 "GET /v2/ HTTP/1.1" 401 149
cli.azure.cli.command_modules.acr._docker_utils: Attempting to retrieve AAD refresh token...
cli.azure.cli.command_modules.acr._docker_utils: 2026-07-03 10:41:22.770695 Sending a HTTP Get request to https://amlacraepije663sbqi.azurecr.io/v2/
urllib3.connectionpool: Starting new HTTPS connection (1): amlacraepije663sbqi.azurecr.io:443
urllib3.connectionpool: https://amlacraepije663sbqi.azurecr.io:443 "GET /v2/ HTTP/1.1" 401 149
cli.azure.cli.core.auth.msal_credentials: ManagedIdentityCredential.acquire_token: scopes=['https://containerregistry.azure.net/.default'], kwargs={}
msal.managed_identity: Obtaining token via managed identity on Azure Machine Learning
urllib3.connectionpool: Starting new HTTP connection (1): 127.0.0.1:46808
urllib3.connectionpool: http://127.0.0.1:46808 "GET /MSI/auth?api-version=2017-09-01&resource=https%3A%2F%2Fcontainerregistry.azure.net HTTP/1.1" 404 80
cli.azure.cli.core.auth.util: MSAL error: {'error': 'invalid_scope', 'error_description': "{'error': 'SSO failure, to mitigated it please try to click Jupyter/JupyterLab.'}"}
cli.azure.cli.command_modules.acr._docker_utils: Unable to get AAD authorization tokens with message: {'error': 'SSO failure, to mitigated it please try to click Jupyter/JupyterLab.'}
cli.azure.cli.command_modules.acr._docker_utils: Unable to get admin user credentials with message: Admin user is disabled.
Username:

Expected behavior

az acr login -n $ACR should succeed in logging-in to the ACR.

Environment Summary

azure-cli 2.87.0

core 2.87.0
telemetry 1.1.0

Extensions:
azure-cli-ml 1.41.0
ml 2.43.0

Dependencies:
msal 1.36.0
azure-mgmt-resource 24.0.0

Python location '/anaconda/envs/azureml_py38/bin/python'
Config directory '/home/azureuser/.azure'
Extensions directory '/opt/az/extensions'

Python (Linux) 3.10.0 | packaged by conda-forge | (default, Nov 20 2021, 02:24:10) [GCC 9.4.0]

Legal docs and information: aka.ms/AzureCliLegal

Your CLI is up-to-date.

Additional context

Compute instance software version
Linux 26.06.15 (current)

Metadata

Metadata

Assignees

Labels

AADARMaz resource/group/lock/tag/deployment/policy/managementapp/account management-groupAccountaz login/accountAuto-AssignAuto assign by botContainer Registryaz acrService AttentionThis issue is responsible by Azure service team.act-observability-squadbugThis issue requires a change to an existing behavior in the product in order to be resolved.customer-reportedIssues that are reported by GitHub users external to the Azure organization.

Type

No type

Fields

No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions