文章

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)

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(外部租户)配置,也不覆盖应用代码自行实现的认证流程。

示例 Web Apps、MI、FIC 和应用注册的配置关系

三种 ID 不要混用

用途应填的值
Easy Auth 的 Application / Client ID应用注册 app-web-auth-example 的 Client ID:<APP_CLIENT_ID>
网站设置 OVERRIDE_USE_MI_FIC_ASSERTION_CLIENTIDMI 的 Client ID:<MI_CLIENT_ID>
FIC 的 subjectMI 的 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 的三个匹配条件:

字段示例取值
issuerhttps://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-01rg-webapp-example-01
webapp-example-02rg-webapp-example-02
webapp-example-03rg-webapp-example-03
webapp-example-04rg-webapp-example-04
webapp-example-05rg-webapp-example-05

登录时发生什么

  1. 用户照常通过 Microsoft Entra ID 登录;用户身份并没有被 MI 替代。
  2. Easy Auth 根据 MI Client ID 选择 id-webapp-example,获取用于 api://AzureADTokenExchange 的 MI 令牌。
  3. Easy Auth 将该令牌作为 client assertion,代替 client secret,向 Entra 的令牌端点认证应用并兑换用户登录所需的令牌。
  4. 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:&lt;MI_CLIENT_ID&gt;<br/>Principal ID:&lt;MI_PRINCIPAL_ID&gt;"]
        WA -->|"绑定 MI;通过 MI Client ID 选择身份"| MI
    end
    subgraph ENTRA["Microsoft Entra ID:同一租户"]
        APP["App registration:app-web-auth-example<br/>应用 Client ID:&lt;APP_CLIENT_ID&gt;"]
        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

官方文档与图源

本文由作者按照 CC BY 4.0 进行授权