使用OAuth和Entra ID实现安全的MCP OAuth桌面客户端
本文演示了如何使用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服务器公开的函数。服务器是一个简单的ASP.NET Core应用程序,实现了MCP服务器API。
MCP服务器
新客户端使用了前一篇文章“使用OAuth和Entra ID实现安全的MCP服务器”中的MCP服务器。它仅接受来自特定租户的Microsoft Entra ID的委托访问令牌。
MCP桌面OAuth客户端
使用Microsoft.Identity.Client Nuget包实现公共OpenID Connect客户端。作为桌面应用程序或本演示中使用的控制台应用程序,无法保存机密,因此需要公共客户端,并且客户端必须使用基于用户的委托访问令牌。使用带有PKCE的OpenID Connect代码流进行身份验证,客户端必须使用Web浏览器对用户进行身份验证。此类应用程序无法使用App-to-App服务,我们的信任度较低。
SignInUserAndGetTokenUsingMSAL方法用于实现用户身份验证。
|
|
CreateMcpTransportAsync方法使用Microsoft Entra ID客户端获取访问令牌,并在HttpClient中使用Bearer令牌设置Authorization标头。此令牌在MCP服务器上进行验证。服务器期望具有"mcp:tools" scp声明的委托访问令牌。不接受应用程序访问令牌。
|
|
当应用程序启动时,控制台应用程序会打开浏览器进行身份验证。
注意事项
在此设置中,全程强制使用用户委托访问令牌。无法实现App-to-App安全性。MCP服务器作为远程服务器集成到客户端应用程序中。在此设置中未使用DCR,也不应使用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服务器:https://learn.microsoft.com/en-us/dotnet/ai/quickstarts/build-mcp-server
标准、草案标准
-
OAuth 2.0动态客户端注册协议
-
OAuth 2.0授权服务器元数据
-
https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
-
https://modelcontextprotocol.io/specification/2025-06-18/basic/security_best_practices
-
SPIFFE:https://spiffe.io/docs/latest/spiffe-about/overview/
-
Azure Open AI:https://learn.microsoft.com/en-us/azure/ai-foundry/