Секрет клиента аутентификации между сервисами Azure Data Lake, AdalServiceException и WebException

Я хочу использовать приведенные ниже документы, чтобы настроить и запустить мое консольное приложение, которое я планирую перенести в Функции Azure. https://docs.microsoft.com/en-us/azure/data-lake-store/data-lake-store-get-started-net-sdk

В приведенном ниже коде я застреваю

КОД СНИП

// Service principal / appplication authentication with client secret / key
// Use the client ID of an existing AAD "Web App" application.
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

var domain = "<AAD-directory-domain>";
var webApp_clientId = "<AAD-application-clientid>";
var clientSecret = "<AAD-application-client-secret>";
var clientCredential = new ClientCredential(webApp_clientId, clientSecret);
var creds = await ApplicationTokenProvider.LoginSilentAsync(domain, clientCredential);

МОЯ РЕАЛИЗАЦИЯ

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
var domain = "https://microsoft.onmicrosoft.com";
var webApp_clientId = "<my-client-id>";
var clientSecret = "<my-client-secret>";
var clientCredential = new ClientCredential(webApp_clientId, clientSecret);
var creds = await ApplicationTokenProvider.LoginSilentAsync(domain, clientCredential);

SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());                       

_adlsClient = new DataLakeStoreAccountManagementClient(creds) { SubscriptionId = _subId };
_adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);

await _adlsFileSystemClient.FileSystem.MkdirsAsync("<name-of-my-dlstore>", "tempdir");

Я также удостоверился, что предоставил своему приложению разрешения для указанной папки в экземпляре Azure Data Lake: введите описание изображения здесь

Я также убедился, что все дочерние папки в этом каталоге имеют одинаковый уровень или разрешения: введите описание изображения здесь

Назначенные разрешения на путь к файлу

введите описание изображения здесь

Когда я запускаю свою реализацию, я получаю следующие ошибки. Любой совет ТАК? System.AggregateException: "Произошла одна или несколько ошибок."

Внутреннее исключение 1

AdalServiceException: AADSTS90002: запрошенный идентификатор клиента "https:" недействителен.

Идентификатор трассировки: d1718b0a-0533-4708-a311-4e1622840100

Идентификатор корреляции: a1544df2-692e-43d2-8acf-25a847956fb6

Отметка времени: 2017-03-29 01: 30: 18Z

Внутреннее исключение 2

WebException: удаленный сервер вернул ошибку: (400) неверный запрос.

КАК ЧАСТЬ РЕШЕНИЯ. Необходимо убедиться, что корневой папке предоставлены разрешения на чтение, запись и выполнение (это перейдет в ту папку, для которой вы хотите предоставить эти разрешения), а затем удалить эти разрешения из всех остальных. папки, которым вы не хотите назначать эти разрешения, убедитесь, что вы выбрали опцию удаления этих разрешений для этой подпапки и всех ее детей / детей.


person greg    schedule 29.03.2017    source источник


Ответы (1)


AdalServiceException: AADSTS90002: запрошенный идентификатор клиента "https:" недействителен.

Это ваше имя клиента, например microsoft.onmicrosoft.com.

WebException: удаленный сервер вернул ошибку: (400) неверный запрос.

Что такое подробное сообщение об ошибке, обратитесь к руководству:

https://docs.microsoft.com/en-us/azure/data-lake-store/data-lake-store-get-started-net-sdk

Я выполнил подробные инструкции по использованию межсервисной аутентификации с секретом клиента и успешно создал каталог. Код ниже для справки:

  public static async Task  CreateDirectory()
    {

        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
        var domain = "microsoft.onmicrosoft.com";
        var webApp_clientId = "client id";
        var clientSecret = "client secret";
        var clientCredential = new ClientCredential(webApp_clientId, clientSecret);
        var creds = ApplicationTokenProvider.LoginSilentAsync(domain, clientCredential).Result;

        SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());

        _adlsClient = new DataLakeStoreAccountManagementClient(creds) { SubscriptionId = "_subId" };
        _adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);

        await _adlsFileSystemClient.FileSystem.MkdirsAsync("_adlsAccountName", "tempdir");

    }
    static void Main(string[] args)
    {
      CreateDirectory().Wait();
    }

ИЗМЕНИТЬ

Если вы хотите создать каталог, вам необходимо назначить своему приложению разрешение Выполнение. Доступны как идентификатор, так и имя арендатора, что означает:

 var domain = "microsoft.onmicrosoft.com";
 //you could also use tenant id 
 var domain = "Your tenant ID";
person Nan Yu    schedule 29.03.2017
comment
Спасибо! Этот фрагмент был шагом вперед в том, что я исправил строку своего домена и использовал ваш синтаксис для кредитов, захватив .Result, но теперь я столкнулся с другой ошибкой. - person greg; 29.03.2017
comment
System.AggregateException: "Произошла одна или несколько ошибок." Внутреннее исключение | AdlsErrorException: операция вернула недопустимый код статуса "Запрещено" - person greg; 29.03.2017
comment
Вы назначили разрешения, как показано здесь - person Nan Yu; 29.03.2017
comment
Да, но только разрешения READ и WRITE. Нужны ли мне еще разрешения EXECUTE? Я также вижу некоторую необходимость при программном входе в систему, вам необходимо передать идентификатор клиента с вашим запросом аутентификации. здесь (docs.microsoft.com/en-us/azure/azure-resource-manager/), но не знаю, как это сделать, поскольку я не вижу синтаксиса того, как это сделать, в фрагментах кода из руководств, за которыми я следил. - person greg; 29.03.2017
comment
@GregDegruy, я отредактировал свой ответ, чтобы ответить на ваш вопрос, пожалуйста, проверьте его. - person Nan Yu; 29.03.2017
comment
идеально! последнее, у меня есть эти разрешения только для определенной папки, а не для всего озера данных Azure для моего приложения, могу ли я сделать что-то вроде этого, я думаю, что мой синтаксис где-то отключен, так как я получаю AdlsErrorException: операция вернула недопустимый статус код 'Запрещено' await _adlsFileSystemClient.FileSystem.MkdirsAsync("<name-of-my-dlstore>", @"dirAppHasPermissionsTo\NewDir"); Нужно ли мне каким-то образом включать полный путь, чтобы гарантировать это adl://<name-of-my-dlstore>.azuredatalakestore.net - person greg; 29.03.2017
comment
Вам также необходимо назначить разрешение для приложения для доступа к папке dirAppHasPermissionsTo: щелкните папку, нажмите кнопку «Доступ» и назначьте соответствующие разрешения вашему приложению. Вы также можете выбрать добавить в эту папку и всех дочерних при назначении разрешения, если вы хотите, чтобы приложение имело разрешения в дочерних элементах папки. - person Nan Yu; 29.03.2017
comment
И не нужно использовать полный путь: await _adlsFileSystemClient.FileSystem.MkdirsAsync (nanyutest, @ tempdir11 \ tempdir11); - person Nan Yu; 29.03.2017
comment
@ Грег Дегрю, ты решил свою проблему? Если да, отметьте этот ответ как ответ, чтобы он мог помочь другим, столкнувшимся с той же проблемой. Если возникнут другие проблемы, дайте мне знать. - person Nan Yu; 29.03.2017
comment
все советы, данные до сих пор, верны, я просто вонючий, лол. Я загрузил консольное приложение в файл temp.zip в своем репозитории, если вы хотите еще раз взглянуть на него (github.com/gregdegruy/bigdataanalytics-azurefunction - для класса DataLakeService.cs) Я все еще получаю эту ошибку AdlsErrorException: Operation returned an invalid status code 'Forbidden', я обновлю свои изображения в своем вопросе, чтобы показать разрешения, назначенные моему приложению для эта папка озера данных, а также ее дочерние элементы. - person greg; 29.03.2017
comment
Давайте продолжим это обсуждение в чате. - person Nan Yu; 29.03.2017