Build1 distinct publisher3 min readUpdated
A Foundry governance walkthrough splits agent permissions into on-behalf-of reads, unattended agent identity, and human approval. Collapsing them into one credential is a publish-time failure.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A walkthrough published on dev.to takes Microsoft Foundry's agent identity model and converts it into a permission ledger, a publish-time migration plan, and a set of negative tests [1]. It is worth reading because of how it decomposes the problem: it asks when an agent should use On-Behalf-Of versus Agent Identity, why an agent can work in development and then return a 403 after publication, and why high-risk tools still need approval when RBAC is already configured [2].
The scenario is a sales team with three jobs for one agent. A salesperson asks it to prepare for tomorrow's meeting, and it reads the mail, calendar, and documents that this user can already access [3]. A nightly enterprise scheduler runs a background job that builds a team-level customer summary through an MCP tool and writes it to a designated Azure Storage container [4]. And after the user confirms, the agent sends the summary to attendees or updates a CRM record [5]. The author's point is that a single shared service principal would make all three flows work while erasing the boundaries between them [6].
The read path runs the user's token into the Foundry Agent Service, which mints an OBO token carrying the agent plus delegated user permissions [7]. This is not a copy of the user's rights: effective access stays bounded by the delegated scopes the app requested, user or admin consent, Conditional Access, and downstream authorization [8]. It also has a hard prerequisite. The caller must invoke the Agent API with the user's Microsoft Entra token, and an API key does not carry the delegated user context that an OBO-authenticated tool needs [9]. That is where the 403 lives. Nothing about the agent changed at publication; the shape of the caller did.
The nightly job cannot use that path at all, because there is no signed-in user [10]. It should run under its own Agent Identity with only the permissions the task requires [11], assuming the tool in front of the resource actually supports Agent Identity authentication [12]. So the interactive flow needs a user token and the unattended flow has none by construction, which means no single credential can legitimately serve both [1]. For a Prompt Agent the chain is Project Managed Identity to blueprint to Agent Identity token, then an exchange for a target-audience token [13]. The detail teams get wrong: per the Foundry Agent Identity documentation, the RBAC role on the target resource belongs on the Agent Identity, not on the Project Managed Identity used to authenticate the blueprint [14]. The example assigns Storage Blob Data Contributor to the agentIdentityId at the storage account scope [15]. If a freshly created Agent Identity will not resolve through --assignee because of Microsoft Graph propagation latency, the workaround is --assignee-object-id with --assignee-principal-type ServicePrincipal [16], which is worth knowing before it appears as a flaky pipeline step.
The third flow is the one RBAC does not answer. It is gated on user confirmation before anything leaves the building [5], which is why the ledger the author proposes carries six fields per action: principal, resource, action, scope, approval, and audit [17]. He insists the table exists before tools are configured, not after deployment, and that a team unable to fill in any one field has not yet defined an enforceable boundary [18].
Two things to check against your own build. First, whether every tool you plan to use supports the authentication method your architecture diagram assumes, since some support only a key, OAuth passthrough, or Project Managed Identity, and those bring sharing, rotation, revocation, and audit consequences that belong in the same ledger [19]. Second, whether your published trigger passes an Entra token or a key, because that answers the 403 before you file the bug.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
For a Prompt Agent, the Agent Identity token exchange is described as Project Managed Identity -> blueprint -> Agent Identity token, then Agent Identity token -> target audience token -> MCP or downstream resource.
According to the Foundry Agent Identity documentation as cited by the article, in this flow the RBAC role on the target resource belongs on the Agent Identity, not on the Project Managed Identity used to authenticate the blueprint.
The official pattern shown assigns the role to the current agentIdentityId, for example az role assignment create --assignee "<agentIdentityId>" --role "Storage Blob Data Contributor" --scope on a storage account resource ID.
An article published on dev.to ("Microsoft Foundry Agent Permission Governance: OBO, RBAC, and Approval Boundaries") turns a previously mapped Foundry identity model into a permission ledger, a publish-time migration plan, and a set of negative tests.
The article uses one scenario to answer three questions: when an agent should use On-Behalf-Of (OBO) versus Agent Identity; why an agent can work in development and suddenly return a 403 after publication; and if RBAC is already in place, why high-risk tools still need approval.
In the scenario, a salesperson asks the agent to help prepare for tomorrow's meeting with a customer, and the agent reads the email, calendar events, and documents that this user can access.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single practitioner source, documentation-anchored but uncorroborated
Every claim traces to one dev.to article. Its strongest passages are attributed to Foundry Agent Identity documentation and shown as concrete CLI patterns, and the piece hedges appropriately (tool authentication types vary, an MCP connection may select project-managed-identity). But no second publisher, vendor statement, or reproduction is present in the cluster, so mechanism claims rest on the author's reading alone.
No adoption signal in supplied sources
The cluster contains no release, deployment, benchmark, usage-disclosure, pricing, or incident observation. The article describes a hypothetical sales-team scenario rather than a shipped system, and no adoption_observations could be recorded from it.
Mildly overstated: prescriptive certainty ahead of external verification
The article avoids sweeping vendor hype and repeatedly narrows its own claims, which keeps the gap small. It nonetheless states normative rules (a ledger must exist before tool configuration; a team that cannot fill six fields has no enforceable boundary) and asserts a general publish-time 403 failure mode with no measured incidence, all from a single uncorroborated source, so framing runs slightly ahead of the evidence base.
Author-series attention incentive; no disclosed commercial stake
The observable incentive is modest and editorial: the piece is part of the author's own Foundry governance series on a developer publishing platform and opens by pointing back to the prior installment, which rewards continued readership. The supplied source discloses no vendor sponsorship, product being sold, or affiliation with Microsoft, so no commercial incentive is inferred.
Moderate-low: internally coherent, externally unverified, zero adoption data
Confidence is limited by single-publisher sourcing and the complete absence of adoption measurement, and lifted somewhat by the article's internal consistency, documentation attribution, and self-imposed caveats. The mechanism-level guidance is credible enough to act on with verification; the generality of the failure mode is not established.
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
The MCP transport your search results teach has been deprecated since March1 distinct publisher
build
MCP 2026-07-28 drops the `result` wrapper, and your unit tests will not notice1 distinct publisher
build
A ttlMs on tools/list is a promise, not a receipt1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 15, 2026