You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:53:13