<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>OAuth | The .NET Blog</title><link>https://thedotnetblog.com/zh/tags/oauth/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>zh</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Wed, 20 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/zh/tags/oauth/index.xml" rel="self" type="application/rss+xml"/><item><title>您的 AI 代理有一个身份问题（这是解决它的模板）</title><link>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/zh/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</guid><description>Curity 和 Microsoft 的新 azd 模板展示了如何构建使用具有精细作用域的短期 OAuth 令牌的 AI 代理——这样代理永远无法看到它们不应该看到的数据。</description><content:encoded>&lt;p&gt;在每个 AI 代理项目中都有这样一个时刻：演示完美运行，代理解释自然语言，调用正确的 API，返回正确的数据。然后你开始思考真实用户。&lt;/p&gt;
&lt;p&gt;什么能阻止一个用户的代理会话看到另一个用户的数据？如果代理通过提示注入被欺骗会怎样？如果它以意外的方式调用工具会怎样？&lt;/p&gt;
&lt;p&gt;这些不是边缘情况。这些是你需要在发布之前做出的设计决策。&lt;/p&gt;
&lt;p&gt;Curity 和 Microsoft 的新 &lt;code&gt;azd&lt;/code&gt; 模板为您提供了针对这个问题的可工作参考。&lt;/p&gt;
&lt;h2 id="核心问题身份验证--授权"&gt;核心问题：身份验证 ≠ 授权&lt;/h2&gt;
&lt;p&gt;大多数代理示例都很好地处理了用户身份验证。它们对授权处理得很差。知道用户是&lt;em&gt;谁&lt;/em&gt;并不能告诉你他们应该看到&lt;em&gt;什么数据&lt;/em&gt;。&lt;/p&gt;
&lt;p&gt;传统客户端应用程序进行可预测的 API 调用。AI 代理是不确定性的——它解释自然语言并决定调用什么。它可以很有创意。它也可能出错。如果通过提示注入被操纵，你需要不依赖于 AI 良好行为的规则。&lt;/p&gt;
&lt;p&gt;这个模板演示的解决方案：&lt;strong&gt;为每一跳携带正确信息的短期令牌&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="令牌链如何工作"&gt;令牌链如何工作&lt;/h2&gt;
&lt;p&gt;该模板使用带有令牌交换的 OAuth 2.0 访问令牌，在每个步骤缩小权限。用户令牌在到达 MCP 服务器之前会被交换两次：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一次交换&lt;/strong&gt; — 缩小作用域并将不透明令牌转换为 JWT&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二次交换&lt;/strong&gt; — 添加代理身份和 MCP 服务器跳的新受众&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MCP 服务器令牌的样子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stocks/read&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sub&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;62c839b8...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mcp.demo.example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;customer_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;178&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;region&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;USA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;customer_id&lt;/code&gt; 由授权服务器嵌入令牌中，而不是作为代理控制的参数传递。API 检查令牌，而不是代理的指令。&lt;/p&gt;
&lt;p&gt;这意味着：即使有人欺骗代理尝试获取另一个客户的数据，令牌也不会授权它。&lt;/p&gt;
&lt;h2 id="模板部署什么"&gt;模板部署什么&lt;/h2&gt;
&lt;p&gt;用几个 &lt;code&gt;azd&lt;/code&gt; 命令，您将获得：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Foundry 上的后端代理（C#、Microsoft A2A 和 MCP SDK）&lt;/li&gt;
&lt;li&gt;公开示例投资组合 API 的 MCP 服务器&lt;/li&gt;
&lt;li&gt;Curity Identity Server 作为授权服务器，以及用于身份验证的 Entra ID&lt;/li&gt;
&lt;li&gt;处理令牌交换和审计日志的外部和内部 API 网关&lt;/li&gt;
&lt;li&gt;所有 Azure 基础设施的 Bicep：Container Apps、VNet、ACR、Azure AI Foundry、Key Vault、Azure SQL Database、存储&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整个模式是可检查和可定制的。&lt;/p&gt;
&lt;h2 id="值得借鉴的设计原则"&gt;值得借鉴的设计原则&lt;/h2&gt;
&lt;p&gt;即使您不使用 Curity，该模式也是可转移的：&lt;strong&gt;代理永远不应该拥有永久 API 访问权限&lt;/strong&gt;。每个操作都应使用仅具有该特定调用所需最小作用域的短期令牌，为特定代理身份颁发，携带 API 进行授权决策所需的声明。&lt;/p&gt;
&lt;p&gt;这能抵御创意代理、错误和提示注入，而&amp;quot;只要确保代理不做坏事&amp;quot;永远做不到这一点。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结&lt;/h2&gt;
&lt;p&gt;AI 代理的安全模式在整个行业中仍在研究中。这个模板是我见过的最完整的参考实现之一——它涵盖了实际的授权流程，而不仅仅是身份验证。&lt;/p&gt;
&lt;p&gt;原始文章：&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-curity-least-privilege-ai-agents/"&gt;Least privilege AI agents: A new azd template from Curity and Microsoft&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>