C# Azure AD Graph API使用Open Extensions设置用户自定义属性报错求助
问题排查与解决方案
触发错误的常见原因及对应修复方案
- ExtensionName 命名不符合要求
OpenTypeExtension的ExtensionName必须使用你的Azure AD租户下已完成验证的域名的反向格式,你当前使用的com.test.test如果不是租户已验证的域名,就会直接触发属性无效错误。你可以进入Azure AD门户的「自定义域名」页面,查看租户下的已验证域名,替换为对应反向格式即可,比如你的租户验证域名是yourcompany.com,扩展名称就可以设置为com.yourcompany.userattr。 - 新建用户存在同步延迟
你创建用户后立刻调用添加扩展的接口,此时AAD的用户对象可能还未完成全局同步,直接操作扩展属性就会报错。你可以在两个操作之间添加短暂延迟,或者加入指数退避重试逻辑:
int retryCount = 0; while (retryCount < 3) { try { await graphServiceClient .Users[id] .Extensions .Request() .AddAsync(extension); break; } catch (ServiceException ex) when (ex.Message.Contains("One or more properties contains invalid values") && retryCount < 3) { retryCount++; await Task.Delay(1000 * retryCount); } }
- Graph API 权限配置错误
确认你的应用注册中已经分配了以下权限之一,且已经授予了租户级管理员同意:- 委托权限:
User.ReadWrite.All、Directory.AccessAsUser.All - 应用权限:
User.ReadWrite.All、Directory.ReadWrite.All
- 委托权限:
- 同名扩展已存在于该用户
如果之前已经给这个用户添加过同名的OpenTypeExtension,再次调用新增接口会报错。此时你需要先查询用户的现有扩展,存在的话调用更新接口即可:
// 先查询是否已存在对应扩展 var existingExt = await graphServiceClient .Users[id] .Extensions["替换为你的合法扩展名称"] .Request() .GetAsync(); if (existingExt != null) { // 执行更新逻辑 var updateExt = new OpenTypeExtension { AdditionalData = new Dictionary<string, object> { {"NewAttribute1", "Batman"}, {"NewAttribute2" , "Spiderman"} } }; await graphServiceClient .Users[id] .Extensions["替换为你的合法扩展名称"] .Request() .UpdateAsync(updateExt); }
内容的提问来源于stack exchange,提问作者user11718626
相关产品推荐
相关产品推荐

