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

通过Graph API添加Decisions Teams应用报错:onBehalfOfUserMri不能为空

关于Teams应用安装时onBehalfOfUserMri参数的问题解析

参数含义

onBehalfOfUserMri是MS Graph API安装特定Teams应用时要求的参数,它代表代表其安装应用的用户的Microsoft Remote Identifier(MRI),本质是用户的唯一标识符(通常为用户Object ID对应的8:<object-id>格式,或可直接传入用户主体名称UPN,Graph会自动解析)。这个参数主要针对依赖用户权限、上下文的第三方应用(比如你提到的app.boarddecisions.com),即使源团队克隆时未显式体现该属性,目标团队安装这类应用时会触发该校验。

解决方法:在请求中传递该参数

你需要在TeamsAppInstallation的AdditionalData字典中添加onBehalfOfUserMri字段,传入目标团队中具备应用安装权限的用户(如团队所有者、管理员)的MRI。

修改后的代码示例:

// 替换为实际的用户Object ID或用户主体名称(UPN)
string authorizedUserId = "your-team-owner-object-id-or-upn";
// 转换为标准MRI格式(若传入UPN可省略此步,Graph会自动处理)
string userMri = $"8:{authorizedUserId}";

var teamsAppInstallation = new TeamsAppInstallation
{
    AdditionalData = new Dictionary<string, object>()
    {
        {"teamsApp@odata.bind",$"https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/{appId}"},
        {"onBehalfOfUserMri", userMri}
    }
};

try
{
    await retry.ExecuteAsync(async () =>
    {
        await graphClient.Teams[newTeamId].InstalledApps
        .Request()
        .AddAsync(teamsAppInstallation);
    });
}
catch(ServiceException ex)
{
    if ((int)ex.StatusCode == 409)
    {
        logger?.LogInformation($"App already installed, skipping...{appId}. {newTeamId}");
    }
    else
    {
        logger?.LogError($"Error installing app: {appId}. {newTeamId} {ex.Message}");
        throw ex;
    }
}

补充说明

  • 若你的应用是租户级全局应用且不依赖用户上下文,理论上可跳过该参数,但部分第三方应用会强制校验,此时必须传入合规的用户MRI。
  • 可通过Graph API获取目标团队的所有者ID,再转换为MRI格式传入,确保权限合法。

内容的提问来源于stack exchange,提问作者Jussi Palo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 08:03:23