调用GraphAPI邀请Azure AD B2C用户报已验证域错误如何解决
问题描述
调用Microsoft Graph接口向Azure AD B2C租户写入用户时,执行邀请接口的AddAsync方法抛出如下错误:
This user cannot be invited because the domain of the user's email address is a verified domain of this directory.(无法邀请该用户,原因是用户邮箱地址的域名属于当前目录的已验证域名)
触发报错的代码如下:
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder .Create(_config["ClientId"]) .WithTenantId(_config["TenantId"]) .WithClientSecret(_config["ClientSecret"]) .Build(); ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication); GraphServiceClient graphClient = new GraphServiceClient(authProvider); var invitation = new Invitation { InvitedUserEmailAddress = user.Mail, InvitedUserDisplayName = user.Name + " " + user.Surname, InviteRedirectUrl = "https://redirect.net/", SendInvitationMessage = true }; await graphClient.Invitations .Request() .AddAsync(invitation);
排查确认应用注册的Graph API权限配置全部正确,相同逻辑此前在.NET 3.1环境下可正常运行,迁移到.NET 6环境后稳定复现该报错。
根因说明
graphClient.Invitations对应的/invitations端点是Azure AD B2B协作场景专用接口,作用是邀请组织外部的来宾用户访问租户资源,接口规则本身就禁止邀请邮箱后缀属于当前租户已验证域名的账号——这类账号属于租户原生本地用户范畴,不属于外部来宾,无法通过邀请流程创建。- 该报错和.NET运行时版本无直接关联:.NET 3.1环境下代码可正常运行,是因为当时引用的低版本Microsoft Graph SDK对接的Graph API尚未全量上线域名校验逻辑,后续Graph API服务端收紧了校验规则,无论使用何种SDK版本、何种运行时,调用该接口传入同租户已验证域名后缀的邮箱都会触发该错误。
- Azure AD B2C的用户生命周期管理逻辑和标准Azure AD租户存在差异,不能直接套用B2B外部用户邀请逻辑处理B2C本地用户创建。
修复方案
根据实际业务场景选择对应处理方式即可:
方案1:创建B2C租户本地账号(邮箱后缀为租户已验证域名)
替换原有邀请逻辑,直接调用用户创建端点生成本地账号,参考代码如下:
var newB2cUser = new User { DisplayName = $"{user.Name} {user.Surname}", GivenName = user.Name, Surname = user.Surname, Mail = user.Mail, // 配置登录标识,B2C本地邮箱账号必填 Identities = new List<ObjectIdentity> { new ObjectIdentity { SignInType = "emailAddress", Issuer = _config["TenantId"], // 填写B2C租户ID,若使用自定义域名作为登录颁发者则替换为对应自定义域名 IssuerAssignedId = user.Mail } }, // 配置初始密码策略 PasswordProfile = new PasswordProfile { Password = Guid.NewGuid().ToString("N").Substring(0,12) + "Aa!", // 生成符合复杂度要求的随机初始密码 ForceChangePasswordNextSignIn = true // 首次登录强制修改密码,符合安全要求 }, PasswordPolicies = "DisablePasswordExpiration" }; // 调用用户创建接口替换原有邀请逻辑 await graphClient.Users .Request() .AddAsync(newB2cUser);
前置要求:给对应的应用注册授予User.ReadWrite.All应用权限,并完成管理员授权同意。
方案2:确实需要邀请外部来宾用户(邮箱后缀不属于租户已验证域名)
检查传入的InvitedUserEmailAddress参数值,确认邮箱后缀未被添加到当前B2C租户的已验证域名列表即可,原有邀请逻辑无需调整。
内容的提问来源于stack exchange,提问作者anthino12
相关产品推荐
相关产品推荐

