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

