.NET Core 控制台应用程序中以编程方式新建 AzureRmRoleAssignment

New-AzureRmRoleAssignment programmatically in a .NET Core console application

看来我 首先以编程方式创建 Azure 应用程序,然后使用 Azure 管理 APIs 来创建一些资源。我想从社区中询问一个新问题,如何使用 HttpClient(或使用 Microsoft Graph API 具有确切所需权限的一些更智能的方法来基本上执行 PowerShell 命令 New-AzureRmRoleAssignment -RoleDefinitionName Owner -ServicePrincipalName $adApp.ApplicationId.Guid图书馆)。

这次想成为一个更好的人(更多地参与,提供代码),我 prepared a repo in GH, but the issue basically boils down to what kind of a URI should be used (here)。代码是

var roleAssignment = $"{{something here}}";
var roleAssignementContent = new StringContent(roleAssignment, Encoding.UTF8, "application/json");
var roleAssignmentResponse = await client.PostAsync($"https://graph.windows.net/{tenants.value[0].tenantId}/applications/{createdApplication.appId}?api-version=1.6", roleAssignementContent).ConfigureAwait(false);
var roleAssignement = await roleAssignmentResponse.Content.ReadAsStringAsync().ConfigureAwait(false);

我摆弄 Graph API Explorer too if things were easier using it (or the libraries) but with less luck. Indeed, the ultimate goal is to create application programmatically so that it becomes possible to use Azure Management Libraries 进行部署。也就是说,从头到尾都是代码。

(另外,代码是一次性的,仅提供一个更实用的示例。)

New-AzureRmRoleAssignment 用于将指定的 RBAC 角色分配给指定的服务主体,您可以使用 Resource Manager create role assignment API:

  1. 获取应用程序服务主体的 ObjectId。

    如果您之前已经获得了应用程序服务主体的objectId,则可以跳过此步骤。如果没有,您可以使用Azure ad graph api通过应用程序ID请求应用程序的服务主体:

    GET https://graph.windows.net/<TenantID>/servicePrincipals?$filter=servicePrincipalNames/any(c:%20c%20eq%20'applicationID')&api-version=1.6 
    
    Authorization: Bearer eyJ0eXAiOiJK*****-kKorR-pg
    
  2. 获取 Azure RBAC 角色标识符

    要将适当的 RBAC 角色分配给您的服务主体,您必须知道 Azure RBAC 角色的标识符(在您的方案中为所有者),您可以调用 Resource Manager role definition API 列出所有 Azure RBAC 角色并搜索然后迭代结果以按名称找到所需的角色定义。:

    GET https://management.azure.com/subscriptions/ed0caab7-c6d4-45e9-9289-c7e5997c9241/providers/Microsoft.Authorization/roleDefinitions?$filter=roleName%20eq%20'Owner'&api-version=2015-07-01
    
    Authorization: Bearer 
    
  3. 为服务主体分配适当的 RBAC 角色:

    PUT https://management.azure.com/subscriptions/ed0caab7-c6d4-45e9-9289-c7e5997c9241/providers/Microsoft.Authorization/roleAssignments/16fca587-013e-45f2-a03c-cfc9899a6ced?api-version=2015-07-01 
    
    Authorization: Bearer eyJ0eXAiOiJKV1QiL*****FlwO1mM7Cw6JWtfY2lGc5
    Content-Type: application/json
    
    {
     "properties": {
       "roleDefinitionId": "/subscriptions/XXXXXXXXXXXXXXX/providers/Microsoft.Authorization/roleDefinitions/XXXXXXXXXXXXXXXXX",
       "principalId": "XXXXXXXXXXXXXXXXXXXXX"
       }
    }
    

    roleDefinitionId是第2步得到的id,principalId是第1步得到的objectId。 ed0caab7-c6d4-45e9-9289-c7e5997c9241 是订阅 ID,16fca587-013e-45f2-a03c-cfc9899a6ced 是为新角色分配创建的新 GUID。

详情请参考以下文档:

Use Resource Manager authentication API to access subscriptions