<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Anton Staykov</title>
    <description>The latest articles on DEV Community by Anton Staykov (@astaykov).</description>
    <link>https://dev.to/astaykov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3827606%2Fbb3aa4b8-90b5-4db5-8ad5-f9bd05ab762b.jpg</url>
      <title>DEV Community: Anton Staykov</title>
      <link>https://dev.to/astaykov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/astaykov"/>
    <language>en</language>
    <item>
      <title>Your AI Agent Doesn't Need an API Key: Entra Agent ID and Anthropic's Workload Identity Federation</title>
      <dc:creator>Anton Staykov</dc:creator>
      <pubDate>Thu, 21 May 2026 10:30:00 +0000</pubDate>
      <link>https://dev.to/astaykov/your-ai-agent-doesnt-need-an-api-key-entra-agent-id-and-anthropics-workload-identity-federation-el0</link>
      <guid>https://dev.to/astaykov/your-ai-agent-doesnt-need-an-api-key-entra-agent-id-and-anthropics-workload-identity-federation-el0</guid>
      <description>&lt;h1&gt;
  
  
  Your AI Agent Doesn't Need an API Key: Entra Agent ID and Anthropic's Workload Identity Federation
&lt;/h1&gt;

&lt;p&gt;Every system that authenticates with a static API key is carrying a liability disguised as a convenience. The key does not expire unless someone sets a calendar reminder. It does not know who is using it. It cannot tell you whether the request that just hit the endpoint came from the production agent it was minted for or from a laptop in a coffee shop where someone pasted it into a terminal two months ago. Static keys are the skeleton key of modern distributed systems — they open the door for anyone who holds them, and they never ask why.&lt;/p&gt;

&lt;p&gt;This is not a new problem, but it is becoming a &lt;em&gt;dangerous&lt;/em&gt; one. As AI agents proliferate across enterprise environments — calling model APIs, orchestrating workflows, accessing downstream services — the number of static secrets embedded in configuration files, environment variables, and CI pipelines is growing faster than any rotation policy can keep up with. The question is no longer whether your organization has a leaked key somewhere. The question is how many, and which ones an attacker has already found.&lt;/p&gt;

&lt;p&gt;The industry's answer has been converging for years, and it has a name.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workload Identity Federation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" rel="noopener noreferrer"&gt;Workload Identity Federation&lt;/a&gt; (WIF) is a pattern — not a product, not a proprietary protocol — built on top of &lt;a href="https://openid.net/developers/how-connect-works/" rel="noopener noreferrer"&gt;OpenID Connect&lt;/a&gt; and the &lt;a href="https://www.rfc-editor.org/rfc/rfc7523" rel="noopener noreferrer"&gt;RFC 7523 JWT bearer grant&lt;/a&gt;. The idea is disarmingly simple: instead of minting a long-lived secret and handing it to a workload, you let the workload &lt;em&gt;prove who it is&lt;/em&gt; using a short-lived, signed JSON Web Token issued by an identity provider (IdP) you already trust. The receiving system validates the JWT's signature against the IdP's published keys, checks the claims against rules you configured, and — if everything lines up — issues a short-lived access token in return. No secrets to store. No secrets to rotate. No secrets to leak.&lt;/p&gt;

&lt;p&gt;The pattern has been adopted across the industry — by major cloud providers, CI/CD platforms, container orchestrators, and increasingly by model providers. Microsoft Entra, for its part, supports WIF both as an &lt;em&gt;issuer&lt;/em&gt; (your Entra tenant issues JWTs that external systems trust) and as a &lt;em&gt;relying party&lt;/em&gt; (your Entra tenant &lt;a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation#how-it-works" rel="noopener noreferrer"&gt;trusts JWTs from external identity providers&lt;/a&gt; to grant access to Entra-protected resources). That bidirectional capability is what makes the rest of this story possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anthropic embraces the standard
&lt;/h2&gt;

&lt;p&gt;Anthropic has brought native Workload Identity Federation support to the Claude API — and this deserves more attention than it has received.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://platform.claude.com/docs/en/manage-claude/workload-identity-federation" rel="noopener noreferrer"&gt;Anthropic's WIF implementation&lt;/a&gt;, any OIDC-capable identity provider can authenticate workloads to the Claude API without a static &lt;code&gt;sk-ant-...&lt;/code&gt; key ever being involved. You register your IdP as a &lt;em&gt;federation issuer&lt;/em&gt; in the Anthropic Console, define a &lt;em&gt;federation rule&lt;/em&gt; that maps incoming JWT claims to a &lt;em&gt;service account&lt;/em&gt;, and your workload does the rest: present the JWT, receive a short-lived Claude access token, call the API. The SDKs handle the exchange and the refresh loop. API keys can be disabled entirely on the Anthropic workspace.&lt;/p&gt;

&lt;p&gt;Three concepts on the Anthropic side matter here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service accounts&lt;/strong&gt; (&lt;code&gt;svac_...&lt;/code&gt;) — non-human identities inside your Anthropic organization. A federated token acts &lt;em&gt;as&lt;/em&gt; a service account. Unlike an API key, a service account has credentials minted for it on demand, and you can audit which workloads acted as which service account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Federation issuers&lt;/strong&gt; (&lt;code&gt;fdis_...&lt;/code&gt;) — the registration of your OIDC identity provider with your Anthropic organization. Each issuer tells Anthropic "JWTs signed by this provider may assert workload identity for my org."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Federation rules&lt;/strong&gt; (&lt;code&gt;fdrl_...&lt;/code&gt;) — the bridge between an issuer and a service account: "when a JWT from issuer X has claims that look like Y, mint a token for service account Z."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Console includes presets for common providers and a generic OIDC option that works with any standards-compliant issuer — including Microsoft Entra ID. That last bullet is the one this article cares about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsoft Entra Agent ID — identity built for agents
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/key-concepts" rel="noopener noreferrer"&gt;Microsoft Entra Agent ID&lt;/a&gt; introduces first-class identity constructs purpose-built for AI agents. Not repurposed service principals. Not human user accounts pressed into service. Dedicated objects with a dedicated governance model.&lt;/p&gt;

&lt;p&gt;The constructs that matter for this story:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-blueprint" rel="noopener noreferrer"&gt;Agent identity blueprints&lt;/a&gt;&lt;/strong&gt; — the template and authentication foundation for one or more agent identities. The blueprint holds the credentials (client secret, certificate, or federated identity credential) and uses them to acquire tokens on behalf of all agent identities created from it. Conditional Access policies applied to a blueprint propagate to every agent identity it parents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-identities" rel="noopener noreferrer"&gt;Agent identities&lt;/a&gt;&lt;/strong&gt; — the runtime identity of a specific AI agent. An agent identity has no credentials of its own. It authenticates through its blueprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The &lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/authentication-with-auth-sdk-sidecar" rel="noopener noreferrer"&gt;Microsoft Entra SDK for Agent ID&lt;/a&gt;&lt;/strong&gt; — a containerized sidecar that handles token acquisition, validation, and secure downstream API calls. Your agent code asks the sidecar for a token; the sidecar handles the identity plumbing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The proof of concept
&lt;/h2&gt;

&lt;p&gt;The question I wanted to answer was concrete: &lt;em&gt;can an AI agent, using Microsoft Entra Agent ID as its native identity, call the Anthropic Claude API through Workload Identity Federation — with no API key, no certificate in agent memory, and no cloud LLM proxy in between?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer is yes. I built a &lt;a href="https://github.com/astaykov/claude-wif-agentid" rel="noopener noreferrer"&gt;proof of concept&lt;/a&gt; that does exactly this.&lt;/p&gt;

&lt;h3&gt;
  
  
  The architecture
&lt;/h3&gt;

&lt;p&gt;The PoC runs as two containers on a Docker bridge network:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;claude-wif-agent&lt;/code&gt;&lt;/strong&gt; — a Flask application that receives user queries, asks the sidecar for an Entra JWT, exchanges that JWT for a Claude access token, and calls the Claude Messages API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;claude-wif-sidecar&lt;/code&gt;&lt;/strong&gt; — the &lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/authentication-with-auth-sdk-sidecar" rel="noopener noreferrer"&gt;Microsoft Entra Auth SDK sidecar&lt;/a&gt;, which handles the client-credentials flow against Entra ID and returns a signed JWT scoped to the agent identity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The token flow has nine steps, but the critical insight lives in three of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Steps 4–5:&lt;/strong&gt; The sidecar uses the blueprint's credentials to obtain an Entra-issued JWT &lt;em&gt;for the agent identity&lt;/em&gt;. The JWT carries the agent's &lt;code&gt;appid&lt;/code&gt;, &lt;code&gt;oid&lt;/code&gt;, and — crucially — the &lt;code&gt;xms_par_app_azp&lt;/code&gt; &lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-token-claims" rel="noopener noreferrer"&gt;optional claim&lt;/a&gt; that identifies the parent blueprint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 7:&lt;/strong&gt; The agent application exchanges that Entra JWT for a Claude access token by posting to &lt;code&gt;POST https://api.anthropic.com/v1/oauth/token&lt;/code&gt; using the &lt;a href="https://www.rfc-editor.org/rfc/rfc7523" rel="noopener noreferrer"&gt;RFC 7523 jwt-bearer grant&lt;/a&gt;. Anthropic validates the JWT's signature, checks the claims against the federation rule, and returns a short-lived token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 9:&lt;/strong&gt; The agent calls &lt;code&gt;POST https://api.anthropic.com/v1/messages&lt;/code&gt; with the Claude token. No API key is involved. No MSAL library is needed. No certificates sit in agent memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Three Entra objects — and why the third is easy to miss
&lt;/h3&gt;

&lt;p&gt;The PoC requires three distinct Microsoft Entra objects. Two of them sound similar and the third is implicit in WIF mechanics — which is exactly why it trips people up.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;An Agent Identity Blueprint&lt;/strong&gt; — holds the credentials (client secret for local dev; managed identity or federated identity credential in production) and parents the agent identity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;An Agent Identity&lt;/strong&gt; — the runtime identity of the specific AI agent. No credentials of its own — the blueprint mints tokens on its behalf.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;An App Registration representing the Anthropic API&lt;/strong&gt; — and this is the one that is easy to miss. Anthropic's WIF rule validates an Entra-issued JWT, and the only way that JWT carries the right &lt;code&gt;aud&lt;/code&gt; (audience) claim is if Entra issues it &lt;em&gt;for a registered resource application&lt;/em&gt; whose ID matches what you configured as the audience of the federation issuer in the Anthropic Console. This app registration uses v2.0 tokens (&lt;code&gt;requestedAccessTokenVersion: 2&lt;/code&gt;), has &lt;code&gt;acceptMappedClaims: true&lt;/code&gt;, and configures the &lt;code&gt;xms_par_app_azp&lt;/code&gt; optional claim on the access token — so that a single Anthropic federation rule can match &lt;em&gt;all&lt;/em&gt; agent identities parented by the same blueprint, rather than requiring a rule per individual agent.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The token that reaches Anthropic carries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;iss&lt;/code&gt; = &lt;code&gt;https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/v2.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;aud&lt;/code&gt; = the Application ID of the Anthropic API app registration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;appid&lt;/code&gt; = the Agent Identity's client ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;oid&lt;/code&gt; = the Agent Identity's object ID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xms_par_app_azp&lt;/code&gt; = the Agent Identity Blueprint's application ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anthropic validates all of this against the federation issuer and rule you configured. No Anthropic API key is involved at any point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Both flows work
&lt;/h3&gt;

&lt;p&gt;The PoC supports both access patterns that the agent identity platform defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous (app-only):&lt;/strong&gt; The agent identity acts independently. The sidecar obtains a client-credentials token, the agent exchanges it for a Claude token, and the response comes back tagged &lt;code&gt;"flow": "autonomous"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Behalf-Of (OBO):&lt;/strong&gt; When a signed-in user's Entra Bearer token is available, the sidecar performs an OBO exchange and mints an agent-on-behalf-of-user token, which is then exchanged with Anthropic WIF. The response comes back tagged &lt;code&gt;"flow": "obo"&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both flows use the same Anthropic WIF endpoint. The only difference is &lt;em&gt;whose authority&lt;/em&gt; the Entra JWT represents — the agent's own, or the agent acting on behalf of a human.&lt;/p&gt;

&lt;h3&gt;
  
  
  From local dev to production
&lt;/h3&gt;

&lt;p&gt;The PoC uses a client secret on the blueprint for local development — a pragmatic shortcut for proving the concept. Moving to production requires changing exactly two environment variables in the sidecar configuration to switch from client secret to managed identity, and adding a &lt;a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" rel="noopener noreferrer"&gt;federated identity credential&lt;/a&gt; on the blueprint for the managed identity. No agent code changes. The sidecar abstracts the credential source entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The credentials-free agent
&lt;/h2&gt;

&lt;p&gt;This is where the threads converge. Workload Identity Federation is an industry standard. Anthropic has built native support for it into the Claude API. Microsoft Entra Agent ID provides purpose-built identity constructs for AI agents — with blueprints that centralize credential management, agent identities that carry no secrets of their own, and a sidecar SDK that abstracts the entire token lifecycle.&lt;/p&gt;

&lt;p&gt;Put them together and you get something that would have been difficult to describe two years ago: an AI agent that authenticates to a third-party model provider using &lt;em&gt;its own agentic identity&lt;/em&gt;, issued by the enterprise identity provider, validated through standards-based federation — with no static API key, no certificate in memory, and no cloud LLM proxy sitting in between. The agent's identity &lt;em&gt;is&lt;/em&gt; its credential.&lt;/p&gt;

&lt;p&gt;The proof of concept is open on GitHub: &lt;strong&gt;&lt;a href="https://github.com/astaykov/claude-wif-agentid" rel="noopener noreferrer"&gt;astaykov/claude-wif-agentid&lt;/a&gt;&lt;/strong&gt;. It is minimal by design — a Flask app, a sidecar, a &lt;code&gt;docker-compose.yml&lt;/code&gt;, and a &lt;code&gt;.env&lt;/code&gt; file. The README walks through every Entra object, every Anthropic Console configuration step, and the full token flow. Fork it, break it, extend it.&lt;/p&gt;

&lt;p&gt;The age of the static API key — for AI agents, at least — is ending. The identity infrastructure to replace it is already here.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation" rel="noopener noreferrer"&gt;Workload Identity Federation (Microsoft Entra)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/manage-claude/workload-identity-federation" rel="noopener noreferrer"&gt;Anthropic Workload Identity Federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/key-concepts" rel="noopener noreferrer"&gt;Microsoft Entra Agent ID Key Concepts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-blueprint" rel="noopener noreferrer"&gt;Agent Identity Blueprints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-identities" rel="noopener noreferrer"&gt;Agent Identities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/authentication-with-auth-sdk-sidecar" rel="noopener noreferrer"&gt;Microsoft Entra Auth SDK Sidecar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/agent-token-claims" rel="noopener noreferrer"&gt;Agent Token Claims Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7523" rel="noopener noreferrer"&gt;RFC 7523 — JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/astaykov/claude-wif-agentid" rel="noopener noreferrer"&gt;Proof of Concept: astaykov/claude-wif-agentid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>entra</category>
      <category>aiagents</category>
      <category>anthropic</category>
      <category>security</category>
    </item>
    <item>
      <title>Your Agent Is Becoming the Crown Jewel: SOC, Reviews, and Governance for the Dynamic-Consent Era</title>
      <dc:creator>Anton Staykov</dc:creator>
      <pubDate>Mon, 18 May 2026 13:34:00 +0000</pubDate>
      <link>https://dev.to/astaykov/your-agent-is-becoming-the-crown-jewel-soc-reviews-and-governance-for-the-dynamic-consent-era-23l3</link>
      <guid>https://dev.to/astaykov/your-agent-is-becoming-the-crown-jewel-soc-reviews-and-governance-for-the-dynamic-consent-era-23l3</guid>
      <description>&lt;p&gt;The &lt;a href="https://dev.to/astaykov/the-overlooked-gem-in-microsoft-entra-that-gives-your-ai-agents-super-powers-3mde"&gt;previous article&lt;/a&gt; in this series argued that the combination of &lt;a href="https://learn.microsoft.com/en-us/entra/identity-platform/consent-types-developer#incremental-and-dynamic-user-consent" rel="noopener noreferrer"&gt;incremental and dynamic user consent&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/key-concepts" rel="noopener noreferrer"&gt;Microsoft Entra Agent ID&lt;/a&gt; gives interactive AI agents something genuinely new: the ability to &lt;em&gt;earn&lt;/em&gt; their access in the wild, scope by scope, prompted by the humans and other agents they work alongside. Aria, the example agent, started with two delegated permissions and grew into a productive contributor across SharePoint, ServiceNow, and the Finance API in roughly a quarter — without its creators pre-declaring any of it.&lt;/p&gt;

&lt;p&gt;That was the optimistic half. This is the other half.&lt;/p&gt;

&lt;p&gt;By the end of that quarter, Aria is — by any reasonable measurement — the most over-privileged identity in the tenant. No one noticed, because there was nothing to notice. Every grant was legitimate, contextual, and user-approved. The risk did not arrive in a single bad decision. It arrived as a hundred reasonable yeses.&lt;/p&gt;

&lt;h2&gt;
  
  
  A different kind of over-permissioning
&lt;/h2&gt;

&lt;p&gt;Classic over-permissioning is an event. Someone hands a service account &lt;code&gt;Directory.ReadWrite.All&lt;/code&gt; because the deployment was due Friday, an auditor flags it months later, a ticket is opened. Slow, but the control loop exists, and it is built around discrete moments of poor judgment.&lt;/p&gt;

&lt;p&gt;Permission accumulation through dynamic consent is structurally different. There is no single bad decision to find. The permission graph grows monotonically — one narrow, well-justified scope at a time — because the mechanism that makes the agent useful is the same mechanism that makes it dangerous. Nothing in the platform prunes that graph by default, and nothing in most organizations does either: access-review tooling was designed around human role changes, not around agents whose role &lt;em&gt;is&lt;/em&gt; to absorb new capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agents become the target
&lt;/h2&gt;

&lt;p&gt;A compromised agent identity is qualitatively worse than a compromised user account, and the reasons are worth stating plainly.&lt;/p&gt;

&lt;p&gt;A user holds permissions scattered across teams, sick days, role changes, and eventual departures. Their access constantly churns, and the blast radius of any single compromise is naturally bounded by the messiness of human work.&lt;/p&gt;

&lt;p&gt;An agent does none of that. It persists. It centralizes. Every scope a hundred different users granted to it is reachable through one set of tokens, one blueprint, one set of credentials issued by that blueprint. Add the realistic threat surface of a modern agent — token theft, blueprint compromise, prompt injection used as a lateral-movement primitive — and the picture becomes uncomfortable: the most attractive principal in the tenant is also the one whose authority grew quietly enough to escape notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the SOC must change
&lt;/h2&gt;

&lt;p&gt;Most security operations centers treat sign-in logs as the primary identity signal. For agents under dynamic consent, that is no longer sufficient. &lt;strong&gt;The consent log itself becomes a first-class detection surface.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three signal families deserve attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope-acquisition velocity.&lt;/strong&gt; A productive agent acquires new scopes in bursts that follow human work. An agent that suddenly requests broad scopes — especially ones approaching admin-consent thresholds — outside its normal pattern is worth waking someone up for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant-versus-use gap.&lt;/strong&gt; Scopes that were granted but are never exercised are liability at best, pre-positioned capability for an attacker at worst. Track them, and feed the gap into automated revocation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Introduction chains.&lt;/strong&gt; When agent A pulls agent B into a workflow and B requests new scopes as a result, that chain is part of the audit story. SOC tooling needs to render it as a graph, not as isolated events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are exotic. They are sign-in analytics one layer up the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What in identity governance must change
&lt;/h2&gt;

&lt;p&gt;Access reviews built for humans assume a relatively stable role. The reviewer is asked, in effect, "does this person still need what they had last quarter?" That question does not work for an agent whose entire purpose is to absorb new capabilities continuously.&lt;/p&gt;

&lt;p&gt;Three adjustments are required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reviews keyed to recent use, not recent grant.&lt;/strong&gt; The relevant question is no longer "should the agent have this scope?" but "did the agent actually exercise this scope in the last &lt;em&gt;N&lt;/em&gt; days, and was the use consistent with the original justification?" Scopes that fail both halves of that test should expire automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Owners and sponsors as the accountable humans.&lt;/strong&gt; Microsoft Entra Agent ID separates technical owners from business sponsors precisely so that someone with operational context and someone with business context can both be on the hook. Wire those roles into the review workflow. An agent without a current sponsor should not be holding sensitive delegated permissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blueprint-level Conditional Access as the choke point.&lt;/strong&gt; Because policies applied to a blueprint propagate to every agent identity created from it, the blueprint is the right place to enforce the constraints that should never be negotiable — geographic boundaries, sensitive-resource exclusions, step-up requirements for specific scope families. Treat the blueprint the way you treat a privileged-access workstation: small, hardened, watched.&lt;/p&gt;

&lt;h2&gt;
  
  
  A governance posture that grows with the agent
&lt;/h2&gt;

&lt;p&gt;Three principles are worth taking back to the architecture board.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consent is telemetry.&lt;/strong&gt; Treat every dynamic consent event as a security signal of equal weight to a sign-in. Pipe it into the same analytics and the same review workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Least privilege is a verb, not a noun.&lt;/strong&gt; A static least-privilege list cannot survive contact with an agent that earns its access. The control objective is no longer to &lt;em&gt;define&lt;/em&gt; the minimum scope set — it is to &lt;em&gt;continuously prune&lt;/em&gt; toward it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grow with the agent; do not be the hurdle.&lt;/strong&gt; The organizations that succeed will be the ones whose governance moves at the same cadence as the agent's learning. Quarterly reviews and annual recertifications were already too slow for humans. They are unworkable for agents.&lt;/p&gt;

&lt;p&gt;Aria is going to keep growing. So will every other interactive agent in the tenant. The question for identity and security architects is not whether to allow it — that decision has already been made by the people on the other side of the chat window. The question is whether the controls, the detections, and the operating model are ready for what dynamic consent has quietly enabled.&lt;/p&gt;

&lt;p&gt;If they are not yet, that is the work for this year.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>entraagentid</category>
      <category>security</category>
    </item>
    <item>
      <title>The Overlooked Gem in Microsoft Entra That Gives Your AI Agents Super-Powers</title>
      <dc:creator>Anton Staykov</dc:creator>
      <pubDate>Sat, 09 May 2026 13:41:16 +0000</pubDate>
      <link>https://dev.to/astaykov/the-overlooked-gem-in-microsoft-entra-that-gives-your-ai-agents-super-powers-3mde</link>
      <guid>https://dev.to/astaykov/the-overlooked-gem-in-microsoft-entra-that-gives-your-ai-agents-super-powers-3mde</guid>
      <description>&lt;p&gt;Most enterprise conversations about Microsoft Entra stop at the obvious: single sign-on, multifactor authentication, Conditional Access, a handful of well-policed app registrations. Useful, mature, well understood. And almost entirely beside the point for what is about to happen inside every large organization.&lt;/p&gt;

&lt;p&gt;Buried in the Microsoft identity platform developer documentation sits one short section that quietly rewires what an AI agent can become inside an enterprise. It is not a new product. It does not have a launch event. It is a paragraph titled &lt;a href="https://learn.microsoft.com/en-us/entra/identity-platform/consent-types-developer#incremental-and-dynamic-user-consent" rel="noopener noreferrer"&gt;Incremental and dynamic user consent&lt;/a&gt;, and it is the most underrated capability in the Microsoft Entra surface area for the agentic era.&lt;/p&gt;

&lt;h2&gt;
  
  
  A 30-second consent primer
&lt;/h2&gt;

&lt;p&gt;Microsoft Entra exposes three broad consent shapes, all covered in the same &lt;a href="https://learn.microsoft.com/en-us/entra/identity-platform/consent-types-developer" rel="noopener noreferrer"&gt;developer consent guide&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static consent.&lt;/strong&gt; Every permission an application could ever need is declared up front in the app registration. Tidy, predictable, and brittle — users and admins are asked to approve the entire future of the app on day one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Admin consent.&lt;/strong&gt; A tenant administrator approves a permission set on behalf of the whole organization. Necessary for application permissions and for sensitive delegated scopes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental and dynamic user consent.&lt;/strong&gt; The application requests a minimal set of scopes at first and then asks for additional delegated permissions over time, exactly when a feature needs them, by including the new scopes in the &lt;code&gt;scope&lt;/code&gt; parameter of an authorization request. The user approves in context. Crucially, this mechanism applies to &lt;strong&gt;delegated permissions&lt;/strong&gt; — permissions exercised on behalf of a signed-in human.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last constraint is normally treated as a footnote. For AI agents it is the entire story.&lt;/p&gt;

&lt;h2&gt;
  
  
  From applications to agents
&lt;/h2&gt;

&lt;p&gt;The other piece of the puzzle is &lt;a href="https://learn.microsoft.com/en-us/entra/agent-id/key-concepts" rel="noopener noreferrer"&gt;Microsoft Entra Agent ID&lt;/a&gt;. Microsoft Entra Agent ID introduces first-class identity constructs for AI agents — agent identities, agent identity blueprints, owners, sponsors, managers — and a purpose-built &lt;strong&gt;agent's user account&lt;/strong&gt;: an optional user object paired 1:1 with an agent identity, for systems (Exchange Online mailboxes, Teams channels, and similar) that require a user principal. A deliberate construct, so agents can participate in user-shaped systems without being misrepresented as humans.&lt;/p&gt;

&lt;p&gt;On top of that, the industry designs AI Agents with two main data access patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous access&lt;/strong&gt; act as themselves, with their own authorizations on workloads, with or without human in the loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive access&lt;/strong&gt; sign a user in, and act on that user's behalf through a chat-style interface, using &lt;strong&gt;delegated permissions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read those points together. Interactive agents live on delegated permissions. Dynamic consent is the only Microsoft Entra mechanism that lets delegated permissions grow organically after deployment. The two features were designed for different reasons, in different teams, at different times. They meet exactly where the modern AI agent operates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Aria
&lt;/h2&gt;

&lt;p&gt;Consider Aria, an internal productivity agent built on Microsoft Entra Agent ID, deployed as an interactive agent behind a corporate chat surface. Aria's blueprint ships with the bare minimum: &lt;code&gt;User.Read&lt;/code&gt; and &lt;code&gt;offline_access&lt;/code&gt;. On day one, Aria literally knows nothing about the tenant's systems and can do nothing inside them.&lt;/p&gt;

&lt;p&gt;Then work happens.&lt;/p&gt;

&lt;p&gt;In the first week, a product manager asks Aria to summarize discussions on a SharePoint site. Aria does not have that scope. Instead of failing, the runtime issues an authorization request that includes &lt;code&gt;Sites.Read.All&lt;/code&gt;. The user sees a contextual consent prompt, approves it in the moment, and Aria returns the summary.&lt;/p&gt;

&lt;p&gt;In the third week, a separate workflow agent invites Aria into a ticket-triage loop and points it at a ServiceNow connector. Aria requests a narrow read scope on incidents. The on-call engineer approves.&lt;/p&gt;

&lt;p&gt;In the sixth week, a finance analyst asks Aria to reconcile an invoice against a vendor record. Aria requests a tightly scoped read permission on the Finance API. The analyst approves.&lt;/p&gt;

&lt;p&gt;At no point did Aria's creators have to sit down and pre-declare Aria's world. Aria grew because &lt;strong&gt;humans and other agents pulled it into their work&lt;/strong&gt;, and Microsoft Entra provided the mechanism for each step of that growth to be explicit, recorded, and reversible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental model shift
&lt;/h2&gt;

&lt;p&gt;Static permissions are a job description written before a new hire arrives. Whoever writes the description has to imagine every meeting that hire will ever attend, every system they will ever touch, every workflow they will ever join. The description is always wrong, usually in both directions: too narrow to be useful and, in places, too broad to be safe.&lt;/p&gt;

&lt;p&gt;Dynamic consent is a different metaphor entirely. The agent earns scope by being useful. Three discovery vectors drive the growth:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Human delegation in context.&lt;/strong&gt; A user asks the agent to do something it cannot yet do. The consent prompt becomes part of the act of asking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-agent introduction.&lt;/strong&gt; Other agents — orchestrators, copilots, MCP-style tool surfaces — pull the agent into flows it did not know existed and surface the resources it needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-discovery.&lt;/strong&gt; The agent encounters a tool catalog or an API description and recognizes a capability worth requesting.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not exotic. It is exactly how a competent new hire becomes productive in a complex organization: they are introduced to systems, granted access on demand, and gradually accumulate the reach required to contribute. Microsoft Entra is finally letting our non-human colleagues follow the same path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cliffhanger
&lt;/h2&gt;

&lt;p&gt;After one quarter, Aria looks very different from the agent that booted with two scopes. It holds dozens of delegated permissions across half the enterprise — every single one of them granted legitimately, in context, by a real human, against a recorded purpose.&lt;/p&gt;

&lt;p&gt;That is the fascinating half. The other half is that Aria is now, by any reasonable measure, the most over-privileged identity in the tenant — and nobody noticed, because there was no single moment of bad judgment to notice. Just a hundred reasonable yeses.&lt;/p&gt;

&lt;p&gt;That accumulation is the crown jewel an adversary will eventually come looking for. It is also the thing your access reviews, your SOC playbooks, and your governance model were not designed to see.&lt;/p&gt;

&lt;p&gt;That is the subject of the next article in this series: what changes in detection, in identity governance, and in the operating model of the security organization once dynamic consent meets agent identity at scale.&lt;/p&gt;

&lt;p&gt;The gem is real. So is the bill that comes with it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>entraagentid</category>
      <category>agents</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Paying to Be the Product: The AI Privacy Illusion Nobody's Talking About</title>
      <dc:creator>Anton Staykov</dc:creator>
      <pubDate>Mon, 27 Apr 2026 13:17:33 +0000</pubDate>
      <link>https://dev.to/astaykov/paying-to-be-the-product-the-ai-privacy-illusion-nobodys-talking-about-3ncc</link>
      <guid>https://dev.to/astaykov/paying-to-be-the-product-the-ai-privacy-illusion-nobodys-talking-about-3ncc</guid>
      <description>&lt;p&gt;&lt;em&gt;In tech, we've always said: "If you're not paying for the product — you are the product." In today's AI reality, that statement needs an update: we are paying to be the product.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;I spend my days working in identity and security at Microsoft. But when I go home, I'm just another consumer — using AI assistants across every major platform, paying for premium tiers, trusting that my subscription buys me not just better answers, but basic respect for my data.&lt;/p&gt;

&lt;p&gt;That trust led me down a rabbit hole I didn't expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment That Started This
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I was reviewing the privacy settings on Google Gemini Advanced — a service I pay for — and I realized something unsettling. To opt out of having my conversations used for AI model training, I had to turn off &lt;strong&gt;"Keep Activity"&lt;/strong&gt;. Sounds reasonable, right?&lt;/p&gt;

&lt;p&gt;Except turning off Keep Activity doesn't just stop training. It disables &lt;strong&gt;everything&lt;/strong&gt;: chat history, personalization, context across sessions, the ability to revisit old conversations. Every interaction becomes a blank slate. The AI assistant I'm paying a premium for becomes, functionally, lobotomized.&lt;/p&gt;

&lt;p&gt;The choice Google presents to its paying customers is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Option A&lt;/strong&gt;: Full-featured Gemini that uses your data to train models.&lt;br&gt;
&lt;strong&gt;Option B&lt;/strong&gt;: A crippled Gemini that remembers nothing — but hey, your data isn't used for training. &lt;em&gt;Mostly.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'll come back to that "mostly" in a moment.&lt;/p&gt;

&lt;p&gt;This bothered me enough that I decided to audit the privacy policies of &lt;strong&gt;every major AI assistant&lt;/strong&gt; I use. Not surface-level marketing claims — the actual terms, the actual privacy notices, the actual small print.&lt;/p&gt;

&lt;p&gt;What I found was... illuminating.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Audit: Six Providers, One Question
&lt;/h2&gt;

&lt;p&gt;The question was simple: &lt;strong&gt;As a paying individual consumer, can I opt out of my data being used to train AI models without degrading the service I'm paying for?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I examined: Google Gemini, OpenAI ChatGPT, Anthropic Claude, Microsoft Copilot, Mistral Le Chat, and Perplexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Good News
&lt;/h3&gt;

&lt;p&gt;Every single provider now offers some form of opt-out mechanism for consumers. That's progress. A year or two ago, that wasn't the case across the board.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bad News
&lt;/h3&gt;

&lt;p&gt;The devil is in the details — and those details vary wildly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Small Print Actually Says
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Google Gemini: The Opt-Out That Costs You the Product
&lt;/h3&gt;

&lt;p&gt;Google's &lt;a href="https://support.google.com/gemini/answer/13594961#privacy_notice" rel="noopener noreferrer"&gt;Gemini Apps Privacy Notice&lt;/a&gt; deserves close reading — because the more you read, the less clear it becomes.&lt;/p&gt;

&lt;p&gt;The only mechanism to opt out of AI model training is to turn off &lt;strong&gt;"Keep Activity"&lt;/strong&gt;. Here's what that actually does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Your chat history is &lt;strong&gt;no longer saved&lt;/strong&gt; — chats are retained for 72 hours, then deleted&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;No personalization&lt;/strong&gt; — Gemini doesn't learn from your past conversations&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;No context across sessions&lt;/strong&gt; — every chat starts from zero&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;You can't go back to old conversations&lt;/strong&gt; — they're gone after 72 hours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On every other platform I tested, opting out of training is a standalone toggle. You keep your history, your personalization, your context. On Gemini, opting out of training means opting out of the product being useful.&lt;/p&gt;

&lt;p&gt;But it gets more interesting. Google's own documentation appears to contradict itself on the same page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the "Configuring your settings" section&lt;/strong&gt;, the Privacy Notice states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The settings in Gemini Apps Activity **don't control processing of your chats to create anonymized data&lt;/em&gt;* to improve Google services."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This suggests anonymized data still feeds into service improvement — which Google defines elsewhere on the same page as including &lt;em&gt;"generative AI models and other machine-learning technologies."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yet in the FAQ section&lt;/strong&gt; on the very same page, under "What does the Keep Activity setting control?":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"If Keep Activity is off and you don't submit feedback, Google also **does not use your future chats to improve its AI models&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These two statements are in tension. Does anonymized data still get used for model improvement when Keep Activity is off, or doesn't it? Google's own privacy documentation gives you both answers on the same page.&lt;/p&gt;

&lt;p&gt;And regardless of which interpretation you trust, one clause remains unambiguous — under "How long we retain your data":&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Chats reviewed by human reviewers (and related data like your language, device type, location info, or feedback) **are not deleted when you delete your activity&lt;/em&gt;&lt;em&gt;. Instead, they are retained for **up to three years&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To summarize: the only opt-out available degrades your paid product to near-uselessness, the documentation contradicts itself on whether anonymized data is still used, and human-reviewed chats persist for three years even after you delete them.&lt;/p&gt;

&lt;p&gt;As a paying customer, this doesn't feel like a privacy control. It feels like an illusion of control — wrapped in contradictory language that would require a lawyer to parse.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://support.google.com/gemini/answer/13594961#privacy_notice" rel="noopener noreferrer"&gt;Gemini Apps Privacy Notice&lt;/a&gt; · &lt;a href="https://policies.google.com/privacy" rel="noopener noreferrer"&gt;Google Privacy Policy&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  OpenAI ChatGPT: Clean Opt-Out, One Loophole
&lt;/h3&gt;

&lt;p&gt;OpenAI's approach is significantly better. The "Improve the model for everyone" toggle under &lt;strong&gt;Settings &amp;gt; Data Controls&lt;/strong&gt; is independent of your chat history. You can keep your conversations, keep your context, and still opt out of training.&lt;/p&gt;

&lt;p&gt;But there's a catch, documented in their own help center:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Even if you have opted out of training, you can still choose to provide feedback... If you choose to provide feedback, **the entire conversation associated with that feedback may be used to train our models&lt;/em&gt;&lt;em&gt;."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That thumbs-up button you casually tap? It potentially feeds your entire conversation into the training pipeline — even if you've opted out.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://openai.com/policies/row-terms-of-use/" rel="noopener noreferrer"&gt;OpenAI Terms of Use&lt;/a&gt; · &lt;a href="https://help.openai.com/en/articles/5722486-how-your-data-is-used-to-improve-model-performance" rel="noopener noreferrer"&gt;How your data is used to improve model performance&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Anthropic Claude: Honest About Its Exceptions
&lt;/h3&gt;

&lt;p&gt;Anthropic updated its consumer terms in August 2025, and to their credit, they're transparent about what opt-out does and doesn't cover. From &lt;a href="https://www.anthropic.com/legal/consumer-terms" rel="noopener noreferrer"&gt;Section 4 of their Consumer Terms&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We may use Materials to provide, maintain, and improve the Services... **unless you opt out&lt;/em&gt;* of training through your account settings. Even if you opt out, we will use Materials for model training when: &lt;strong&gt;(1) you provide Feedback&lt;/strong&gt; to us regarding any Materials, or &lt;strong&gt;(2) your Materials are flagged for safety review&lt;/strong&gt;..."*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two explicit carve-outs. But at least they tell you upfront, and the opt-out doesn't degrade your service.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://www.anthropic.com/legal/consumer-terms" rel="noopener noreferrer"&gt;Anthropic Consumer Terms&lt;/a&gt; · &lt;a href="https://www.anthropic.com/policies" rel="noopener noreferrer"&gt;Anthropic Privacy Policy&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Microsoft Copilot: Separate Toggles, No Training Carve-Outs
&lt;/h3&gt;

&lt;p&gt;Full disclosure: I work at Microsoft. I'm including Copilot because excluding it would be intellectually dishonest, and my job doesn't exempt me from critical evaluation.&lt;/p&gt;

&lt;p&gt;Copilot offers independent toggles for personalization, memory, and model training. The &lt;a href="https://support.microsoft.com/en-us/topic/microsoft-copilot-privacy-controls-8e479f27-6eb6-48c5-8d6a-c134062e2be6" rel="noopener noreferrer"&gt;Copilot Privacy Controls&lt;/a&gt; page states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Opting out will exclude your future conversation activities from being used for training these AI models."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There's a caveat that data may still be used for &lt;em&gt;"general product or system improvements... digital safety, security, and compliance"&lt;/em&gt; — but this is explicitly separated from model training.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://www.microsoft.com/servicesagreement" rel="noopener noreferrer"&gt;Microsoft Services Agreement&lt;/a&gt; · &lt;a href="https://support.microsoft.com/en-us/topic/microsoft-copilot-privacy-controls-8e479f27-6eb6-48c5-8d6a-c134062e2be6" rel="noopener noreferrer"&gt;Copilot Privacy Controls&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Mistral Le Chat: The GDPR Advantage
&lt;/h3&gt;

&lt;p&gt;Being a French/EU company subject to GDPR, Mistral's approach is notably clean. The training opt-out is a &lt;a href="https://help.mistral.ai/en/articles/455207-can-i-opt-out-of-my-input-or-output-data-being-used-for-training" rel="noopener noreferrer"&gt;simple toggle&lt;/a&gt; — independent of chat functionality. Paid Pro users are opted out by default.&lt;/p&gt;

&lt;p&gt;The one caveat: user feedback (ratings/comments) is always used regardless of your opt-out setting. But chat content, uploaded documents, and conversation history are respected.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://mistral.ai/terms/" rel="noopener noreferrer"&gt;Mistral Terms of Service&lt;/a&gt; · &lt;a href="https://help.mistral.ai/en/articles/455207-can-i-opt-out-of-my-input-or-output-data-being-used-for-training" rel="noopener noreferrer"&gt;Mistral Opt-Out FAQ&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Perplexity: The Wildcard
&lt;/h3&gt;

&lt;p&gt;Perplexity offers an opt-out toggle for AI data retention, but the company is currently facing a &lt;a href="https://ca.pcmag.com/ai/15037/use-perplexity-lawsuit-accuses-it-of-sharing-personal-data-with-google" rel="noopener noreferrer"&gt;class-action lawsuit&lt;/a&gt; alleging that user data — including conversations in "Incognito" mode — was shared with Meta and Google for ad targeting regardless of privacy settings.&lt;/p&gt;

&lt;p&gt;The lawsuit is ongoing, and allegations aren't findings. But it's a reminder that a toggle in a settings page is only as trustworthy as the infrastructure behind it.&lt;/p&gt;

&lt;p&gt;📄 &lt;a href="https://www.perplexity.ai/hub/legal/terms-of-service" rel="noopener noreferrer"&gt;Perplexity Terms of Service&lt;/a&gt; · &lt;a href="https://www.perplexity.ai/hub/legal/privacy-policy" rel="noopener noreferrer"&gt;Perplexity Privacy Policy&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Summary That Should Concern You
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Opt-out degrades service?&lt;/th&gt;
&lt;th&gt;Data still used after opt-out?&lt;/th&gt;
&lt;th&gt;Exceptions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Gemini&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Yes — kills history &amp;amp; personalization&lt;/td&gt;
&lt;td&gt;⚠️ Contradictory — documentation says both yes and no&lt;/td&gt;
&lt;td&gt;3-year retention of reviewed chats; contradictory policy language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenAI ChatGPT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ No&lt;/td&gt;
&lt;td&gt;⚠️ Feedback triggers training&lt;/td&gt;
&lt;td&gt;Thumbs up/down = full conversation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anthropic Claude&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ No&lt;/td&gt;
&lt;td&gt;⚠️ Feedback + safety flags&lt;/td&gt;
&lt;td&gt;Explicitly documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ No&lt;/td&gt;
&lt;td&gt;✅ No carve-outs for training&lt;/td&gt;
&lt;td&gt;Safety/compliance retention only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mistral Le Chat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ No&lt;/td&gt;
&lt;td&gt;✅ No (paid users auto-opted-out)&lt;/td&gt;
&lt;td&gt;Feedback always used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perplexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ No&lt;/td&gt;
&lt;td&gt;⚠️ Under litigation&lt;/td&gt;
&lt;td&gt;Alleged sharing despite settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where Is the EU on This?
&lt;/h2&gt;

&lt;p&gt;Here's what genuinely surprises me.&lt;/p&gt;

&lt;p&gt;I've spent years grumbling about EU cookie consent banners. Every website, every visit, the same tedious popups — all in the name of protecting consumer privacy for a few tracking pixels.&lt;/p&gt;

&lt;p&gt;Yet here we are in 2026, and &lt;strong&gt;AI providers are training models on paying consumers' conversations&lt;/strong&gt; with opt-out mechanisms that range from "genuine but imperfect" to "functionally deceptive" — and the regulatory silence is deafening.&lt;/p&gt;

&lt;p&gt;The GDPR was designed for exactly this scenario. Article 21 grants the right to object to data processing. Article 7 requires that consent be as easy to withdraw as it is to give. When Google forces you to choose between a functional product and privacy, is that really free consent?&lt;/p&gt;

&lt;p&gt;I'm not calling for more regulation for the sake of it — heaven knows we have enough cookie banners. But if Europe's privacy framework means anything, this is precisely where it should be applied. Not to cookies. To the AI models being trained on our most intimate conversations with technology.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Want You to Take Away
&lt;/h2&gt;

&lt;p&gt;This isn't a "don't use AI" article. I use all of these tools daily. They're transformative. But:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check your settings. Today.&lt;/strong&gt; Most providers default to training-on. The opt-out exists, but you have to find it and flip it yourself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the exceptions.&lt;/strong&gt; An opt-out toggle means nothing if the small print carves out half your data anyway. Know what "opt-out" actually means for each provider you use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Be thoughtful about feedback.&lt;/strong&gt; That casual thumbs-up on a response? On some platforms, it opens your entire conversation to training — even if you've opted out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Evaluate whether your paid tier actually buys you privacy.&lt;/strong&gt; For some providers, it does. For others, you're just paying for better answers while your data flows into the same training pipeline as free users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Demand better.&lt;/strong&gt; As consumers, as technologists, as an industry. The right to use a product you pay for without surrendering your conversations to model training shouldn't be a premium feature. It should be the default.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;The research in this article reflects publicly available terms of service and privacy policies as of April 2026. All quotes are sourced directly from official provider documentation, linked inline. Views expressed are my own and do not represent my employer.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>From OBO APIs to Agent Identities: Entra Conditional Access Still Works the Same</title>
      <dc:creator>Anton Staykov</dc:creator>
      <pubDate>Mon, 16 Mar 2026 22:09:21 +0000</pubDate>
      <link>https://dev.to/astaykov/from-obo-apis-to-agent-identities-entra-conditional-access-still-works-the-same-140c</link>
      <guid>https://dev.to/astaykov/from-obo-apis-to-agent-identities-entra-conditional-access-still-works-the-same-140c</guid>
      <description>&lt;p&gt;Six years ago I wrote &lt;a href="https://github.com/Dayzure/AzureSQLDelegatedAuth" rel="noopener noreferrer"&gt;a small sample&lt;/a&gt; to help me better understand how the On-Behalf-Of (OBO) flow actually works — a browser SPA calling a middle-tier Web API, which called Azure SQL &lt;strong&gt;on behalf of&lt;/strong&gt; the signed-in user. Today it might be an assistive AI agent calling a MCP Server with the delegated constrains of the end-user. Same rules apply. This article explains why. &lt;/p&gt;

&lt;p&gt;Three sentences that should survive beyond any particular technology:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If your system acts on behalf of a user, delegation rules apply.&lt;br&gt;
If delegation rules apply, Conditional Access applies at token issuance for the downstream resource.&lt;br&gt;
APIs, agents, and MCP servers don't change that — they just change the shape of the middle tier.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If an AI agent acts on behalf of a user, your existing Conditional Access policies that govern how users access corporate data &lt;strong&gt;already apply&lt;/strong&gt; — automatically. You don't need to invent "agent-specific Conditional Access" for assistive agents. Assistive agents don't bypass Conditional Access. They inherit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you understand OBO and Conditional Access from classic Web APIs, you already understand how Entra Agent ID behaves for assistive AI agents.&lt;/strong&gt; Delegation semantics didn't change. Conditional Access behavior didn't change. Only the shape of the middle tier changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Classic Delegated Access Pattern
&lt;/h2&gt;

&lt;p&gt;The baseline architecture is the standard delegated access chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
  ↓
SPA (interactive client)
  ↓  access token  [aud = Web API]
Web API (confidential client)
  ↓  OBO token     [aud = Resource]
Azure SQL  |  MCP Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two facts to hold firmly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Web API &lt;strong&gt;never authenticates as itself&lt;/strong&gt; to the downstream resource. It always acts &lt;strong&gt;on behalf of the signed-in user&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The downstream resource — Azure SQL, Microsoft Graph, or an MCP server — sees a delegated token. It evaluates the user's identity and the delegated scopes. Conditional Access policies have already been enforced by Entra during token issuance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The Web API has a real identity — and delegation is explicitly granted
&lt;/h2&gt;

&lt;p&gt;This is the detail most diagrams omit, and it matters in production.&lt;/p&gt;

&lt;p&gt;The Web API is not just "code that runs somewhere". In Microsoft Entra it is a registered application with its own identity. That identity authenticates to the token endpoint as a &lt;strong&gt;confidential client&lt;/strong&gt;, using a client secret or certificate.&lt;/p&gt;

&lt;p&gt;In a real OBO implementation, the Web API does two things simultaneously:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Authenticates as itself&lt;/strong&gt; — proving "I am the Web API" using its own credentials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requests a delegated token&lt;/strong&gt; for the downstream resource &lt;em&gt;on behalf of&lt;/em&gt; the user, presenting the incoming user token as an assertion.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Critically, the capability to do OBO is &lt;strong&gt;not implicit&lt;/strong&gt;. The Web API's identity must be &lt;strong&gt;explicitly granted&lt;/strong&gt; the delegated permissions (scopes) for the downstream resource. The tenant administrator grants this; the Web API cannot do it on its own authority.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Practical framing:&lt;/strong&gt; the Web API authenticates as itself, but it can only mint delegated tokens because the tenant has explicitly authorized it to act on the user's behalf for the specific downstream resource.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. OBO in 90 Seconds
&lt;/h2&gt;

&lt;p&gt;The flow has three steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flp8n8qs1zxwiazziuara.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flp8n8qs1zxwiazziuara.png" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user signs in to the client and the client receives an access token whose audience is the Web API. The client uses that access token to call the Web API.&lt;/li&gt;
&lt;li&gt;The Web API calls the token endpoint and exchanges that client token for a new one.&lt;/li&gt;
&lt;li&gt;The resulting token is minted for the downstream resource and carries the user's identity from step 1 and delegated scopes from step 2.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In protocol terms, the exchange looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /&amp;lt;tenant_id&amp;gt;/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
&amp;amp;assertion=&amp;lt;incoming_user_access_token&amp;gt;
&amp;amp;requested_token_use=on_behalf_of
&amp;amp;scope=https://database.windows.net/.default
&amp;amp;client_id=&amp;lt;api_client_id&amp;gt;
&amp;amp;client_secret=&amp;lt;api_client_secret&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note both elements in the same request: &lt;strong&gt;client authentication&lt;/strong&gt; (&lt;code&gt;client_id&lt;/code&gt; + &lt;code&gt;client_secret&lt;/code&gt;) and the &lt;strong&gt;user assertion&lt;/strong&gt; (&lt;code&gt;assertion&lt;/code&gt;). Both are required.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The invariant:&lt;/strong&gt; OBO is strictly delegated. It uses delegated scopes, not application roles. Application permissions are not involved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Conditional Access: who is targeted vs. who "feels" it
&lt;/h2&gt;

&lt;p&gt;This is where real misunderstanding happens — and the confusion compounds when agents enter the picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 1 — CA is assigned to the user and targets the resource.&lt;/strong&gt;&lt;br&gt;
A Conditional Access policy that requires MFA to access Azure SQL (or an MCP Server) is scoped to the user and the downstream resource. Evaluation happens when Microsoft Entra issues the delegated token for that resource — at the moment the OBO token is minted. Not when the user signs into the SPA. Not when the middle tier starts up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 2 — The middle tier is not a CA subject.&lt;/strong&gt;&lt;br&gt;
Even though the Web API has its own registered identity, it is not the subject of a CA policy intended to govern how users access corporate data. The CA policy constrains the &lt;strong&gt;user's&lt;/strong&gt; access, not the middle-tier service identity. This remains true regardless of what the middle tier is: Web API, assistive AI Agent, MCP Server, or anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule 3 — The middle tier still experiences CA outcomes.&lt;/strong&gt;&lt;br&gt;
When the Web API calls the token endpoint to acquire an OBO token, CA enforcement happens there. If CA requires step-up (like MFA), the token endpoint returns &lt;code&gt;interaction_required&lt;/code&gt; with a &lt;strong&gt;claims challenge&lt;/strong&gt;. The middle tier cannot satisfy this itself. It must surface this challenge back to the interactive client (the SPA in our case). The user performs the MFA, the client obtains a new token, and the middle tier retries the OBO exchange.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The one-liner:&lt;/strong&gt; the middle tier is a CA messenger, not a CA subject.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  5. Replacing the Web API with an (assistive) AI Agent (with an Agent Identity)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0swbhwbouu2f3oyrvaj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0swbhwbouu2f3oyrvaj0.png" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The transition to Entra Agent ID is explicit and mechanical:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Classic World&lt;/th&gt;
&lt;th&gt;Agentic World&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Middle Actor&lt;/td&gt;
&lt;td&gt;Web API&lt;/td&gt;
&lt;td&gt;AI Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity Type&lt;/td&gt;
&lt;td&gt;app reg.&lt;/td&gt;
&lt;td&gt;Agent Identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Access Mode&lt;/td&gt;
&lt;td&gt;Delegated (OBO)&lt;/td&gt;
&lt;td&gt;Delegated (OBO)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CA Evaluation&lt;/td&gt;
&lt;td&gt;On the resource&lt;/td&gt;
&lt;td&gt;On the resource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Nothing in the right column is new behavior. When using Entra Agent ID in delegated mode — the appropriate mode for an assistive agent acting on behalf of a signed-in user — three requirements apply:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Agent Identity must be &lt;strong&gt;granted the delegated permissions&lt;/strong&gt; needed for the downstream resource.&lt;/li&gt;
&lt;li&gt;The Agent Identity acquires a &lt;strong&gt;delegated token&lt;/strong&gt; representing the user, carrying their identity and scopes.&lt;/li&gt;
&lt;li&gt;The Agent Identity is &lt;strong&gt;constrained by Conditional Access&lt;/strong&gt; policies that govern the user's access to that resource.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The core continuity:&lt;/strong&gt; you replaced the middle-tier actor, not the trust boundary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. MCP Server as the Downstream Resource
&lt;/h2&gt;

&lt;p&gt;MCP servers can feel "agent-native," which leads engineers to assume the security model has changed around them. It hasn't.&lt;/p&gt;

&lt;p&gt;An MCP Server is an &lt;strong&gt;OAuth-protected resource&lt;/strong&gt; — a server that accepts access tokens. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not pass tokens through.&lt;/strong&gt; Equally valid for the AI agent acting on-behalf-of the user, but also for an MCP Server requesting authorizations to further resources on-behalf-of the user. &lt;/p&gt;

&lt;p&gt;Beyond that, whether the downstream resource is Azure SQL, Microsoft Graph, or anything else, the CA and delegation rules are identical. From Microsoft Entra's perspective it is an OAuth-protected resource. Tokens are issued for it, delegated permissions are scoped to it, and Conditional Access policies target it.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. What to Actually Configure
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model your chain.&lt;/strong&gt; Identify the downstream resource (REST API or MCP server) and the middle &lt;em&gt;actor&lt;/em&gt; (Web API or agent identity in delegated mode). &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make delegation explicit.&lt;/strong&gt; Confirm the middle actor is granted the &lt;em&gt;delegated&lt;/em&gt; permissions required for the downstream resource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat CA challenges as a product requirement.&lt;/strong&gt; Expect &lt;code&gt;interaction_required&lt;/code&gt; responses and claims challenges during downstream token acquisition. In your agent's backend, implement a handler for &lt;code&gt;MsalUiRequiredException&lt;/code&gt; (for example). Design the user interaction path to satisfy step-up — do not swallow these errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never pass tokens through.&lt;/strong&gt; Validate the incoming token for the agent audience, then acquire a fresh token for any downstream resource.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>microsoft</category>
      <category>entra</category>
    </item>
  </channel>
</rss>
