C# MSAL库能否基于Workload identity federation创建ConfidentialClient
C# MSAL 工作负载身份联合 ConfidentialClient 配置方案
核心结论
C# 版本的 MSAL 库(Microsoft.Identity.Client 包 4.44.0 及以上稳定版)完全支持通过工作负载身份联合创建 ConfidentialClient 应用,可完全替代密钥、证书验证方式,适配 GitHub Actions 无密钥运行集成测试的场景。
该能力没有单独命名为工作负载身份联合的专属配置项,而是封装在客户端断言配置逻辑中,所以容易被忽略。
实现步骤
1. 前置依赖
- 提前在 Azure AD 应用注册中配置好对应 GitHub Actions 环境的联合身份凭据,完成信任关系配置
- 安装符合版本要求的 MSAL NuGet 包:
Install-Package Microsoft.Identity.Client -Version 4.56.0
2. 代码实现
GitHub Actions 开启 OIDC 权限后,运行时会自动注入可用于身份联合的 OIDC 断言令牌,直接调用 MSAL 的 WithClientAssertion 方法传入该断言即可:
using Microsoft.Identity.Client; // 从GitHub Actions运行时环境变量中获取OIDC断言令牌 string fedratedAssertion = Environment.GetEnvironmentVariable("<配置的断言环境变量名>"); // 构建无需密钥/证书的ConfidentialClient var confidentialClient = ConfidentialClientApplicationBuilder .Create("<你的Azure AD应用客户端ID>") .WithTenantId("<你的Azure AD租户ID>") // 传入工作负载身份联合断言替代密钥/证书 .WithClientAssertion(fedratedAssertion) .Build(); // 后续获取访问令牌的逻辑和原有密钥/证书模式完全一致 var tokenResult = await confidentialClient .AcquireTokenForClient(new[] { "<你要访问的API的作用域>" }) .ExecuteAsync();
3. GitHub Actions 配置调整
需要在 workflow 文件中开启 ID 令牌读写权限,才能在运行时获取到联合身份需要的断言:
jobs: integration-test: runs-on: ubuntu-latest permissions: id-token: write # 必须开启,用于生成OIDC身份断言 contents: read steps: # 你的其他步骤,比如签出代码、构建、运行测试等
补充说明
如果你同时使用 Azure 相关资源的 SDK,也可以直接使用 Azure.Identity 库的 DefaultAzureCredential,它会自动读取 GitHub Actions 的 OIDC 断言完成身份验证,无需手动配置 MSAL 客户端。
内容的提问来源于stack exchange,提问作者Tom De Vree
相关产品推荐
相关产品推荐

