Доступ к Azure One Drive с использованием имени пользователя / пароля (собственное приложение) - PullRequest
0 голосов
/ 04 июля 2018

Бизнес-требования

  • OneDrive для создания папки уровня пользователя и предоставления к ней доступа отдельным членам команды.
  • Владение пользователем для создания папок для проекта и назначения исключительных разрешений для определенных участников (удаление доступа для участников, не являющихся участниками проекта)

Техническая среда

  • Доступ на один диск через Graph API
  • ADAL Auth
  • Веб-работа, размещаемая как NativeJob в приложении Azure и предоставляющая необходимый доступ OneDrive.
  • Приложение зарегистрировано в моем ( не учетная запись, используемая для доступа к OneDrive )

Текущее усилие Поскольку web-api и веб-приложения не могут использовать аутентификацию по имени пользователя / паролю, необходимые для доступа к диску конкретного пользователя, прибегают к WebJob ( не уверен, соответствует ли оно как собственное приложение ). WebJob пытается авторизоваться, используя учетные данные владельца диска, но завершается неудачно с сообщением (AADSTS65001: The user or administrator has not consented to use the application with ID '<appId>' named 'OneDriveFileSystem'. Send an interactive authorization request for this user and resource.)

Код

Запрос авторизации

        UserCredential uc = new UserPasswordCredential(userName, password);
        AuthenticationResult result = null;
        try
        {
            var authContext = new AuthenticationContext(authority);
            result = authContext.AcquireTokenAsync(resource, clientId, uc).Result;
        }
        catch (Exception ee)
        {
            return string.Empty;
        }

        return result.AccessToken;

OneDriveAccess

        string accessToken = GetAuthToken();
        if (!string.IsNullOrEmpty(accessToken))
        {
            HttpClient httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
           string payload = "{ \"name\": \"" + projectRequest.ProjectName + "\" , \"folder\": { } }";
            HttpContent content = new StringContent(payload,
                System.Text.Encoding.UTF8,
                "application/json");  
            Uri uri = new Uri(resource + "/v1.0" + RootFolderItemId + RootFolderItemId + "/children");
            HttpResponseMessage response = httpClient.PostAsync(uri, content).Result;

            if (response.IsSuccessStatusCode)
            {
                var responseContent = response.Content;
            }
        }

( приводит к 404, однако тот же URL работает в Graph Explorer )

Вопрос

Правильно ли это оформление или я упустил какой-то критический элемент? Нужно ли регистрировать приложение в учетной записи, которая используется для доступа OneDrive, или можно разрешить регистрацию в любой учетной записи пользователя, если ключи указаны правильно?

Если я обновляю код, чтобы использовать мои учетные данные, он запрашивает многофакторную аутентификацию (включенную администратором), но, поскольку он является собственным, это не может быть обеспечено. Учетная запись владельца диска была создана как служебная, поэтому MFA к ней не применим.

Может быть предоставлен любой другой требуемый код / ​​конфигурация

Обновление 1 Использование конечной точки на основе «я» (по умолчанию для папки self) приводит к 403 запретам, даже если я отправляю действительный токен доступа. Предоставили все разрешения для доступа к файлу (см. Прикрепленное изображение) permissions granted. Предоставление разрешения успешно выполнено для всех требуемых разрешений.

...