如何将 RBAC for ARM 分配给托管标识

How to assign RBAC for ARM to Managed Identity

应用需要列出给定资源的 RBAC 角色分配。这在本地使用我自己的凭据 (AzureCliCredential) 有效,但在使用 ManagedIdentityCredential 部署在 Azure 中时无效。我想这是因为我是订阅所有者。

如何授权 MSI 对 ARM 本身具有 read/list 权限?

使用了以下代码。

    public static async Task<RoleAssignmentsResult> GetRoleAssignmentsFor(string resource)
    {
        const string VERSION = "2018-01-01-preview";
        string url = $"https://management.azure.com/{resource}/providers/Microsoft.Authorization/roleAssignments?$filter=atScope()&api-version={VERSION}";
        Stream respBody = await _request(url);
        var result = await JsonSerializer.DeserializeAsync<RoleAssignmentsResult>(respBody);
        return result;
    }

    private static async Task<Stream> _request(string url)
    {
        HttpRequestMessage req = new(HttpMethod.Get, new Uri(url));
        
        string[] scopes = { "https://management.azure.com" };
        ManagedIdentityCredential cred = new();
        TokenRequestContext ctx = new(scopes);
        return await cred.GetTokenAsync(ctx);

        req.Headers.Authorization = new AuthenticationHeaderValue("Bearer", jwt.Token);
        HttpResponseMessage res = await new HttpClient.SendAsync(req);
        return await res.Content.ReadAsStreamAsync();
    }

谢谢@juunas。正如您在问题的评论中所建议的那样,将资源的 Reader 角色分配给 MSI 就可以了。由于我有兴趣列出各个 KeyVault 机密的角色分配,因此我选择了保管库作为范围。