实现一个使用 OAuth 和 Entra ID 的安全 MCP OAuth 桌面客户端
2025年10月16日 · by damienbod · in .NET, .NET Core, ASP.NET Core, Azure, Entra CIAM, MCP, Microsoft Entra External ID, Microsoft Entra ID, OAuth2, Open AI, Security · 1 Comment
本文演示了如何使用 Microsoft Entra ID 实现一个安全的 MCP OAuth 桌面客户端。MCP 服务器使用 ASP.NET Core 构建,并使用 Microsoft Entra ID 进行安全保护。MCP 客户端是一个 .NET 控制台应用程序,必须获取一个 OAuth 访问令牌才能与 MCP 服务器交互。 代码:https://github.com/damienbod/McpSecurity
设置
开发了一个客户端应用程序,用于对受 Microsoft Entra ID 保护的 MCP 服务器进行身份验证和交互。它使用 Azure OpenAI,并通过公共的 OpenID Connect 客户端获取委派的访问令牌。然后,应用程序调用 MCP 服务器公开的功能。服务器是一个实现了 MCP 服务器 API 的简单 ASP.NET Core 应用程序。
MCP 服务器
新的客户端使用了先前文章《实现一个使用 OAuth 和 Entra ID 的安全 MCP 服务器》中的 MCP 服务器。它只接受来自特定 Microsoft Entra ID 租户的委派访问令牌。
MCP 桌面 OAuth 客户端
使用 Microsoft.Identity.Client Nuget 包来实现公共的 OpenID Connect 客户端。作为桌面应用程序,或本演示中使用的控制台应用程序,无法保存密钥,因此需要使用公共客户端,并且客户端必须使用基于用户的委派访问令牌。使用带有 PKCE 的 OpenID Connect 授权码流程进行身份验证,客户端必须使用 Web 浏览器来验证用户身份。此类应用程序不能使用应用间服务,我们拥有较低的信任级别。
SignInUserAndGetTokenUsingMSAL 方法用于实现用户身份验证。
|
|
CreateMcpTransportAsync 方法使用 Microsoft Entra ID 客户端获取访问令牌,并在 HttpClient 的 Authorization 头中设置 Bearer 令牌。此令牌在 MCP 服务器上进行验证。服务器期望一个包含“mcp:tools”作用域声明的委派访问令牌。不接受应用程序访问令牌。
|
|
当应用程序启动时,控制台应用程序会打开浏览器进行身份验证。
注意事项
在此设置中,全程强制使用用户委派的访问令牌。无法实现应用间的安全性。MCP 服务器被用作客户端应用程序中的远程服务器集成。此设置中未使用 DCR,也不应使用。信任是支持 DCR 的主要问题。安全性仍有改进空间,并且存在一些与此相关的有趣的 OAuth 待解决问题。
链接
- https://mcp.azure.com/
- https://github.com/microsoft/azure-devops-mcp
- https://auth0.com/blog/an-introduction-to-mcp-and-authorization/
- https://learning.postman.com/docs/postman-ai-agent-builder/mcp-server-flows/mcp-server-flows/
- https://stytch.com/blog/MCP-authentication-and-authorization-guide/
- .NET MCP 服务器
- 标准,草案标准
- SPIFFE
- Azure Open AI