Вся эта предпосылка неверна. GraphClient
не является подходящим клиентом для управления такими полномочиями. Соответствующая библиотека API для этого - Microsoft.Azure.Management.Authorization
и класс AuthorizationManagementClient
.
Я выложу дополнительные примечания о фактической последовательности вызовов.
*** Обновление ***********
Как и было обещано, вот пример кода:
public static async Task<IServicePrincipal> GetServicePrincipalAsync(string accessToken, string tenantId, string clientId)
{
var graphClient = NewActiveDirectoryClient(accessToken, tenantId);
var matches = await graphClient.ServicePrincipals.Where(sp => sp.AppId == clientId).ExecuteAsync();
return matches.CurrentPage.ToList().FirstOrDefault();
}
private static ActiveDirectoryClient NewActiveDirectoryClient(string accessToken, string tenantId)
{
TaskCompletionSource<string> tcs = new TaskCompletionSource<string>();
tcs.SetResult(accessToken);
return new ActiveDirectoryClient(
new Uri($"{GraphApiBaseUrl}{tenantId}"),
async() => { return await tcs.Task; });
}
Прежде всего, необходимо получить ObjectId доверителя вы хотите Добавить. В случае ServicePricipal у меня есть функция, которая получает ее из каталога, например:
Затем, используя это и область («/ subscriptions/{my_subscription_id}», для всей подписки), вы можете создать RoleAssignment:
public static async Task AssignRoleToPrincipalAsync(
string accessToken,
string subscriptionId,
string scope,
string roleName,
string principalObjectId)
{
using (var client = NewAuthorizationManagementClient(accessToken, subscriptionId))
{
RoleDefinition roleDef = (await FindRoleDefinitionAsync(accessToken, subscriptionId, scope, roleName)).FirstOrDefault();
if (roleDef == null)
throw new Exception($"Role was not found: {roleName}");
var props = new RoleAssignmentProperties()
{
PrincipalId = principalObjectId,
RoleDefinitionId = roleDef.Id
};
await client.RoleAssignments.CreateAsync(scope, Guid.NewGuid().ToString("N"), props);
}
}
private static AuthorizationManagementClient NewAuthorizationManagementClient(string accessToken, string subscriptionId)
{
return new AuthorizationManagementClient(new TokenCredentials(accessToken)) { SubscriptionId = subscriptionId};
}
Что вы делали до сих пор? –
Спасибо за редактирование Philippe. Ниже Powershell команда выполняет задание: 'New-AzureRmRoleAssignment -RoleDefinitionName чтение -ServicePrincipalName $ azureAdApplication.ApplicationId.Guid' Однако, использующая старые вызовы управления стилем. Я не могу придумать сопоставление вызовов старого стиля к новым вызовам управления ресурсами –