Mit OAuth gegenüber dem Microsoft Dataverse authentifizieren

Abgeschlossen

Microsoft Dataverse verwendet OAuth 2.0 als Authentifizierungsstandard. OAuth 2.0 bietet einen branchenweit standardisierten Mechanismus zur Authentifizierung von Client-Anwendungen und ihrem Zugriff auf eine Ressource.

Authentifizierung im Vergleich zu Autorisierung

Authentifizierung ist der Prozess oder die Aktion zur Überprüfung der Identität eines Benutzers oder Prozesses. Die Lösung von Microsoft für diesen Überprüfungsprozess ist Microsoft Entra ID. Entra ID unterstützt viele Optionen zur Überprüfung der Identität eines Benutzers oder Prozesses. Die Abstraktion Ihres Identitätsproviders ermöglicht eine gute Separierung der Bedenken, da die Verwaltung von Benutzernamen und Passwörtern ein schwieriger (und risikoreicher) Prozess sein kann.

Hinweis

Microsoft Entra ID ist der neue Name für Azure Active Directory. Alle Lizenzen und Funktionen bleiben die gleichen.

Autorisierung ist der Prozess oder die Aktion der Überprüfung, ob ein authentifizierter Benutzer dazu autorisiert ist, auf Ressource zuzugreifen. Derzeit befindet sich die Dataverse-Autorisierung auf Entra ID-Mandantenebene, während die Verwaltung detaillierter Berechtigungen abhängig vom aktuell angemeldeten Benutzer an die Anwendung delegiert wird. Daher verwenden Sie OAuth 2.0 nicht zur Verwaltung der Sicherheit auf App-Ebene, womit Sie sonst Dataverse-Sicherheitsrollen und Zuweisungen für Benutzern handhaben mit dem Power Apps Admin Center.

Wenn Sie mehr über die Konzepte der Authentifizierung und Autorisierung erfahren möchten, wechseln Sie zu Authentifizierungsgrundlagen.

Dataverse-Apps mit Entra ID registrieren

Um erfolgreich eine Verbindung zu Ihrem Dataverse herzustellen, müssen Sie zuerst die Registrierung einer App bei Entra iD durchführen, die Sie im Azure-Portal abschließen können. Abhängig vom App-Typ, den Sie vornehmen möchten, stehen Ihnen einige unterschiedliche Einstellungen zur Konfiguration zur Verfügung (Web-Apps im Vergleich zu nativen Apps, die nativ auf einem Gerät installiert sind). Weitere Informationen zu den Einstellungen, die für jeden Typen erforderlich sind, finden Sie unter Arten der App-Registrierung.

Gehen Sie zum Abschnitt App-Registrierungen des Menüs Entra ID (Azure Active Directory), und wählen Sie dann Neue Registrierung aus.

Geben Sie den Namen Ihrer App und den Typ des Kontozugriffs an, den Sie benötigen. Wenn Sie eine Web-App registrieren, geben Sie eine Umleitungs-URI an, indem Sie den Abschnitt Authentifizierung aufrufen, setzen Sie den Typ auf Web und geben Sie dann eine Umleitungs-URI ein.

In der folgenden Liste wird zusammengefasst, wann die verschiedenen Kontotypen verwendet werden sollen:

  • Konten nur in diesem Organisationsverzeichnis (Einzelmandant)

    Alle Benutzer‑ und Gastkonten in Ihrem Verzeichnis können Ihre Anwendung oder API verwenden.

    Verwenden Sie diese Option, wenn sich Ihre Zielgruppe innerhalb Ihrer Organisation befindet.

  • Konten in einem beliebigen Organisationsverzeichnis (jedes Entra ID-Verzeichnis – Mandantenfähig)

    Alle Benutzer mit einem Geschäfts‑ oder Schulkonto von Microsoft können Ihre Anwendung oder API verwenden, einschließlich Schulen und Unternehmen, die Microsoft 365 verwenden.

    Verwenden Sie diese Option, wenn Ihre Zielgruppe Geschäfts‑ oder Bildungskunden sind, und aktivieren Sie die Mehrinstanzenfähigkeit.

  • Konten in einem beliebigen Organisationsverzeichnis (Jedes Entra ID-Verzeichnis – Mandantenfähig) und persönliche Microsoft-Konten (z. B. Skype und Xbox)

    Alle Benutzer mit einem geschäftlichen, schulischen oder persönlichen Microsoft-Konto können Ihre Anwendung oder API verwenden. Dazu zählen Schulen und Unternehmen, die Microsoft 365 verwenden und persönliche Konten, die zum Anmelden bei Diensten wie Xbox und Skype verwendet werden.

Abhängig von der Komplexität Ihrer Anwendungskonfiguration möchten Sie möglicherweise andere Authentifizierungseinstellungen konfigurieren. Beachten Sie die Entra ID-Dokumentation für Schritte zum Ausführen dieser Aufgabe.

Auf Dataverse über die Web-API zugreifen

Alle Zugriffe auf Dataverse erfolgen im Kontext eines angemeldeten Benutzers. Es kann sich dabei um einen normalen interaktiven Benutzer oder einen nicht interaktiven Benutzer handeln, der die Server-zu-Server-Authentifizierung (S2S) verwendet.

Wenn eine Anwendung im Namen eines interaktiven Benutzers auf Dataverse zugreift, muss die registrierte Anwendung mit API-Zugriffsberechtigungen für Dataverse mit delegierter Erlaubnis konfiguriert werden. Wenn eine Anwendung direkt auf Dataverse zugreift, muss ein Anwendungsbenutzer, der der Entra ID-Anwendungsregistrierung zugeordnet ist, in Dataverse erstellt werden. Bei Verwendung der S2S-Authentifizierung sind delegierte Dataverse-API-Berechtigungen nicht erforderlich.

In allen Fällen müssen die authentifizierten Benutzer Dataverse-Sicherheitsrollen haben, die dem Benutzer zugeordnet sind, der die Operationen zulässt, die unter Verwendung der Web-API ausgeführt werden.

API-Berechtigungen konfigurieren

Wenn Ihre Anwendung im Namen eines angemeldeten Benutzers auf Dataverse zugreift, wechseln Sie als Nächstes auf die Registerkarte API-Berechtigungen auf der registrierten Anwendung, und stellen Sie sicher, dass Ihre Anwendung Zugriff auf Benutzeridentitätswechsel in Ihrer Dataverse-Umgebung gewährt.

Die Beschriftung sagt Dynamics CRM, dies ist ein historischer Name des Vorläuferprodukts zu Dataverse.

Einen Dataverse-Anwendungsbenutzer konfigurieren

Bei Verwendung der S2S-Authentifizierung muss ein Dataverse-Anwendungsbenutzer in jeder Dataverse-Umgebung konfiguriert werden, auf die Sie mit der Web-API zugreifen.

Die Konfiguration von Dataverse-Anwendungsbenutzern findet im Power Platform Admin Center als Systemadministrator statt.

Vom Admin Center aus können Sie die folgenden Schritte ausführen:

  • Einen neuen Anwendungsbenutzer erstellen

  • Den Anwendungsbenutzer mit der Entra ID-App oder der verwalteten Identität verknüpfen

  • Konfigurieren, welche Dataverse-Sicherheitsrollen gelten

Eine schrittweise Überprüfung finden Sie unter Anwendungsbenutzer im Power Platform Admin Center verwalten.

Authentifizierungsbibliotheken verwenden, um eine Verbindung herzustellen

Verwenden Sie eine der Microsoft Identity Platform-Authentifizierungsbibliotheken nach der Registrierung Ihrer Anwendung, um die Authentifizierung durchzuführen und einen Zugriffstoken für die Verwendung mit der Web-API zu erhalten.

Der folgende Code ist ein Auszug des Beispiels Erweiterter Schnellstart, das die Microsoft-Authentifizierungsbibliothek (MSAL) verwendet. Die folgende OAuthMessageHandler-Klasse implementiert eine Klasse von DelegatingHandler, die dann zum Konstruktor des HttpClient weitergeleitet wird. Mit diesem Handler können Sie die Methode HttpClient.SendAsync überschreiben, sodass das Zugriffstoken durch AcquireToken*-Methodenaufrufe bei jeder vom HTTP-Client gesendeten Anfrage aktualisiert wird.

class OAuthMessageHandler : DelegatingHandler
{
  private AuthenticationHeaderValue authHeader;
  public OAuthMessageHandler(string serviceUrl, string clientId, string redirectUrl, string username, string password, HttpMessageHandler innerHandler)
  : base(innerHandler)
  {
    //Build Microsoft.Identity.Client (MSAL) OAuth Token Request
    var clientApplication = PublicClientApplicationBuilder.Create(clientId)
    .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs)
    .WithRedirectUri(redirectUrl)
    .Build();
    var scope = serviceUrl + "//.default";
    string[] scopes = { scope };
    AuthenticationResult authBuilderResult;
    if (username != string.Empty && password != string.Empty)
    {
      //Make silent Microsoft.Identity.Client (MSAL) OAuth Token Request
      var securePassword = new SecureString();
      foreach (char ch in password) securePassword.AppendChar(ch);
      authBuilderResult = clientApplication.AcquireTokenByUsernamePassword(scopes, username, securePassword).ExecuteAsync().Result;
    }
    else
    {
      //Popup authentication dialog box to get token
      authBuilderResult = clientApplication.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
    }
      //Note that an Entra ID access token has a finite lifetime, default expiration is 60 minutes.
      authHeader = new AuthenticationHeaderValue("Bearer", authBuilderResult.AccessToken);
    }
  protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
  {
    request.Headers.Authorization = authHeader;
    return base.SendAsync(request, cancellationToken);
  }
}

Sie könnten dann über eine Hilfsmethode verfügen, um die HttpClient-Instanz mit dem Handler abzurufen:

static HttpClient GetHttpClient(string url, string clientId, string redirectUrl, string version = "v9.2")
{
  try
  {
    HttpMessageHandler messageHandler = new OAuthMessageHandler(url, clientId, redirectUrl, "", "",
    new HttpClientHandler());
    HttpClient httpClient = new HttpClient(messageHandler)
    {
      BaseAddress = new Uri(string.Format("{0}/api/data/{1}/", url, version)),
      Timeout = new TimeSpan(0, 2, 0) //2 minutes
    };
  return httpClient;
  }
  catch (Exception)
  {
    throw;
  }
}

Und schließlich verwenden Sie die Client-Instanz für einen Web-API-Aufruf:

using (HttpClient client = GetHttpClient("https://yourenvname.api.crm.dynamics.com", "51f81489-12ee-4a9e-aaae-a2591f45987d", "http://localhost:8080"))
{
  // Use the WhoAmI function
  var response = client.GetAsync("WhoAmI").Result;
  if (response.IsSuccessStatusCode)
  {
    //Get the response content and parse it.
    JObject body = JObject.Parse(response.Content.ReadAsStringAsync().Result);
    Guid userId = (Guid)body["UserId"];
    Console.WriteLine("Your UserId is {0}", userId);
  }
  else
  {
    Console.WriteLine("The request failed with a status of '{0}'", response.ReasonPhrase);
  }
  Console.WriteLine("Press any key to exit.");
  Console.ReadLine();
}

Sie sollten jetzt einen App registriert haben, die eine Verbindung zu Ihrer Dataverse-Umgebung herstellen kann. Sie verfügen auch über ein einfaches Beispiel für die Verbindung und Verwendung der registrierten App für den Zugriff auf eine Web-API-Operation.