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

如何通过Microsoft Graph代码兑换Azure AD来宾邀请?

问题

我需要将数据库中已完成邮箱验证的用户邀请为Azure Active Directory(Azure AD)来宾,使其能通过Azure Communication Services在Teams中聊天。我编写了以下代码创建邀请:

var invitation = new Invitation
{
    InvitedUserEmailAddress = userModel.Email,
    InvitedUser = new User
    {
        GivenName = userModel.Firstname,
        Surname = userModel.Lastname,
        DisplayName = $"{userModel.Firstname} {userModel.Lastname}",
        Mail = userModel.Email,
        UserType = "Guest", // Member
        OtherMails = new List<string> { userModel.Email },
        Identities = new List<ObjectIdentity>
        {
            new ObjectIdentity
            {
                SignInType = "emailAddress",
                Issuer = "Unknow",
                IssuerAssignedId = userModel.Email
            },
        },
        PasswordPolicies = "DisablePasswordExpiration"
    },
    SendInvitationMessage = false,
    InviteRedirectUrl = redirectUrl.ToString(),
    InvitedUserType = "guest" // default is guest,member
};
var invite = await Client.Invitations.PostAsync(invitation);

起初我以为调用Microsoft返回的redeemUrl即可完成兑换:

await _httpClient.GetAsync(invite.InviteRedeemUrl)

虽然返回200状态码,但用户仍处于待处理状态。请问如何通过Microsoft Graph代码完成邀请兑换?

解决方案

为什么直接GET InviteRedeemUrl无效

InviteRedeemUrl是供用户手动访问的前端页面链接,用于引导用户完成身份验证、同意条款(如果需要)或设置密码等交互操作。直接用后台HTTP GET请求只会获取页面内容,无法触发实际的兑换流程,因此用户状态仍会停留在待处理。

可行的处理方式

1. 引导用户手动完成兑换(推荐)

这是Azure AD来宾邀请的标准流程:

  • 调整邀请代码,开启SendInvitationMessage = true,让Azure AD自动发送包含兑换链接的邮件给目标用户,用户点击链接后即可完成兑换。
  • 简化后的邀请代码(去掉不必要的参数):
var invitation = new Invitation
{
    InvitedUserEmailAddress = userModel.Email,
    InvitedUser = new User
    {
        GivenName = userModel.Firstname,
        Surname = userModel.Lastname,
        DisplayName = $"{userModel.Firstname} {userModel.Lastname}",
        UserType = "Guest"
    },
    SendInvitationMessage = true,
    InviteRedirectUrl = redirectUrl.ToString(), // 用户完成兑换后跳转的页面
    InvitedUserType = "guest"
};
var invite = await Client.Invitations.PostAsync(invitation);

2. 直接创建来宾用户(无需邀请流程)

如果来宾用户的邮箱域名属于已与你的Azure AD建立联合身份验证的租户(比如对方也是Azure AD租户),可以跳过邀请流程,直接创建来宾用户:

var guestUser = new User
{
    AccountEnabled = true,
    GivenName = userModel.Firstname,
    Surname = userModel.Lastname,
    DisplayName = $"{userModel.Firstname} {userModel.Lastname}",
    UserType = "Guest",
    Mail = userModel.Email,
    Identities = new List<ObjectIdentity>
    {
        new ObjectIdentity
        {
            SignInType = "emailAddress",
            Issuer = userModel.Email.Split('@')[1], // 来宾用户的邮箱域名,需为已验证或联合身份域名
            IssuerAssignedId = userModel.Email
        }
    }
};
var createdUser = await Client.Users.PostAsync(guestUser);

这种方式下用户会直接被添加为来宾,无需兑换步骤。

3. 后台自动兑换的限制

对于外部非Azure AD租户的用户,无法通过纯后台代码完成兑换,因为必须用户参与身份验证(比如验证邮箱所有权、设置密码),这是Azure AD的安全机制要求。

内容的提问来源于stack exchange,提问作者Cedric Arnould

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:24:58