如何将 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 机密的角色分配,因此我选择了保管库作为范围。
应用需要列出给定资源的 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 机密的角色分配,因此我选择了保管库作为范围。