В настоящее время я могу управлять ресурсами нескольких клиентов Azure AD с помощью Azure Resource Manager через PowerShell (идентификатор клиента 1950a258-227b-4e31-a9cf-717495945fc2), используя делегированные разрешения с учетной записью пользователя, имеющего повышенные привилегии как в Azure AD, так и во всехсоответствующие подписки.Т.е. у SubscriptionClient
, вошедшего в систему с этим пользователем, есть метод SubscriptionClient.tenants.List()
, который будет перечислять несколько арендаторов, если у меня будет доступ к подпискам в разных арендаторах, как у этого пользователя.
Я пишу автоматизацию между арендаторамии я пытаюсь сделать так, чтобы функция .NET в Azure выполняла вышеупомянутое, не делегируя ей разрешения от какой-либо учетной записи бога между пользователями (в качестве учетной записи старой школы).Вместо этого я хочу дать самой функции разрешения.
Первая попытка - с использованием MSI:
Я решил на самом деле заставить принцип обслуживания существовать в неРодной клиент принципа обслуживания должен использовать (новые строки для удобства чтения):
https://login.microsoftonline.com/{Target_foreign_tenant}/adminconsent
?client_id={id_of_msi}
&redirect_uri=http://localhost/myapp/permissions
Используя учетную запись администратора и принять разрешения.Проблема здесь в том, что для работы MSI нужны разрешения API Graph.Затем я попытался:
New-AzureADServiceAppRoleAssignment `#`
-ObjectId {object_id_of_msi} `#`
-PrincipalId {object_id_of_msi} `#`
-ResourceId {object_id_of_graph_SP} `#`
-Id {permissions_id_of_relevant_graph_role}
Приведенная выше команда, запущенная с глобальными правами администратора для субъекта службы MSI, выдает ошибку «Недостаточно прав», показанную ниже.(Обратите внимание, что для субъекта-службы регистрации приложения это работает нормально, никаких привилегий не возникает.)
New-AzureADServiceAppRoleAssignment : Error occurred while executing NewServicePrincipalAppRoleAssignment
Code: Authorization_RequestDenied
Message: Insufficient privileges to complete the operation.
HttpStatusCode: Forbidden
HttpStatusDescription: Forbidden
HttpResponseStatus: Completed
At line:1 char:1
+ New-AzureADServiceAppRoleAssignment -Id {where id would be here}
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [New-AzureADServiceAppRoleAssignment], ApiException
+ FullyQualifiedErrorId : Microsoft.Open.AzureAD16.Client.ApiException,Microsoft.Open.AzureAD16.PowerShell.NewServicePrincipalAppRoleAssignment
Я был следующим: MSI Permissions для Graph API
Итак, я отказался от MSI и решил вместо этого использовать регистрацию приложения с поддержкой нескольких клиентов.Я снова использовал:
https://login.microsoftonline.com/{Target_forgien_ADTenant}/adminconsent
?client_id={id_of_webappreg}
&redirect_uri=http://localhost/myapp/permissions
С успехом!Теперь я мог видеть в своем иностранном арендаторе мою регистрацию приложений в разделе «Корпоративные приложения», а также запрашивать у внешнего арендатора Azure AD и видеть принципала службы - ура!
Затем я с радостью назначил привилегии владельца своего корпоративного приложенияподписка в моем иностранном арендаторе, и запустил мою функцию, которая перечисляет арендаторов и подписки, используя API в верхней части.К сожалению, он может видеть подписки только в своем домашнем клиенте, в отличие от пользователя.
Любая помощь о том, как заставить работать любой из этих подходов?Моя функция выглядит так:
public static async Task<SubscriptionClient> GetSubscriptionClient(string clientID, string clientSecret, string tenantName)
{
var serviceCreds = new TokenCredentials(await GetRMAccessToken(clientID, clientSecret, tenantName).ConfigureAwait(false));
return new SubscriptionClient(serviceCreds);
}
public static async Task<string> GetRMAccessToken(string clientID, string clientSecret, string tenantName)
{
var authString = "https://login.microsoftonline.com/" + tenantName;
var resourceUrl = "https://management.azure.com/";
var authenticationContext = new AuthenticationContext(authString, false);
var clientCred = new ClientCredential(clientID, clientSecret);
var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, clientCred);
var token = authenticationResult.AccessToken;
return token;
}
var subClient = await SubscriptionManagement.GetSubscriptionClient(clientID, clientSecret, tenantName);
var tenants = new List<string>();
foreach(var tenant in subClient.Tenants.List())
{
tenants.Add(tenant.TenantId + " - " + tenant.TenantId);
}