在Microsoft信息保护SDK的IAuthDelegate中无交互获取令牌问题
Azure函数中使用MIP SDK无交互添加Excel敏感标签解决方案
问题概述
使用Microsoft Information Protection SDK 1.15.86为Excel文件添加敏感标签,POC阶段通过硬编码Web应用令牌+User Assertion流实现功能,但迁移到Azure函数环境后,硬编码方式不可用且无法弹出认证窗口,尝试Client Credential流时出现异常:The service didn’t accept the auth token. Challenge: [‘’] HttpRequest.Id={some-id}, CorrelationId=some-id, CorrelationId.Description=PolicyProfile
核心解决方案:Client Credential流+正确权限配置
Client Credential流是Azure函数无交互场景的标准方案,报错本质是权限或配置缺失,而非流本身问题,以下是具体步骤:
1. 修正Azure AD应用权限配置
- 给已注册的Azure AD应用添加Microsoft Information Protection的应用权限(而非委派权限):
- 权限类型选择「应用权限」
- 添加
Policy.Read.All和Content.Labeling(部分版本需Content.Labeling.All)权限 - 必须点击授予管理员同意,否则权限无法生效
- 若租户有条件访问策略,需将该应用加入允许访问的例外列表,避免被拦截
2. 重构IAuthDelegate的AcquireToken实现
替换原User Assertion逻辑,改用纯Client Credential流:
public string AcquireToken(Identity identity, string authority, string resource, string claims) { // MIP SDK 1.15.x默认resource为"https://aadrm.com",需根据实际环境调整 var targetResource = resource ?? "https://aadrm.com"; var authContext = new AuthenticationContext(authority, new TokenCache()); var clientCredential = new ClientCredential(_applicationClientId, Environment.GetEnvironmentVariable("ClientSecret")); // 建议改为异步实现,避免同步阻塞影响Azure函数性能 var result = authContext.AcquireTokenAsync(targetResource, clientCredential).Result; return result.AccessToken; }
- 异步优化版本:
public async Task<string> AcquireTokenAsync(Identity identity, string authority, string resource, string claims) { var targetResource = resource ?? "https://aadrm.com"; var authContext = new AuthenticationContext(authority, new TokenCache()); var clientCredential = new ClientCredential(_applicationClientId, Environment.GetEnvironmentVariable("ClientSecret")); var result = await authContext.AcquireTokenAsync(targetResource, clientCredential); return result.AccessToken; }
3. 安全增强:使用Azure函数托管身份
替代客户端密钥,用系统分配的托管身份获取令牌,更安全:
public async Task<string> AcquireTokenAsync(Identity identity, string authority, string resource, string claims) { var targetResource = resource ?? "https://aadrm.com"; var tokenProvider = new AzureServiceTokenProvider(); return await tokenProvider.GetAccessTokenAsync(targetResource); }
- 需在Azure函数配置中启用「系统分配托管身份」,并给该身份授予和上述Azure AD应用相同的MIP应用权限
4. MIP SDK初始化注意事项
初始化SDK时需传入应用身份而非用户身份:
var appIdentity = new Identity(_applicationClientId, AuthenticationType.APPLICATION); // 后续用该身份初始化MIP Profile、Engine等组件
错误排查要点
- 解码令牌:用jwt.ms解析获取到的令牌,检查
aud(受众)是否和MIP服务的resource匹配 - 权限验证:确认Azure AD应用的权限已显示「已授予管理员同意」
- 版本兼容:验证1.15.86版本SDK对Client Credential流的支持,若存在版本bug可尝试升级到最新稳定版
内容的提问来源于stack exchange,提问作者Bug Hunter Zoro
相关产品推荐
相关产品推荐

