概述
Microsoft Entra ID(原 Azure Active Directory)是 Microsoft 的基于云的身份和访问管理服务。应用注册允许应用对用户进行身份验证并安全访问 Azure 资源。
关键概念
| 概念 | 说明 | |---------|-------------| | 应用注册 | 允许应用使用 Microsoft identity platform 的配置 | | 应用(客户端)ID | 你的应用程序的唯一标识符 | | 租户 ID | 你的 Azure AD 租户/目录的唯一标识符 | | 客户端机密 | 应用的密码(仅限机密客户端) | | 重定向 URI | 发送身份验证响应的 URL | | API 权限 | 你的应用请求的访问范围 | | 服务主体 | 注册应用时在租户中创建的身份 |
应用类型
| 类型 | 用例 | |------|----------| | Web 应用 | 服务器端应用、API | | 单页应用(SPA) | JavaScript/React/Angular 应用 | | 移动/原生应用 | 桌面应用、移动应用 | | 守护程序/服务 | 后台服务、API |
核心工作流
步骤 1:注册应用
在 Azure 门户中使用 Azure CLI 创建应用注册。
门户方法:
- 导航到 Azure Portal → Microsoft Entra ID → App registrations
- 点击 "New registration"
- 提供名称、支持的账户类型和重定向 URI
- 点击 "Register"
CLI 方法: 见 [references/cli-commands.md](references/cli-commands.md) IaC 方法: 见 [references/BICEP-EXAMPLE.bicep](references/BICEP-EXAMPLE.bicep)
如果你已经在项目中使用 IaC、需要可扩展解决方案来管理大量应用注册,或需要配置变更的细粒度审计历史,强烈建议使用 IaC 管理 Entra 应用注册。
步骤 2:配置身份验证
根据应用类型设置身份验证配置。
- Web 应用:添加重定向 URI,如需要则启用 ID 令牌
- SPA:添加重定向 URI,如必要则启用隐式授权流
- 移动/桌面:使用
http://localhost或自定义 URI scheme - 服务:客户端凭据流不需要重定向 URI
步骤 3:配置 API 权限
授予你的应用访问 Microsoft API 或你自己的 API 的权限。
常见 Microsoft Graph 权限:
User.Read- 读取用户配置文件User.ReadWrite.All- 读取和写入所有用户Directory.Read.All- 读取目录数据Mail.Send- 以用户身份发送邮件
详细信息: 见 [references/api-permissions.md](references/api-permissions.md)
步骤 4:创建客户端凭据(如需要)
对于机密客户端应用(web 应用、服务),创建客户端机密、证书或联合身份凭据。
客户端机密:
- 导航到 "Certificates & secrets"
- 创建新的客户端机密
- 立即复制该值(仅显示一次)
- 安全存储(建议使用 Key Vault)
证书: 在生产环境中,使用证书而不是机密以增强安全性。通过 "Certificates & secrets" 部分上传证书。
联合身份凭据: 用于将机密客户端动态认证到 Entra platform。
步骤 5:实现 OAuth 流
将 OAuth 流集成到你的应用代码中。
参见:
- [references/oauth-flows.md](references/oauth-flows.md) - OAuth 2.0 流详情
- [references/console-app-example.md](references/console-app-example.md) - 控制台应用实现
常见模式
模式 1:首次应用注册
逐步指导用户完成首次应用注册。
所需信息:
- 应用名称
- 应用类型(web、SPA、移动、服务)
- 重定向 URI(如适用)
- 所需权限
脚本: 见 [references/first-app-registration.md](references/first-app-registration.md)
模式 2:带用户身份验证的控制台应用
创建可认证用户的 .NET/Python/Node.js 控制台应用。
所需信息:
- 编程语言(C#、Python、JavaScript 等)
- 身份验证库(建议使用 MSAL)
- 所需权限
示例: 见 [references/console-app-example.md](references/console-app-example.md)
模式 3:服务到服务身份验证
设置守护程序/服务身份验证,无需用户交互。
所需信息:
- 服务/应用名称
- 目标 API/资源
- 使用机密还是证书
实现: 使用 Client Credentials 流(见 [references/oauth-flows.md#client-credentials-flow](references/oauth-flows.md#client-credentials-flow))
MCP 工具和 CLI
Azure CLI 命令
| 命令 | 用途 | |---------|---------| | az ad app create | 创建新的应用注册 | | az ad app list | 列出应用注册 | | az ad app show | 显示应用详情 | | az ad app permission add | 添加 API 权限 | | az ad app credential reset | 生成新的客户端机密 | | az ad sp create | 创建服务主体 |
完整参考: 见 [references/cli-commands.md](references/cli-commands.md)
Microsoft Authentication Library(MSAL)
MSAL 是集成 Microsoft identity platform 的推荐库。
支持的语言:
- .NET/C# -
Microsoft.Identity.Client - JavaScript/TypeScript -
@azure/msal-browser、@azure/msal-node - Python -
msal
示例: 见 [references/console-app-example.md](references/console-app-example.md)
安全最佳实践
| 实践 | 建议 | |----------|---------------| | 切勿硬编码机密 | 使用环境变量、Azure Key Vault 或托管标识 | | 定期轮换机密 | 设置过期时间,自动化轮换 | | 优先使用证书而非机密 | 生产环境更安全 | | 最小权限 | 仅请求所需 API 权限 | | 启用 MFA | 要求用户使用多因素身份验证 | | 使用托管标识 | 对于 Azure 托管应用,完全避免使用机密 | | 验证令牌 | 始终验证颁发者、受众和过期时间 | | 仅使用 HTTPS | 所有重定向 URI 必须使用 HTTPS(localhost 除外) | | 监控登录 | 使用 Entra ID 登录日志进行异常检测 |
SDK 快速参考
- Azure Identity:[Python](references/sdk/azure-identity-py.md) | [.NET](references/sdk/azure-identity-dotnet.md) | [TypeScript](references/sdk/azure-identity-ts.md) | [Java](references/sdk/azure-identity-java.md) | [Rust](references/sdk/azure-identity-rust.md)
- Key Vault(机密):[Python](references/sdk/azure-keyvault-py.md) | [TypeScript](references/sdk/azure-keyvault-secrets-ts.md)
- Auth Events:[.NET](references/sdk/microsoft-azure-webjobs-extensions-authentication-events-dotnet.md)
参考
- [OAuth 流](references/oauth-flows.md) - 详细 OAuth 2.0 流说明
- [CLI 命令](references/cli-commands.md) - 应用注册的 Azure CLI 参考
- [控制台应用示例](references/console-app-example.md) - 完整可用示例
- [首次应用注册](references/first-app-registration.md) - 面向初学者的逐步指南
- [API 权限](references/api-permissions.md) - 权限理解与配置
- [故障排除](references/troubleshooting.md) - 常见问题与解决方案