#asp.net-core #.net-core #azure-active-directory #microsoft-graph-api #onedrive
#asp.net-ядро #.net-ядро #azure-active-directory #microsoft-graph-api #onedrive
Вопрос:
Я пытаюсь загрузить файл в OneDrive с помощью Graph SDK для .Net Core из рабочей службы. По сути, некоторые файлы создаются в случайное время, и эти файлы необходимо загружать по указанному пути в OneDrive из рабочей службы в полночь каждый день. У меня есть следующая информация, хранящаяся в файле appconfig.json в приложении:
- Идентификатор клиента
- clientSecret
- TenantId
Я проверил образцы на разных сайтах, но не смог найти, как загружать файлы, используя приведенные выше ID
и Secret
. Я считаю, что должно быть что-то authProvider
, что я мог бы инициализировать, используя выше ID
и Secret
.
Я также проверил документацию miscrosoft, но не смог найти ни одного примера того, как загрузить файл с помощью SDK с ID
помощью and Secret
.
Дополнительный момент
- Загрузить новый файл
- Перезаписать, если файл уже существует (надеюсь, что graph уже поддерживает это)
- размер файла <4 МБ
- формат пути
/folder1/folder2/filename.pdf
Любая помощь будет оценена.
Ответ №1:
Не забудьте назначить разрешение приложения (поток учетных данных клиента) для регистрации приложения. См. раздел Разрешение приложения для Microsoft Graph.
Вы можете использовать поставщика учетных данных клиента.
IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
.Create(clientId)
.WithTenantId(tenantID)
.WithClientSecret(clientSecret)
.Build();
ClientCredentialProvider authProvider = new ClientCredentialProvider(confidentialClientApplication);
Загрузка небольшого файла (<4M):
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
using var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes("The contents of the file goes here."));
await graphClient.Users[{upn or userID}].Drive.Items["{item-id}"].Content
.Request()
.PutAsync<DriveItem>(stream);
Если вы хотите загрузить большой файл, см. раздел Загрузка больших файлов с сеансом загрузки.
Обновить:
Использовать Install-Package Microsoft.Graph.Auth -IncludePrerelease
в Сервисах -> Диспетчер пакетов NuGet -> Консоль диспетчера пакетов.
Он поддерживает как загрузку нового файла, так и замену существующего элемента.
Для получения идентификатора элементов, пожалуйста, обратитесь к разделу Получение файла или папки.
Например, получите идентификатор элемента /folder1/folder2
(проведите быстрый тест в Microsoft Graph Explorer):
GET https://graph.microsoft.com/v1.0/users/{userID}/drive/root:/folder1:/children
В нем будут перечислены все дочерние элементы в папке 1, включая папку 2. Затем вы можете найти идентификатор элемента folder2.
ОБНОВЛЕНИЕ 2:
Поставщик учетных данных клиента — это идентификатор приложения, в то время как все поставщики, перечисленные ниже, являются идентификаторами пользователя.
Поскольку вы хотите получить доступ к персональному OneDrive (включая идентификацию пользователя), вы можете выбрать поставщика кода авторизации или интерактивного поставщика.
Поставщик кода авторизации: вам необходимо реализовать интерактивный вход в веб-приложение и использовать этого поставщика.
Интерактивный поставщик: вы можете легко использовать этого поставщика для реализации интерактивного входа в консольное приложение.
Вы можете провести быстрый тест со вторым поставщиком.
Пожалуйста, обратите внимание, что вы должны добавить делегированные (личная учетная запись Майкрософт) разрешения при регистрации приложения. См. раздел Делегированные разрешения для Microsoft Graph.
И в этом случае вы должны изменить все graphClient.Users[{upn or userID}]
graphClient.Me
в своем коде.
Я боюсь, что вам придется реализовать интерактивный вход в систему auth flow для доступа к персональному OneDrive.
Комментарии:
1. Спасибо за ответ, не могли бы вы также сказать мне, какие пакеты nuget мне нужно использовать?
2. @JustAProgrammer Установите Microsoft Graph .NET SDK
3. Не удается найти Microsoft. График. Аутентификация пакета NuGet
4. Майкрософт. График. Аутентификация все еще не готова к производству, какова альтернатива?
5. Также у меня нет
item-id
, у меня просто есть путь, подобный/folder1/folder2/file.pdf