Получение расписаний календаря с помощью Graph API из службы C #

Мне нужно использовать Microsoft Graph API, чтобы получать графики занятости из календаря с помощью службы .NET Core Windows. Согласно собственной документации Microsoft, я должен использовать следующее:

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var schedules = new List<String>()
{
    "[email protected]",
    "[email protected]"
};

var startTime = new DateTimeTimeZone
{
    DateTime = "2019-03-15T09:00:00",
    TimeZone = "Pacific Standard Time"
};

var endTime = new DateTimeTimeZone
{
    DateTime = "2019-03-15T18:00:00",
    TimeZone = "Pacific Standard Time"
};

var availabilityViewInterval = 60;

await graphClient.Me.Calendar
    .GetSchedule(schedules,endTime,startTime,availabilityViewInterval)
    .Request()
    .Header("Prefer","outlook.timezone=\"Pacific Standard Time\"")
    .PostAsync();

Я зарегистрировал новое приложение на портале Azure и дал ему разрешение Calendars.Read.

Мой код C #:

try
{
    IConfidentialClientApplication clientApplication = ConfidentialClientApplicationBuilder
        .Create(_clientId)
        .WithTenantId(_tenantId)
        .WithClientSecret(_clientSecret)
        .Build();

    var authProvider = new ClientCredentialProvider(clientApplication);
    var graphClient = new GraphServiceClient(authProvider);

    var schedules = new List<string>
    {
        "[email protected]" // not actual mail used in my application
    };

    var startTime = new DateTimeTimeZone
    {
        DateTime = "2020-04-18T00:00:00",
        TimeZone = "Europe/Paris"
    };

    var endTime = new DateTimeTimeZone
    {
        DateTime = "2020-04-25T23:59:59",
        TimeZone = "Europe/Paris"
    };

    ICalendarGetScheduleCollectionPage scheduleList = await graphClient.Me.Calendar
        .GetSchedule(schedules, endTime, startTime, 60)
        .Request()
        .PostAsync().ConfigureAwait(false);
    Console.WriteLine("scheduleList.Count: " + scheduleList.ToList().Count);
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

Когда я запускаю свое приложение, я получаю следующее исключение:

Код: BadRequest

Сообщение: текущий аутентифицированный контекст недействителен для этого запроса. Это происходит, когда к конечной точке делается запрос, требующий входа пользователя. Например, для / me требуется авторизованный пользователь. Получите токен от имени пользователя, чтобы делать запросы к этим конечным точкам. Используйте поток кода авторизации OAuth 2.0 для мобильных и собственных приложений и неявный поток OAuth 2.0 для одностраничных веб-приложений.


person Christian Tang    schedule 22.04.2020    source источник


Ответы (1)


Вы используете учетные данные клиента provider, чтобы создать authProvider.

Однако учетные данные клиента работают только для разрешений только для приложений.

Но в вашем коде graphClient.Me.Calendar означает, что вы пытаетесь получить «мой календарь», говоря, что это календарь вошедшего в систему пользователя.

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

Итак, вам необходимо реализовать Поставщик кода авторизации, если у вас есть авторизованный пользователь. Затем вы можете использовать graphClient.Me.Calendar, чтобы получить календарь.

Или, если у вас нет зарегистрированного пользователя, вам следует продолжать использовать поставщика учетных данных клиента и изменить код как: graphClient.Users["objectId of the user"].Calendar.

person Allen Wu    schedule 22.04.2020
comment
Спасибо за ваш ответ. Если я изменю свой код на graphClient.Users [user.id] .Calendar, я не получу исключения, и это нормально. Но мне еще нужно получить расписание для каждого пользователя. - person Christian Tang; 22.04.2020
comment
Только что понял, что мне нужно использовать GetSchedule в календаре от конкретного пользователя, но указать тот же адрес электронной почты. Кажется, сейчас все работает. Спасибо! - person Christian Tang; 22.04.2020
comment
@ChristianTang Я рад, что это полезно. :) - person Allen Wu; 23.04.2020
comment
@AllenWu Как и где получить ObjectId пользователя? - person webmaster; 18.01.2021
comment
@webmaster Используйте https://graph.microsoft.com/v1.0/users?$filter=userPrincipalName eq 'your upn or email'. - person Allen Wu; 19.01.2021