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

如何用C#在Microsoft Entra ID创建应用注册并配置权限及解决Azure部署问题

解决Azure App Service中PowerShell脚本执行问题及C#程序化创建Entra ID应用注册方案

一、Azure App Service中PowerShell脚本无法执行的解决办法

  • 调整认证方式:
    本地执行依赖个人账号权限,部署到App Service后需改用**托管标识(Managed Identity)**认证,修改脚本开头:

    # 使用App Service托管标识登录Azure
    Connect-AzAccount -Identity
    

    同时给App Service的托管标识分配应用程序管理员或所需的Entra ID权限(如Application.ReadWrite.All)。

  • 确保Az模块可用性:
    Windows App Service默认预装Az模块,若版本不符可在脚本中指定安装:

    Install-Module -Name Az.Resources -Force -AllowClobber -Scope CurrentUser
    

    Linux App Service需确保容器中已预装PowerShell和Az模块,可通过自定义启动脚本或镜像配置。

  • 规避沙盒限制:
    避免脚本涉及本地文件写入等沙盒禁止操作,所有Az命令通过Azure API调用完成。

二、C#程序化创建Entra ID应用注册、权限及所有者(基于Microsoft Graph SDK)

使用Microsoft Graph SDK是官方推荐的程序化操作Entra ID方案,无需依赖PowerShell环境,更适配Web应用场景。

前置准备

  1. 给Web应用的托管标识(或服务主体)分配Application.ReadWrite.All和Directory.ReadWrite.All权限(按需调整)。
  2. 安装NuGet包:
    Install-Package Microsoft.Graph
    Install-Package Azure.Identity
    

代码示例

1. 创建应用注册及服务主体

using Microsoft.Graph;
using Azure.Identity;
using Microsoft.Graph.Models;

var tenantId = "你的租户ID";
var managedIdentityClientId = "Web应用的用户分配标识ID"; // 系统分配标识可省略此参数

// 初始化Graph客户端(使用托管标识认证)
var graphClient = new GraphServiceClient(new DefaultAzureCredential(new DefaultAzureCredentialOptions
{
    TenantId = tenantId,
    ManagedIdentityClientId = managedIdentityClientId
}));

// 构建应用注册参数
var appName = $"{PartnerName}{PartnerAppSuffix}";
var redirectUris = new List<string> { $"https://mscloud.onmicrosoft.com/{appName}" };
var identifierUris = new List<string> { $"https://mscloud.onmicrosoft.com/{appName}" };

// 创建应用注册
var newApp = new Application
{
    DisplayName = appName,
    ReplyUrls = redirectUris,
    Homepage = $"https://mscloud.onmicrosoft.com/{appName}",
    IdentifierUris = identifierUris,
    Web = new WebApplication
    {
        ImplicitGrantSettings = new ImplicitGrantSettings
        {
            EnableAccessTokenIssuance = true,
            EnableIdTokenIssuance = true
        }
    }
};

var createdApp = await graphClient.Applications.PostAsync(newApp);

// 创建对应服务主体
var newServicePrincipal = new ServicePrincipal
{
    AppId = createdApp.AppId,
    DisplayName = appName
};

var createdSp = await graphClient.ServicePrincipals.PostAsync(newServicePrincipal);

2. 添加应用权限(以Microsoft Graph的User.Read.All应用权限为例)

// 获取Microsoft Graph服务主体ID
var graphSpResponse = await graphClient.ServicePrincipals.GetAsync(request =>
{
    request.QueryParameters.Filter = "appId eq '00000003-0000-0000-c000-000000000000'"; // Microsoft Graph固定AppId
});
var graphSpId = graphSpResponse.Value.First().Id;

// 获取目标权限的ID
var targetAppRole = graphSpResponse.Value.First()
    .AppRoles.First(r => r.Value == "User.Read.All" && r.AllowedMemberTypes.Contains("Application"));

// 创建权限分配
var appRoleAssignment = new AppRoleAssignment
{
    PrincipalId = Guid.Parse(createdSp.Id),
    ResourceId = Guid.Parse(graphSpId),
    AppRoleId = targetAppRole.Id
};

await graphClient.ServicePrincipals[createdSp.Id].AppRoleAssignments.PostAsync(appRoleAssignment);

3. 添加应用注册所有者(以用户为例)

var targetUserId = "目标用户的ObjectID";
await graphClient.Applications[createdApp.Id].Owners.Ref.PostAsync(new ReferenceCreate
{
    OdataId = $"https://graph.microsoft.com/v1.0/users/{targetUserId}"
});

说明

  • 所有操作通过Microsoft Graph API完成,规避App Service沙盒限制,稳定性更高。
  • 遵循最小权限原则,根据实际需求调整权限范围,避免过度授权。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:57:30