Greifen Sie mithilfe von Microsoft Graph auf die Kalenderereignisse eines Benutzers zu

Abgeschlossen

Sie haben eine ASP.NET Core-App ausgeführt und mit Microsoft 365 verbunden. In dieser Einheit erfahren Sie, wie Sie die Kalenderereignisse eines Benutzers für die kommende Woche anzeigen. Außerdem erfahren Sie, wie Sie Datenereignisse für einen bestimmten Zeitraum abfragen können. Schließlich erfahren Sie Näheres über Konzepte wie Auswahl und Reihenfolge, um die Informationen auf die gewünschte Weise anzuzeigen.

Entscheiden, welche Berechtigungen Ihre App benötigt

Alle von Microsoft Graph verfügbar gemachten Daten werden gesichert, und Ihre App muss über die erforderlichen Berechtigungen verfügen, um darauf zugreifen zu können. Die erforderlichen Berechtigungen sind von der Art der Informationen abhängig, auf die Ihre App zugreifen muss. Um beispielsweise auf den Kalender des Benutzers zugreifen zu können, muss Ihre App über die Berechtigung Calendars.Read verfügen. Die vollständige Liste der für die einzelnen Vorgänge erforderlichen Berechtigungen finden Sie in der Microsoft Graph-API-Referenz.

Wenn Ihre App unterschiedliche Datentypen lädt, müssen Benutzer der App mehrere Berechtigungen erteilen, die für den Zugriff auf diese Informationen erforderlich sind. Es wird empfohlen, in Ihrer App nur die Berechtigungen anzufordern, die Sie benötigen.

Festlegen der erforderlichen Berechtigungen

Die Liste der gewährten Berechtigungen Ihrer App wird direkt im Zugriffstoken integriert. Im OAuth-Standard werden sie Bereiche (scopes) genannt. Wenn Ihre Anwendung MSAL zum Abrufen des Zugriffstokens verwendet, muss sie eine Liste von Bereichen in der Anforderung an die Microsoft Entra-ID enthalten. Jeder Vorgang in Microsoft Graph besitzt seine eigene Liste von Bereichen. Wenn in Ihrem Zugriffstoken eine solche fehlt, wird die Anforderung abgelehnt.

Wie Sie zuvor gesehen haben, speichert die Beispielanwendung die erforderlichen Berechtigungen in der Datei appsettings.json in einer Scopes-Eigenschaft.

"Scopes": "user.read presence.read mailboxsettings.read calendars.read"

Der Scopes-Eigenschaftswert wird von der ASP.NET Core-Middleware der App verwendet, die das Abrufen eines Zugriffstokens verarbeitet, nachdem sich der Benutzer erfolgreich angemeldet hat.

Middleware: Microsoft Identity Platform und Microsoft Graph

ASP.NET Core unterstützt Middleware, die zur Authentifizierung und Autorisierung von Benutzern verwendet werden kann. Es kann auch zum Abrufen eines Token genutzt werden, das verwendet werden kann, um Microsoft Graph aufzurufen, ein Microsoft Graph-SDK-Objekt namens GraphServiceClient in die Anwendung zu injizieren, einen Tokencache zu erstellen und vieles mehr. Die Middleware ist in Startup.cs konfiguriert und übernimmt die folgenden Aufgaben.

  1. Abrufen der in der Scopes-Eigenschaft definierten erforderlichen Berechtigungen aus appsettings.json.
  2. Hinzufügen von Support für die OpenId-Authentifizierung.
  3. Angeben, dass es sich bei der Anwendung um eine Microsoft Identity Platform-Web-App handelt, die einen Authentifizierungscodefluss erfordert.
  4. Hinzufügen der Möglichkeit, Microsoft Graph-APIs mit bestimmten Berechtigungen aufzurufen.
  5. Aktivieren der Abhängigkeitsinjektion für GraphServiceClient (ein vom Microsoft Graph-SDK bereitgestelltes Objekt, das für Microsoft Graph-Aufrufe verwendet wird).
  6. Hinzufügen eines Speichertokencache.
  7. Einen authentifizierten Benutzer für den Zugriff auf die App fordern.
  8. Aktivieren der Unterstützung für Razor Pages.
  9. Hinzufügen von Microsoft Identity-UI-Seiten, die Unterstützung für Benutzeranmeldung und -abmeldung bieten.

Sie können jeden dieser Schritte in folgendem Code in der ConfigureServices()-Methode von Startup.cs definiert sehen.

// 1. Retrieve required permissions from appsettings
string[] initialScopes =
Configuration.GetValue<string>("DownstreamApi:Scopes")?.Split(' ');


services
  // 2. Add support for OpenId authentication
  .AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)

  // 3. Microsoft identity platform web app that requires an auth code flow
  .AddMicrosoftIdentityWebApp(Configuration)

  // 4. Add ability to call Microsoft Graph APIs with specific permissions
  .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)

  // 5. Enable dependency injection for GraphServiceClient
  .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))

  // 6. Add in-memory token cache
  .AddInMemoryTokenCaches();


// 7. Require an authenticated user
services.AddControllersWithViews(options =>
{
  var policy = new AuthorizationPolicyBuilder()
      .RequireAuthenticatedUser()
      .Build();
  options.Filters.Add(new AuthorizeFilter(policy));
});

services
  // 8. Add Razor Pages support
  .AddRazorPages()

  // 9. Add Microsoft Identity UI pages that provide user
  // sign-in and sign-out support
  .AddMicrosoftIdentityUI();

Nachdem die erforderliche Middleware konfiguriert wurde, übernimmt die Anwendung automatisch die Anmeldung des Benutzers und das Abrufen des Zugriffstokens. Das Zugriffstoken kann dann zum Abrufen der Kalenderereignisse eines Benutzers verwendet werden, da es die erforderlichen Berechtigungen enthält. Sehen wir uns an, wie dieser Prozess funktioniert.

Die Kalenderereignisse eines Benutzers für einen bestimmten Zeitraum abrufen

Um die Kalenderereignisse eines Benutzers von Microsoft Graph abzurufen, müssen Sie den /me/calendarview -Endpunkt aufrufen. Dadurch wird eine Liste von Kalenderereignissen aus dem Standardkalender des angemeldeten Benutzers zurückgegeben. Sie können den Aufruf an Microsoft Graph mithilfe des GraphServiceClient-Objekts ausführen, das zuvor im Middleware-Abschnitt erwähnt wurde. GraphServiceClient stellt APIs bereit, die zum Aufrufen von Microsoft Graph verwendet werden können, ohne manuell HTTP-Aufrufe ausführen zu müssen. Um Kalenderereignisse für die kommende Woche anzuzeigen, müssen Sie das jeweilige Datum von Anfang und Ende der Woche angeben.

// Configure a calendar view for the current week
var startOfWeek = DateTime.Now;
var endOfWeek = startOfWeek.AddDays(7);

Diese Datumsangaben werden dann einer QueryOption-Liste hinzugefügt, über die der auszuwählende Ereignisbereich definiert wird.

var viewOptions = new List<QueryOption>
{
  new QueryOption("startDateTime", startOfWeek.ToString("o")),
  new QueryOption("endDateTime", endOfWeek.ToString("o"))
};

Anschließend wird ein GraphServiceClient-Objekt (in den Konstruktor der Razor Page-Modellklasse eingefügt) zum Aufrufen von Me.CalendarView verwendet, und die viewOptions-Liste wird an die Request-Methode übergeben, um die Ergebnisse einzugrenzen. Der Code schließt auch die bevorzugte Zeitzone des Benutzers durch Aufrufen der Header-Methode ein.

// Use the injected GraphServiceClient object to call into Me.CalendarView
var calendarEvents = await _graphServiceClient
    .Me
    .CalendarView
    .Request(viewOptions)
    .Header("Prefer", $"outlook.timezone=\"{userTimeZone}\"")

Das Minimieren der Datenmenge, die Microsoft Graph abruft und überträgt, wird die Leistung Ihrer App erheblich verbessern. Die GraphServiceClient’s-Methode kann verwendet werden, um bestimmte Eigenschaften auszuwählen, welche die App verwenden wird.

.Select(evt => new
{
    evt.Subject,
    evt.Organizer,
    evt.Start,
    evt.End
})

Schließlich wird die OrderBy-Methode verwendet, um anzugeben, wie die resultierenden Elemente sortiert werden sollen, und GetAsync wird aufgerufen, um die Anforderung zu starten.

.OrderBy("start/DateTime")
.GetAsync();

In diesem Fall sortiert der Code die Ergebnisse nach der Untereigenschaft der start-Eigenschaft namens DateTime . Um nach mehreren Feldern zu sortieren, geben Sie eine durch Kommas getrennte Reihe von Feldern an. Sie können auch angeben, ob die Elemente in auf- oder absteigender Reihenfolge sortiert werden sollen, indem Sie die Abfrage das Schlüsselwort asc or desc anhängen. Nachfolgend die vollständige Version des Codes:

// Configure a calendar view for the current week
var startOfWeek = DateTime.Now;
var endOfWeek = startOfWeek.AddDays(7);

var viewOptions = new List<QueryOption>
{
    new QueryOption("startDateTime", startOfWeek.ToString("o")),
    new QueryOption("endDateTime", endOfWeek.ToString("o"))
};

// Use the injected GraphServiceClient object to call into Me.CalendarView
var calendarEvents = await _graphServiceClient
    .Me
    .CalendarView
    .Request(viewOptions)
    .Header("Prefer", $"outlook.timezone=\"{userTimeZone}\"")
    .Select(evt => new
    {
        evt.Subject,
        evt.Organizer,
        evt.Start,
        evt.End
    })
    .OrderBy("start/DateTime")
    .GetAsync();

Sehen wir uns an, wie Sie diesen Code in der Anwendung verwenden können.