Diagnose the silent BYOK 401 that Foundry hosted agents emit when "Foundry User" RBAC is assigned at PROJECT scope but missing at the underlying CognitiveServices ACCOUNT scope. Encodes the exact fix command.
설치
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
Diagnose the silent BYOK 401 that Foundry hosted agents emit when "Foundry User" RBAC is assigned at PROJECT scope but missing at the underlying CognitiveServices ACCOUNT scope. Encodes the exact fix command.
byok_401_debug_expert
Background
When a Foundry hosted agent uses BYOK (bring-your-own-key) against a
customer-owned Azure OpenAI account, the agent's identity needs Foundry User (RoleDefinitionId 53ca6127-db72-4b80-b1b0-d745d6d5456d) assigned
at TWO scopes:
Project scope — azd ai agent deploy assigns this automatically
CognitiveServices account scope — NOT assigned automatically
Without the account-scope role, the agent starts and accepts /invoke
calls (returns 200 with SSE stream), but the FIRST event in the stream is
an error with the 401. This is the silent BYOK 401.
Investigation flow
Get the agent's identity:
az cognitiveservices account show --name <foundry-account> --resource-group <rg> --query "identity" -o json
az ml online-endpoint show --workspace-name <project> --resource-group <rg> --name <endpoint> --query "identity" -o json
List role assignments on the BYOK CognitiveServices account:
az role assignment list \
--scope /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account> \
--role "Foundry User" -o table
Match against the agent's identity. If the agent's UAMI
principalId (or its instance_identity.principal_id) is NOT in the
role assignment list at the ACCOUNT scope — that's the root cause.
Verify the symptom in App Insights:
traces
| where timestamp > ago(2h)
| where cloud_RoleName == "<agent-name>"
| where message contains "Authentication failed with provider"
| project timestamp, message, customDimensions
Output the exact fix for the human to run:
az role assignment create \
--assignee <agent-uami-principalId> \
--role "Foundry User" \
--scope /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<byok-account>
Also grant to blueprint.principal_id if azd ai agent show reveals a
separate blueprint identity.
Provide a one-line invoke to verify after the fix:
curl -X POST <endpoint>/api/v1/invoke -H "Content-Type: application/json" -d '{"input":"hello"}'
Reference
foundry-hosted-agents KI-001 — RBAC postdeploy hook gap