如何在Azure AD/企业应用中创建外部用户(.NET Core+Graph场景)
解决方案:Azure AD企业应用添加特定外部用户并集成.NET Core Identity Web
一、直接添加外部用户到企业应用的实现思路
首先明确:Azure AD企业应用本身无法直接创建外部用户,外部用户必须先存在于你的租户Azure AD中(作为外部来宾用户),才能分配到企业应用。但你可以跳过手动邀请流程,通过Microsoft Graph API自动化完成用户创建与角色分配。
替代邀请流程的自动化方案
无需手动发送邀请邮件,直接调用Microsoft Graph的invitations API创建外部来宾用户,同时完成应用角色分配:
获取必要的Graph API权限
你的应用注册需添加以下应用权限(需租户管理员同意):User.Invite.All:创建外部来宾用户AppRoleAssignment.ReadWrite.All:为用户分配应用角色Directory.Read.All:读取租户目录基础信息
C#代码示例(使用Microsoft Graph SDK)
var graphClient = new GraphServiceClient(new DefaultAzureCredential()); // 创建外部来宾用户,关闭邀请邮件发送 var invitation = new Invitation { InvitedUserEmailAddress = "external.user@othertenant.com", InviteRedirectUrl = "https://yourapp.com/signin-oidc", SendInvitationMessage = false, InvitedUserType = "Guest" }; var createdInvitation = await graphClient.Invitations.PostAsync(invitation); var guestUserId = createdInvitation.InvitedUser.Id; // 获取企业应用的服务主体ID var servicePrincipal = await graphClient.ServicePrincipals .GetAsync(request => { request.QueryParameters.Filter = "displayName eq '你的企业应用名称'"; }); var appServicePrincipalId = servicePrincipal.Value.First().Id; // 分配应用角色(需提前在应用注册中定义角色并获取角色ID) var appRoleAssignment = new AppRoleAssignment { PrincipalId = Guid.Parse(guestUserId), ResourceId = Guid.Parse(appServicePrincipalId), AppRoleId = Guid.Parse("你的应用角色ID") }; await graphClient.Users[guestUserId].AppRoleAssignments.PostAsync(appRoleAssignment);执行后,外部用户会直接出现在你的租户Azure AD中,且已绑定应用角色,首次登录时通过自身组织的Azure AD认证即可访问应用。
二、限制仅特定外部用户登录
要避免整个外部组织访问,需在企业应用中配置两项关键设置:
- 进入Azure门户 → 企业应用 → 你的应用 → 用户和组:确保仅添加了上述创建的特定外部用户
- 进入属性 → 将用户分配要求设为"需要":未被分配的外部用户即使拥有同租户账号,也无法访问你的应用
三、关于Identity Web的架构方向
你的选择完全正确:Microsoft Identity Web是当前.NET Core集成Azure AD认证与Microsoft Graph的官方推荐方案,它封装了OIDC、Azure AD身份验证、Graph调用的复杂逻辑,大幅简化代码开发,符合云原生架构设计。
集成Identity Web的核心步骤
- 安装NuGet包:
Microsoft.Identity.Web和Microsoft.Identity.Web.MicrosoftGraph - 在
Program.cs中配置认证与Graph服务:builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph")) .AddInMemoryTokenCaches(); - 在
appsettings.json中配置基础信息:"AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "yourtenant.onmicrosoft.com", "TenantId": "你的租户ID", "ClientId": "你的应用注册ID", "CallbackPath": "/signin-oidc" }, "MicrosoftGraph": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": "user.read mail.read" }
四、关于全局AD添加外部用户的误区
你的判断准确:不要在本地全局Active Directory中添加外部用户,这会混淆本地与云身份体系,增加管理复杂度,违背云原生架构的设计逻辑。所有外部用户应统一管理在Azure AD租户中,通过云身份认证访问应用。
内容的提问来源于stack exchange,提问作者Andrew Casey
相关产品推荐
相关产品推荐

