Azure Web App 身份认证可选方案:Managed Identity(MI) 与 Federated Identity Credential(FIC)
使用托管身份令牌与联合身份凭据替代 Azure App Service Easy Auth 的客户端密钥,说明配置关系、ID 区分和共享身份的信任边界。
Azure Web App 身份认证可选方案:Managed Identity(MI) 与 Federated Identity Credential(FIC)
网站仍以 App registration 进行 Microsoft Entra ID 用户登录,只是把客户端凭据从 client secret 换成托管身份(MI)令牌;联合身份凭据(FIC)告诉 Entra“信任这个 MI”。
这是一种 Azure App Service 内置身份认证(Easy Auth)的可选配置方式,可减少客户端密钥存储、轮换和过期管理的负担。它不替代用户登录,也不替代业务资源的访问授权。
适用范围:本文说明 Microsoft Entra ID 的 workforce(员工租户)配置,假设网站已配置好 Easy Auth 和应用注册。此处不覆盖 External ID 的 external(外部租户)配置,也不覆盖应用代码自行实现的认证流程。
三种 ID 不要混用
| 用途 | 应填的值 |
|---|---|
| Easy Auth 的 Application / Client ID | 应用注册 app-web-auth-example 的 Client ID:<APP_CLIENT_ID> |
网站设置 OVERRIDE_USE_MI_FIC_ASSERTION_CLIENTID | MI 的 Client ID:<MI_CLIENT_ID> |
FIC 的 subject | MI 的 Principal / Object ID:<MI_PRINCIPAL_ID> |
示例配置的位置
| 位置 | 配置 |
|---|---|
| 每个 Web App → Identity → User assigned | 绑定用户分配托管身份 id-webapp-example |
| 每个 Web App → App settings | 添加上述 MI Client ID 设置,并设为 slot-sticky |
| 每个 Web App → Authentication → Microsoft | 将 Client secret setting name 改为 OVERRIDE_USE_MI_FIC_ASSERTION_CLIENTID;应用 Client ID 保持不变 |
App registration app-web-auth-example → Certificates & secrets → Federated credentials | 添加 fic-webapp-example;这是应用注册的子配置,不是 MI 下的 FIC |
FIC 的三个匹配条件:
| 字段 | 示例取值 |
|---|---|
issuer | https://login.microsoftonline.com/<TENANT_ID>/v2.0 |
subject | <MI_PRINCIPAL_ID> |
audiences | ["api://AzureADTokenExchange"] |
<TENANT_ID> 表示 MI 和应用注册所属的 Entra 租户 ID。应用注册的 Object ID 用 <APP_OBJECT_ID> 表示,用于 Graph API 定位应用对象,不应填入上面三个 ID 字段。
示例资源关系
示例订阅名称为 subscription-example;MI 位于资源组 rg-identity-example,部署区域按自己的环境选择。 应用注册和 FIC 属于 Entra 租户级对象,不属于 rg-identity-example。
图中五个网站仅用于展示同一信任范围内多个网站的配置关系,并非必须部署五个网站;单个网站也可使用此方案。
| 示例 Web App | 示例资源组 |
|---|---|
webapp-example-01 | rg-webapp-example-01 |
webapp-example-02 | rg-webapp-example-02 |
webapp-example-03 | rg-webapp-example-03 |
webapp-example-04 | rg-webapp-example-04 |
webapp-example-05 | rg-webapp-example-05 |
登录时发生什么
- 用户照常通过 Microsoft Entra ID 登录;用户身份并没有被 MI 替代。
- Easy Auth 根据 MI Client ID 选择
id-webapp-example,获取用于api://AzureADTokenExchange的 MI 令牌。 - Easy Auth 将该令牌作为 client assertion,代替 client secret,向 Entra 的令牌端点认证应用并兑换用户登录所需的令牌。
- Entra 检查
app-web-auth-example应用注册中的 FIC 是否匹配令牌的 issuer、subject、audience;通过后,Easy Auth 完成网站登录会话。
使用边界
共用 MI 的网站会处于同一应用认证信任范围;只有明确接受这一信任边界时才使用图中的共享方式。不要把该 MI 绑定到无关资源,否则这些资源也可能以该应用注册的身份认证。需要隔离信任范围时,应使用独立的 MI,并按需隔离应用注册。
FIC 本身不授予 Storage 或 Graph 数据访问权限;原有业务身份、RBAC、网络限制和用户访问策略仍需分别配置。每个网站的回调 URI 仍应在应用注册中正确配置,换用 MI 不会自动补齐这些设置。
迁移后应验证新的用户登录流程。确认应用代码不再依赖原密钥且登录正常后,再按官方文档清理原 client secret 及保存它的应用设置;不要仅因为已添加 FIC 就立即删除原密钥。图中展示的是配置关系,不是实际部署或业务健康状态的证明。
Mermaid 版本
flowchart LR
subgraph AZ["Azure 订阅:subscription-example"]
WA["5 个示例 Web Apps / Easy Auth<br/>webapp-example-01 · webapp-example-02<br/>webapp-example-03 · webapp-example-04 · webapp-example-05"]
MI["用户分配 MI:id-webapp-example<br/>资源组:rg-identity-example<br/>Client ID:<MI_CLIENT_ID><br/>Principal ID:<MI_PRINCIPAL_ID>"]
WA -->|"绑定 MI;通过 MI Client ID 选择身份"| MI
end
subgraph ENTRA["Microsoft Entra ID:同一租户"]
APP["App registration:app-web-auth-example<br/>应用 Client ID:<APP_CLIENT_ID>"]
FIC["FIC:fic-webapp-example<br/>subject = MI Principal ID<br/>issuer = 本租户 v2.0 端点<br/>audiences = api://AzureADTokenExchange"]
APP -->|"包含此联合身份凭据"| FIC
end
WA -->|"Easy Auth clientId 指向原应用注册"| APP
MI -->|"FIC 信任此身份;不授予 RBAC"| FIC