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

如何通过编程修改Azure App Service应用的系统分配ID?

关于Azure租户/订阅迁移后系统分配ID重置的批量处理问题

我们正在进行Azure租户/订阅迁移,迁移后所有现有系统分配ID都会丢失,需要手动更新所有相关配置。比如应用配置指向Key Vault机密时,Key Vault是基于应用的系统分配ID授权访问的,迁移后该授权会失效,必须重新配置才能恢复访问。但因为实例数量太多,手动操作耗时极长。

想问两个问题:

  1. 有没有人遇到过这类问题?
  2. 能不能通过编程修改系统分配ID?

目前我在.NET7控制台应用里尝试实现,但找不到访问Web应用ID设置的方法,查SDK文档、问大模型都没结果。我已经能访问App Service Plan,但没法获取其中的应用,也不确定找到应用后能不能修改系统分配ID设置。现有代码如下:

// Sign into Azure
ArmClient armClient = new ArmClient(credential, subscriptionId);

// Verify a successful login by retrieving the subscription
var loginSuccess = await armClient.GetDefaultSubscription().GetAsync();

SubscriptionResource subscription = await armClient.GetDefaultSubscriptionAsync();
ResourceGroupCollection resourceGroups = subscription.GetResourceGroups();
ResourceGroupResource resourceGroup = await resourceGroups.GetAsync(resourceGroupName);

await foreach(AppServicePlanResource appServicePlan in resourceGroup.GetAppServicePlans()) 
{
    foreach() // I want to get into the app here but I can't seem to find it. 
}

获取App Service Plan关联的Web应用

要获取绑定到指定App Service Plan的Web应用,需从资源组级别获取所有Web应用资源,再通过ServerFarmId属性筛选关联目标计划的实例。修改后的代码如下:

// 从资源组获取所有Web应用
await foreach (WebSiteResource webApp in resourceGroup.GetWebSites())
{
    // 获取应用的服务计划ID
    var serverFarmId = webApp.Data.ServerFarmId;
    // 对比当前遍历的App Service Plan ID
    if (serverFarmId == appServicePlan.Id)
    {
        // 找到关联的Web应用,后续处理逻辑写在这里
        Console.WriteLine($"找到关联应用:{webApp.Name}");
    }
}

系统分配ID的修改限制

系统分配的托管身份ID由Azure自动生成,无法直接修改。这类身份与应用所在的订阅/租户强绑定,租户/订阅迁移后,原身份会被销毁,新的系统分配身份会自动生成(或需手动启用),对应的ID也会完全不同。

批量恢复配置的可行方案

既然无法保留原ID,建议通过以下步骤批量处理:

  1. 批量启用系统分配身份:迁移后的Web应用可能需要重新开启系统分配身份,可通过SDK自动完成
  2. 批量获取新身份ID:获取每个应用新的系统分配身份ID
  3. 批量更新Key Vault访问策略:为新ID添加对应的机密读取权限
  4. 验证应用配置:确保应用配置中的Key Vault引用能正常访问

示例代码:启用系统分配身份并获取新ID

// 启用系统分配身份
var identityPatch = new WebSitePatch();
identityPatch.Identity = new ManagedServiceIdentity()
{
    Type = ManagedServiceIdentityType.SystemAssigned
};

await webApp.UpdateAsync(WaitUntil.Completed, identityPatch);

// 获取更新后的身份ID
await webApp.RefreshAsync();
var newSystemAssignedId = webApp.Data.Identity?.PrincipalId;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:29