通过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
相关产品推荐
相关产品推荐

