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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 21:57:22