Предоставление функции Cross-Tenant Azure RM доступа - PullRequest
0 голосов
/ 17 октября 2018

В настоящее время я могу управлять ресурсами нескольких клиентов Azure AD с помощью Azure Resource Manager через PowerShell (идентификатор клиента 1950a258-227b-4e31-a9cf-717495945fc2), используя делегированные разрешения с учетной записью пользователя, имеющего повышенные привилегии как в Azure AD, так и во всехсоответствующие подписки.Т.е. у SubscriptionClient, вошедшего в систему с этим пользователем, есть метод SubscriptionClient.tenants.List(), который будет перечислять несколько арендаторов, если у меня будет доступ к подпискам в разных арендаторах, как у этого пользователя.

Я пишу автоматизацию между арендаторамии я пытаюсь сделать так, чтобы функция .NET в Azure выполняла вышеупомянутое, не делегируя ей разрешения от какой-либо учетной записи бога между пользователями (в качестве учетной записи старой школы).Вместо этого я хочу дать самой функции разрешения.

  1. Первая попытка - с использованием 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

  2. Итак, я отказался от 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);                
}

1 Ответ

0 голосов
/ 22 октября 2018

Судя по моему опыту, кажется, что мы не можем получить всех арендаторов с разрешением приложения .

Я также тестирую его с приложением с поддержкой нескольких клиентов Web,также получить тот же результат с вами.

Я захватил этот запрос API остальных с Fiddler.Он отправляет Список тангенсов API.

GET https://management.azure.com/tenants?api-version=2016-06-01

Остальные API используются для получения арендаторов для вашего аккаунта .

Gets the tenants for your account.
...