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

如何在Azure AD/企业应用中创建外部用户(.NET Core+Graph场景)

解决方案:Azure AD企业应用添加特定外部用户并集成.NET Core Identity Web

一、直接添加外部用户到企业应用的实现思路

首先明确:Azure AD企业应用本身无法直接创建外部用户,外部用户必须先存在于你的租户Azure AD中(作为外部来宾用户),才能分配到企业应用。但你可以跳过手动邀请流程,通过Microsoft Graph API自动化完成用户创建与角色分配。

替代邀请流程的自动化方案

无需手动发送邀请邮件,直接调用Microsoft Graph的invitations API创建外部来宾用户,同时完成应用角色分配:

  1. 获取必要的Graph API权限
    你的应用注册需添加以下应用权限(需租户管理员同意):

    • User.Invite.All:创建外部来宾用户
    • AppRoleAssignment.ReadWrite.All:为用户分配应用角色
    • Directory.Read.All:读取租户目录基础信息
  2. 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的核心步骤

  1. 安装NuGet包:Microsoft.Identity.Web 和 Microsoft.Identity.Web.MicrosoftGraph
  2. 在Program.cs中配置认证与Graph服务:
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
        .AddInMemoryTokenCaches();
    
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:27:24