Nutzen von mit Azure AD gesicherten Unternehmens-APIs in SharePoint-Framework

In diesem Artikel wird veranschaulicht, wie Sie eine Verbindung mit einer Unternehmens-API, die mit Azure Active Directory geschützt ist, aus einer SharePoint-Framework-Lösung herstellen. Er umfasst das Erstellen und Sichern der API ebenso wie das Erstellen der SharePoint-Framework-Lösung.

Erstellen einer mit Azure AD gesicherten Unternehmens-API

Beginnen Sie mit der Erstellung einer Unternehmens-API, die mit Azure Active Directory gesichert ist. Während aus der Sicht von SharePoint-Framework keine Einschränkungen für die Implementierungsart der API bestehen, erstellen Sie die API in diesem Lernprogramm mit Azure Functions und schützen sie mithilfe der Azure App Service-Authentifizierung.

Während in Ihrer Organisation wahrscheinlich bereits bestimmte APIs ihre Anwendungen verfügbar machen, soll Ihnen dieser Abschnitt einen vollständigen Überblick über die Implementierungs- und Konfigurationsschritte geben.

Erstellen einer Azure-Funktion

Erstellen Sie im Azure-Portal eine neue Funktionen-App.

Weitere Informationen zum Erstellen von Function-Apps in Azure finden Sie im Hilfeartikel Erstellen einer Funktionen-App im Azure-Portal.

In der Function-App erstellen Sie eine neue, über HTTP ausgelöste Funktion. In diesem Beispiel werden Sie die Funktion mithilfe von C# erstellen, im Allgemeinen gibt es aber keine Beschränkung im Hinblick auf die zu verwendende Programmiersprache.

Klicken Sie in der Funktionen-App auf die Schaltfläche Neue Funktion:

Die Schaltfläche „Neu erstellen“ im Azure-Portal

Wählen Sie aus der Liste der Vorlagen HTTP-Trigger aus:

Die Funktionsvorlage „HTTP-Trigger“ im Azure-Portal

Geben Sie im Bereich „Neue Funktion“ den Funktionsnamen an, legen Sie dieAutorisierungsstufe als Anonym fest und klicken Sie auf die Schaltfläche Erstellen:

Einstellungen für das neue Azure Function im Azure-Portal

Azure Functions kann auf verschiedene Arten gesichert werden. Da Sie die Funktion mit Azure AD sichern möchten, statt sie an sich zu sichern, werden Sie die zugrunde liegende Function-App sichern. Daher geben Sie zu diesem Zeitpunkt an, dass nicht die Funktion selbst gesichert werden soll. Auf die Funktionen-App angewendete Authentifizierungseinstellungen gelten für alle Funktionen in dieser App.

Nachdem die Funktion erstellt wurde, ersetzen Sie den Inhalt durch den folgenden Codeausschnitt:

#r "Newtonsoft.Json"

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    return (ActionResult)new OkObjectResult(new List<object> {
        new {
            Id = 1,
            OrderDate = new DateTime(2016, 1, 6),
            Region = "east",
            Rep = "Jones",
            Item = "Pencil",
            Units = 95,
            UnitCost = 1.99,
            Total = 189.05
        },
        new {
            Id = 2,
            OrderDate = new DateTime(2016, 1, 23),
            Region = "central",
            Rep = "Kivell",
            Item = "Binder",
            Units = 50,
            UnitCost = 19.99,
            Total = 999.50
        },
        new {
            Id = 3,
            OrderDate = new DateTime(2016, 2, 9),
            Region = "central",
            Rep = "Jardine",
            Item = "Pencil",
            Units = 36,
            UnitCost = 4.99,
            Total = 179.64
        },
        new {
            Id = 4,
            OrderDate = new DateTime(2016, 2, 26),
            Region = "central",
            Rep = "Gill",
            Item = "Pen",
            Units = 27,
            UnitCost = 19.99,
            Total = 539.73
        },
        new {
            Id = 5,
            OrderDate = new DateTime(2016, 3, 15),
            Region = "west",
            Rep = "Sorvino",
            Item = "Pencil",
            Units = 56,
            UnitCost = 2.99,
            Total = 167.44
        }
    });
}

Stellen Sie sicher, dass die Funktion richtig funktioniert, indem Sie auf die Schaltfläche Speichern und ausführen klicken:

Die Schaltfläche „Speichern und ausführen“ im Azure-Portal

Wenn die Funktion richtig ausgeführt wurde, wird die Bezeichnung Status: 200 OK und die Auftragsliste im Testbereich angezeigt.

Sichern von Azure Function

Nachdem die Azure Function nun funktioniert, besteht der nächste Schritt darin, sie mit Azure Active Directory zu sichern, sodass man sich für den Zugriff darauf mit dem eigenen Organisationskonto anmelden muss.

Wählen Sie im Blatt „Funktionen-App“ im seitlichen Fensterbereich die Funktionen-App aus:

Funktionen-App im seitlichen Bereich des Blatts „Funktionen-App“ im Azure-Portal

Wechseln Sie im oberen Abschnitt zur Registerkarte Plattformfeatures:

Die Registerkarte „Plattformfeatures“ auf dem Blatt „Funktionen-App“ im Azure-Portal

Wählen Sie als Nächstes in der Gruppe Netzwerk den Link Authentifizierung/Autorisierung aus:

Der Link „Authentifizierung/Autorisierung“ auf dem Blatt „Funktionen-App“ im Azure-Portal

Aktivieren Sie auf dem Blatt Authentifizierung/Autorisierung die App Service-Authentifizierung durch Umschalten der Umschaltfläche App Service-Authentifizierung in Ein:

Die Option „Ein“ für die Umschaltfläche „App Service-Authentifizierung“ in den Authentifizierungseinstellungen der Funktionen-App im Azure-Portal

Ändern Sie in der Dropdownliste Auszuführende Aktion, wenn die Anforderung nicht authentifiziert ist den Wert zu Mit Azure Active Directory anmelden. Durch diese Einstellung wird sichergestellt, dass anonyme Anforderungen an die API nicht zulässig sind:

Die Option „Mit Azure Active Directory anmelden“ in der Dropdownliste „Die auszuführende Aktion, wenn die Anforderung nicht authentifiziert ist“ auf dem Blatt „Authentifizierungseinstellungen“ der Funktionen-App

Wählen Sie dann in der Liste der Authentifizierungsanbieter Azure Active Directory aus:

„Azure Active Directory“ in der Liste der Authentifizierungsanbieter für eine Funktionen-App

Legen Sie auf dem Blatt Azure Active Directory-Einstellungen die Option Verwaltungsmodus auf Erweitert fest. Legen Sie die zweite Option Verwaltungsmodus auf Neue AD-App erstellen fest:

Blatt „Azure Active Directory-Einstellungen“, geöffnet für eine Funktionen-App im Azure-Portal

Wichtig

Bevor Sie fortfahren, notieren Sie sich den Wert im Feld App erstellen. Dieser Wert stellt den Namen der Azure AD-Anwendung dar, die Sie zum Sichern der API verwenden werden. Sie benötigen ihn später, um Berechtigungen zum Zugriff auf die API aus dem SharePoint-Framework-Projekt anzufordern.

Bestätigen Sie Ihre Auswahl mit der Schaltfläche OK.

Zurück im Blatt Authentifizierung / Autorisierung , aktualisieren Sie die Authentifizierungs- und Autorisierungseinstellungen der Funktions-App, indem Sie die Schaltfläche Speichern drücken:

Die Schaltfläche „Speichern“ auf dem Blatt „Authentifizierung/Autorisierung“ für eine Funktionen-App im Azure-Portal

Überprüfen Sie, ob die API ordnungsgemäß gesichert wurde, indem Sie ein neues Browserfenster im privaten Modus öffnen und zu der API navigieren. Die URL für Ihre Funktons-App finden Sie im Abschnitt Übersicht des Blattes Funktions-App. Wenn die Authentifizierungseinstellungen richtig angewendet wurden, sollten Sie zur Azure AD-Anmeldeseite umgeleitet werden:

Azure AD-Anmeldeseite

Abrufen einer Azure AD-Anwendungs-ID

Zur Anforderung eines Zugriffstokens für die Verbindung mit der API benötigen Sie die Anwendungs-ID der Azure AD-Anwendung, mit der die API gesichert wurde.

Navigieren Sie in der Funktionen-App zu den Einstellungen Authentifizierung. Wenn der Authentifizierungslink unter Konfigurierte Features nicht verfügbar ist, klicken Sie auf den Button Aktualisieren neben der Function-App im linken Bereich:

Der Link „Authentifizierung“ auf der Seite der Funktion-App

Wählen Sie in der Liste der Authentifizierungsanbieter Azure Active Directory aus:

„Azure Active Directory“ in der Liste der Authentifizierungsanbieter für eine Funktionen-App

Wählen Sie auf dem Blatt Azure Active Directory-Einstellungen die Schaltfläche Anwendung verwalten aus:

Die Schaltfläche „Anwendung verwalten“ auf dem Blatt „Azure Active Directory-Einstellungen“

Kopieren Sie auf dem Blatt der Azure AD-Anwendung den Wert der Eigenschaft Anwendungs-ID:

Die Schaltfläche „Kopieren“ neben der Eigenschaft „Anwendungs-ID“ auf dem Blatt der Azure AD-Anwendung

Aktivieren von CORS

Die Funktionen-App wird von JavaScript, ausgeführt auf einer SharePoint-Seite, aufgerufen. Da die API in einer anderen Domäne als das SharePoint-Portal gehostet wird, werden die domänenübergreifenden Sicherheitseinschränkungen auf den API-Aufruf angewendet. Standardmäßig können mit Azure-Funktionen-Apps implementierte APIs nicht aus anderen Domänen aufgerufen werden. Sie können dies durch Anpassen der CORS-Einstellungen der Funktionen-App ändern.

Wichtig

Wenn Sie sich über die API mit dem SharePoint Online Cookie anstelle von OAuth authentifizieren, können Sie die CORS-Einstellungen nicht über das Azure-Portal konfigurieren. Damit die Authentifizierung funktioniert, müssen Sie alle CORS-Einstellungen im Azure-Portal löschen und stattdessen in Ihrer API angeben.

Wechseln Sie in der Funktionen-App zur Registerkarte Plattformfeatures.

Wählen Sie in der Gruppe API den Link CORS:

Der Link „CORS“ auf der Registerkarte „Plattformfeatures“ der Funktionen-App

Fügen Sie der Liste der zulässigen Ursprünge die URL Ihres SharePoint-Mandanten hinzu (z. B. https://contoso.sharepoint.com):

SharePoint-Mandanten-URL, hinzugefügt zur Liste der zulässigen Ursprünge in den CORS-Einstellungen der Funktionen-App

Bestätigen Sie Ihre Änderungen mit der Schaltfläche Speichern.

Nutzen von mit Azure AD gesicherten Unternehmens-APIs aus SharePoint-Framework

Nachdem die API konfiguriert und funktionsfähig ist, besteht der nächste Schritt in der Erstellung der SharePoint-Framework-Lösung, die diese API nutzen wird.

Bevor Sie fortfahren, stellen Sie sicher, dass Sie Version 1.4.1 oder höher des Yeoman-Generators von SharePoint-Framework installiert haben. Wenn Sie den Generator global installiert haben, können Sie die installierte Version überprüfen, indem Sie in der Befehlszeile Folgendes ausführen: npm ls -g --depth=0.

Erstellen eines neuen SharePoint-Framework-Projekts

Als nächstes erstellen Sie ein neues SharePoint Framework-Projekt, um die API zu verwenden.

Erstellen Sie in der Befehlszeile einen neuen Ordner für das Projekt:

md contoso-api

Wechseln des Arbeitsordners

cd contoso-api

Starten Sie zum Erstellen eines neuen Projekts den Yeoman-Generator von SharePoint-Framework aus:

yo @microsoft/sharepoint

Es werden verschiedene Eingabeaufforderungen angezeigt. Geben Sie jeweils die folgenden Werte an:

  • Wie lautet der Name Ihrer Lösung? contoso-api
  • Welche Basisplanpakete möchten Sie für Ihre Komponente(n) als Ziel festlegen? Nur SharePoint Online (aktuellste)
  • Wohin möchten Sie die Daten verschieben? Verwenden Sie den aktuellen Ordner.
  • Möchten Sie den Mandantenadministratoren erlauben, festzulegen, ob die Lösungen unmittelbar für alle Websites bereitgestellt werden, ohne die Bereitstellung von Features oder das Hinzufügen von Apps zu Websites? Ja
  • Benötigen die Komponenten in der Lösung Berechtigungen für den Zugriff auf eindeutige, nicht für andere Komponenten des Mandanten freigegebene Web-APIs? Nein
  • Welchen Typ von clientseitiger Komponente möchten Sie erstellen? WebPart
  • Wie lautet der Name Ihres Webparts? Aufträge
  • Wie lautet die Beschreibung Ihres Webparts? Letzte Bestellungen anzeigen
  • Welches Framework möchten Sie verwenden? Kein JavaScript-Framework:

Nachdem das Projekt erstellt wurde, öffnen Sie es in einem Code-Editor. In diesem Tutorial werden Sie Visual Studio Code verwenden:

SharePoint-Framework-Projekt in Visual Studio Code

Anfordern von Berechtigungen für die Unternehmens-API

Standardmäßig hat SharePoint-Framework keinen Zugriff auf Unternehmens-APIs, obwohl sie im gleichen Azure Active Directory wie Office 365 registriert sind. Dies ist beabsichtigt und ermöglicht es Organisationen auswählen, welche APIs für in SharePoint bereitgestellte Skripts und clientseitige Lösungen verfügbar gemacht werden sollen. Um Zugriff auf Ihre Unternehmens-APIs zu erhalten, müssen Sie eine Berechtigungsanforderung aus dem SharePoint-Framework-Projekt ausgeben, das Sie erstellen.

Öffnen Sie im Code-Editor die Datei config/package-solution.json:

Die Paketdatei der Lösung, geöffnet in Visual Studio Code

Fügen Sie der solution-Eigenschaft eine neue Eigenschaft namens webApiPermissionRequests hinzu mit einem Verweis auf die Azure AD-Anwendung, die zum Sichern Ihrer API verwendet wird:

{
  "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json",
  "solution": {
    "name": "contoso-api-client-side-solution",
    "id": "8cbc01fb-bab6-48fc-afec-2c2053759771",
    "version": "1.0.0.0",
    "includeClientSideAssets": true,
    "skipFeatureDeployment": true,
    "isDomainIsolated": false,
    "webApiPermissionRequests": [
      {
        "resource": "contoso-api-dp20191109",
        "scope": "user_impersonation"
      }
    ]
  },
  "paths": {
    "zippedPackage": "solution/contoso-api.sppkg"
  }
}

Der Wert der resource-Eigenschaft muss auf den Namen der Azure AD-Anwendung verweisen, mit der die API gesichert wird. Der Wert der scope-Eigenschaft gibt den Berechtigungsbereich an, den Ihre Lösung zur Kommunikation mit der API benötigt. In diesem Lernprogramm wird Azure AD nur zum Sichern der API verwendet. Daher werden Sie den Bereich user_impersonation verwenden.

Hinweis

Wenn Sie eine Verbindung zu einer Unternehmens-API herstellen möchten, die zuvor erstellt wurde, erkundigen Sie sich bei Ihrem Administrator nach den Details für die Azure AD-Anwendung, mit der sie gesichert ist. Sie benötigen Informationen wie die Anwendungs-ID, Berechtigungen, die die Anwendung verfügbar macht, und die Zielgruppe, für die sie konfiguriert ist.

Herstellen einer Verbindung mit der Unternehmens-API

Der letzte Teil besteht in der Implementierung der tatsächlichen Verbindung zu der Unternehmens-API.

Öffnen Sie im Code-Editor die Datei src\webparts\orders\OrdersWebPart.ts:

Die Datei „OrdersWebPart.ts“ in Visual Studio Code

Verweisen Sie im oberen Abschnitt der Datei auf die Klassen AadHttpClient und HttpClientResponse, indem Sie den folgenden Codeausschnitt hinzufügen:

import { AadHttpClient, HttpClientResponse } from '@microsoft/sp-http';

Fügen Sie der OrdersWebPart-Klasse eine neue Klassenvariable namens ordersClient hinzu:

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  // shortened for brevity
}

Überschreiben Sie als Nächstes in der OrdersWebPart-Klasse die onInit()-Methode, um eine Instanz von AadHttpClient zu erstellen:

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  protected onInit(): Promise<void> {
    return new Promise<void>((resolve: () => void, reject: (error: any) => void): void => {
      this.context.aadHttpClientFactory
        .getClient('6bc8bca8-5866-405d-b236-9200bdbb73c0')
        .then((client: AadHttpClient): void => {
          this.ordersClient = client;
          resolve();
        }, err => reject(err));
    });
  }

  // shortened for brevity
}

Die als zweiter Parameter des AadHttpClient-Konstruktors übergebene GUID ist die Anwendungs-ID der Azure AD-Anwendung, mit der die Unternehmens-API gesichert ist.

Erweitern Sie schließlich die render()-Methode um das Laden und Anzeigen von mit der Unternehmens-API abgerufenen Aufträgen:

export default class OrdersWebPart extends BaseClientSideWebPart<IOrdersWebPartProps> {
  private ordersClient: AadHttpClient;

  protected onInit(): Promise<void> {
    return new Promise<void>((resolve: () => void, reject: (error: any) => void): void => {
      this.context.aadHttpClientFactory
        .getClient('6bc8bca8-5866-405d-b236-9200bdbb73c0')
        .then((client: AadHttpClient): void => {
          this.ordersClient = client;
          resolve();
        }, err => reject(err));
    });
  }

  public render(): void {
    this.context.statusRenderer.displayLoadingIndicator(this.domElement, 'orders');

    this.ordersClient
      .get('https://contoso-api-dp20191109.azurewebsites.net/api/Orders', AadHttpClient.configurations.v1)
      .then((res: HttpClientResponse): Promise<any> => {
        return res.json();
      })
      .then((orders: any): void => {
        this.context.statusRenderer.clearLoadingIndicator(this.domElement);
        this.domElement.innerHTML = `
          <div class="${ styles.orders}">
            <div class="${ styles.container}">
              <div class="${ styles.row}">
                <div class="${ styles.column}">
                  <span class="${ styles.title}">Orders</span>
                  <p class="${ styles.description}">
                    <ul>
                      ${orders.map(o => `<li>${o.rep} $${o.total}</li>`).join('')}
                    </ul>
                  </p>
                  <a href="https://aka.ms/spfx" class="${ styles.button}">
                    <span class="${ styles.label}">Learn more</span>
                  </a>
                </div>
              </div>
            </div>
          </div>`;
      }, (err: any): void => {
        this.context.statusRenderer.renderError(this.domElement, err);
      });
  }

  // shortened for brevity
}

Bereitstellen der Lösung im SharePoint-App-Katalog

Nach Abschluss der Implementierung der SharePoint-Framework-Lösung besteht der nächste Schritt in der Bereitstellung für SharePoint.

Erstellen und packen Sie zuerst das Projekt unter Verwendung der Befehlszeile:

gulp bundle --ship && gulp package-solution --ship

Öffnen Sie dann im Dateiexplorer den Projektordner, und navigieren Sie zum Ordner sharepoint/solution:

Der Projektordner „sharepoint/solution“ in macOS Finder

Navigieren Sie im Webbrowser zum Mandanten-App-Katalog in Ihrem Office 365-Mandanten:

Mandanten-App-Katalog im Webbrowser

Fügen Sie die neu erstellte .sppkg-Datei durch Ziehen und Ablegen aus dem Explorer zum Mandanten-App-Katalog hinzu:

macOS Finder-Fenster über dem Webbrowser mit dem Mandanten-App-Katalog

Wenn Sie dazu aufgefordert werden, aktivieren Sie das Kontrollkästchen Diese Lösung an allen Standorten der Organisation verfügbar machen. Beachten Sie außerdem die Bemerkung, dass Sie zu der Seite für die Verwaltung von Dienstprinzipalberechtigungen navigieren sollten, um ausstehende Berechtigungen zu genehmigen. Bestätigen Sie die Bereitstellung durch Auswählen der Schaltfläche Bereitstellen.

Gewähren des Zugriffs auf die Unternehmens-API

Navigieren Sie im Webbrowser zur Mandantenadministratorwebsite, indem Sie im App-Startfeld von Office 365 die Option Admin auswählen:

Die Option „Admin“ im App-Startfeldmenü von Office 365

Wählen Sie im Menü in der Gruppe Admin Center die Option SharePoint aus:

Die Option „SharePoint“ im Menü im Office 365 Admin Center

Navigieren Sie im SharePoint Admin Center zu der neuen SharePoint Admin Center-Vorschau mithilfe des Links Neues SharePoint Admin Center (Vorschau) testen:

Der Link „Neues SharePoint Admin Center (Vorschau) testen“, hervorgehoben im SharePoint Admin Center

Wählen Sie im neuen Admin Center aus dem Menü die Option API Management aus:

Die Option „API Management“ im Menü im neuen SharePoint Admin Center

Wählen Sie auf der Seite „API Management“ in der Gruppe Genehmigung ausstehend die neu hinzugefügte Berechtigungsanforderung für den Zugriff auf die API contoso-api aus (der Name Ihrer API wird angezeigt):

Die Schaltfläche „Auswählen“ neben einer Berechtigungsanforderung auf der Seite „API Management“ im neuen SharePoint Admin Center

Klicken Sie dann in der Symbolleiste auf die Schaltfläche Genehmigen oder ablehnen:

Die Option „Genehmigen oder ablehnen“ auf der Symbolleiste auf der Seite „API Management“ im neuen SharePoint Admin Center

Gewähren Sie im seitlichen Bereich den Zugriff auf die API, indem Sie auf die Schaltfläche Genehmigen klicken:

Die Schaltfläche „Genehmigen“ im seitlichen Bereich für die Verwaltung einer API-Anforderung im neuen SharePoint Admin Center

Hinweis

Es ist möglich, ein Domänen-isoliertes Webpart zu erstellen, das eine Verbindung mit der API herstellt, die mit AAD gesichert wurde. In diesem Fall muss der CORS für die API entsprechend neu konfiguriert werden, da jede Instanz eines Domänen-isolierten Webparts in dedizierten App-Webparts mit eindeutiger Domäne ausgeführt wird.

Hinzufügen des Webparts „Orders“ zu der Seite

Um zu überprüfen, ob alles wie erwartet funktioniert, fügen Sie das zuvor erstellte „Orders“-Webpart zu einer Seite hinzu.

Navigieren Sie im Webbrowser zu einer Website in Ihrem Mandanten. Wählen Sie auf der Symbolleiste die Option Bearbeiten aus:

Die Schaltfläche „Bearbeiten“ auf der Symbolleiste auf einer modernen Teamwebsite

Wählen Sie im Zeichenbereich einen Abschnitt aus, um das Webpart hinzuzufügen:

Seitenabschnitt, im Webbrowser hervorgehoben

Wählen Sie die Option + aus, um die Toolbox zu öffnen. Geben Sie im Suchfeld Aufträge (Orders) ein, um das Aufträge-Webpart schnell zu finden:

In der Toolbox eingegebene

Wählen Sie das Orders-Webpart aus, um es der Seite hinzuzufügen. Die Liste der von der Unternehmens-API abgerufenen Aufträge sollte angezeigt werden:

Liste der letzten Aufträge, abgerufen von einer Unternehmens-API auf einer SharePoint-Seite

Wenn Sie einen Fehler mit den technischen Details von "Popup-Fenster nicht geöffnet" erhalten, haben Sie einen Popup-Blocker aktiviert. Sie müssen den Popup-Blocker des Browsers für Ihre Website deaktivieren, um die Seite korrekt anzuzeigen.