Konfigurieren Ihrer App Service- oder Azure Functions-App für die Anmeldung über einen „Mit Apple anmelden“-Anbieter (Vorschau)

In diesem Artikel wird beschrieben, wie Sie Azure App Service oder Azure Functions zur Verwendung von „Mit Apple anmelden“ als Authentifizierungsanbieter konfigurieren.

Um das Verfahren in diesem Artikel abzuschließen, müssen Sie sich für das Apple-Entwicklerprogramm registrieren. Wechseln Sie zu developer.apple.com/programs/enroll, um sich für das Apple Developer Program zu registrieren.

Achtung

Wenn Sie die Anmeldung mit Apple aktivieren, wird die Verwaltung des App-Dienstauthentifizierungs- und Autorisierungsfeatures für Ihre Anwendung über einige Clients deaktiviert, z. B. das Azure-Portal, azure CLI und Azure PowerShell. Das Feature basiert auf einer neuen API-Oberfläche, die während der Vorschau noch nicht in allen Verwaltungsumgebungen berücksichtigt wird.

Erstellen einer Anwendung im Apple Developer-Portal

Erstellen Sie eine App-ID und eine Dienst-ID im Apple Developer-Portal.

  1. Navigieren Sie im Apple Developer-Portal zu Certificates, Identifiers, & Profiles (Zertifikate, IDs & Profile).

  2. Wählen Sie auf der Registerkarte Identifiers die Schaltfläche (+) aus.

  3. Wählen Sie auf der Seite Register a New Identifier (Neue ID registrieren) die Option App IDs (App-IDs) und dann Continue (Weiter) aus. App-IDs enthalten eine oder mehrere Dienst-IDs.

    Screenshot der Seite

  4. Geben Sie auf der Seite " App-ID registrieren " eine Beschreibung und eine Bundle-ID an.

  5. Wählen Sie in der Liste "Funktionen" die Option " Mit Apple anmelden " und dann " Weiter" aus. Notieren Sie sich aus diesem Schritt Ihr App-ID-Präfix (Team-ID). Sie benötigen ihn später.

    Screenshot zeigt das Konfigurieren eines neuen App-Bezeichners im Apple Developer Portal.

  6. Überprüfen Sie die App-Registrierungsinformationen, und wählen Sie Register (Registrieren) aus.

  7. Erneut auf der Registerkarte Identifiers die Schaltfläche (+) auswählen.

    Screenshot der Seite

  8. Wählen Sie auf der Seite Register a New Identifier (Neue ID registrieren) die Option Services IDs (Dienst-IDs) und dann Continue (Weiter) aus.

    Screenshot der Seite

  9. Geben Sie auf der Seite Register a Services ID (Dienst-ID registrieren) eine Beschreibung und einen Bezeichner an. Klicken Sie anschließend auf Konfigurieren.

    Screenshot zeigt, wie eine Beschreibung und ein Bezeichner bereitgestellt werden.

    Die Beschreibung ist, was der Benutzer auf dem Zustimmungsbildschirm sieht. Der Bezeichner ist Ihre Client-ID, die beim Konfigurieren des Apple-Anbieters mit Ihrem App-Dienst verwendet wird.

  10. Legen Sie im Dialogfeld die primäre App-ID auf die Zuvor erstellte App-ID fest. Geben Sie im Bereich „Domains“ (Domänen) die Domäne Ihrer Anwendung an. Verwenden Sie als Rückgabe-URL die URL <app-url>/.auth/login/apple/callback. Beispiel: https://contoso.azurewebsites.net/.auth/login/apple/callback. Wählen Sie dann Add (Hinzufügen) und Save (Speichern) aus.

    Screenshot zeigt die Angabe der Domäne und die Rückgabe-URL für die Registrierung.

  11. Überprüfen Sie die Dienstregistrierungsinformationen, und wählen Sie dann "Speichern" aus.

Generieren des geheimen Clientschlüssels

Apple erfordert, dass App-Entwickler ein JSON-Webtoken (JSON Web Token, JWT) als geheimen Clientschlüsselwert erstellen und signieren. Um diesen geheimen Schlüssel zu generieren, erstellen und laden Sie zunächst einen privaten Elliptischen Kurve-Schlüssel über das Apple-Entwicklerportal herunter. Dann verwenden Sie diesen Schlüssel zum Signieren eines JWT mit spezifischen Nutzdaten.

Erstellen und Herunterladen des privaten Schlüssels

  1. Wählen Sie im Apple Developer-Portal auf der Registerkarte Keys (Schlüssel) die Option Create a key (Schlüssel erstellen) oder die Schaltfläche (+) aus.
  2. Geben Sie auf der Seite "Neuen Schlüssel registrieren " dem Schlüssel einen Namen, wählen Sie " Mit Apple anmelden" aus, und wählen Sie "Konfigurieren" aus.
  3. Verknüpfen Sie auf der Seite Configure Key (Schlüssel konfigurieren) den Schlüssel mit der zuvor erstellten primären App-ID, und wählen Sie Save (Speichern) aus.
  4. Beenden Sie die Erstellung des Schlüssels, indem Sie die Informationen bestätigen und "Weiter" auswählen. Überprüfen Sie dann die Informationen, und wählen Sie "Registrieren" aus.
  5. Laden Sie auf der Seite Download Your Key (Ihren Schlüssel herunterladen) den Schlüssel herunter. Es wird als .p8-PKCS#8-Datei heruntergeladen. Sie verwenden den Dateiinhalt, um Ihren geheimen Clientschlüssel JWT zu signieren.

Strukturieren des Client-Secret-JWT

Apple erfordert, dass der geheime Clientschlüssel die Base64-Codierung eines JWT ist. Das decodierte JWT sollte eine Nutzlast wie in diesem Beispiel strukturiert haben:

{
  "alg": "ES256",
  "kid": "URKEYID001",
}.{
  "sub": "com.yourcompany.app1",
  "nbf": 1560203207,
  "exp": 1560289607,
  "iss": "ABC123DEFG",
  "aud": "https://appleid.apple.com"
}.[Signature]
  • sub: Die Apple Client-ID, auch die Dienst-ID
  • iss: Ihre Apple Developer-Team-ID
  • aud: Apple erhält das Token, daher sind sie die Zielgruppe.
  • exp: nicht mehr als sechs Monate nach nbf

Die base64-codierte Version dieser Nutzlast sieht wie folgt aus:

eyJhbGciOiJFUzI1NiIsImtpZCI6IlVSS0VZSUQwMDEifQ.eyJzdWIiOiJjb20ueW91cmNvbXBhbnkuYXBwMSIsIm5iZiI6MTU2MDIwMzIwNywiZXhwIjoxNTYwMjg5NjA3LCJpc3MiOiJBQkMxMjNERUZHIiwiYXVkIjoiaHR0cHM6Ly9hcHBsZWlkLmFwcGxlLmNvbSJ9.ABSXELWuTbgqfrIUz7bLi6nXvkXAz5O8vt0jB2dSHTQTib1x1DSP4__4UrlKI-pdzNg1sgeocolPNTmDKazO8-BHAZCsdeeTNlgFEzBytIpMKFfVEQbEtGRkam5IeclUK7S9oOva4EK4jV4VmgDrr-LGWWO3TaAxAvy3_ZoKohvFFkVG

Hinweis

Apple akzeptiert keine Client-Secret-JWTs mit einem Ablaufdatum, das mehr als sechs Monate nach der Erstellung oder dem nbf-Datum liegt. Sie müssen Ihr Client-Geheimnis mindestens alle sechs Monate ändern.

Weitere Informationen zum Generieren und Überprüfen von Token finden Sie in der Entwicklerdokumentation von Apple.

Signieren des Client-Secret-JWT

Sie verwenden die zuvor heruntergeladene .p8 Datei, um das JWT mit Client-Geheimnis zu signieren. Diese Datei ist eine PKCS#8-Datei , die den privaten Signaturschlüssel im PEM-Format enthält. Das JWT-Token kann in vielen verfügbaren Bibliotheken erstellt und signiert werden.

Es gibt verschiedene Arten von Open-Source-Bibliotheken, die online zum Erstellen und Signieren von JWTs verfügbar sind. Weitere Informationen zum Generieren von JWTs finden Sie unter JSON Web Token (JWT).

Eine Möglichkeit zum Generieren des geheimen Clientschlüssels besteht beispielsweise darin, das NuGet-Paket "Microsoft.IdentityModel.Tokens" zu importieren und den hier gezeigten C#-Code auszuführen:

using Microsoft.IdentityModel.Tokens;

public static string GetAppleClientSecret(string teamId, string clientId, string keyId, string p8key)
{
    string audience = "https://appleid.apple.com";

    string issuer = teamId;
    string subject = clientId;
    string kid = keyId;

    IList<Claim> claims = new List<Claim> {
        new Claim ("sub", subject)
    };

    CngKey cngKey = CngKey.Import(Convert.FromBase64String(p8key), CngKeyBlobFormat.Pkcs8PrivateBlob);

    SigningCredentials signingCred = new SigningCredentials(
        new ECDsaSecurityKey(new ECDsaCng(cngKey)),
        SecurityAlgorithms.EcdsaSha256
    );

    JwtSecurityToken token = new JwtSecurityToken(
        issuer,
        audience,
        claims,
        DateTime.Now,
        DateTime.Now.AddDays(180),
        signingCred
    );
    token.Header.Add("kid", kid);
    token.Header.Remove("typ");

    JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

    return tokenHandler.WriteToken(token);
}
  • teamId: Ihre Apple Developer-Team-ID
  • clientId: Die Apple Client-ID, auch die Dienst-ID
  • p8key: Der PEM-Formatschlüssel. Sie können den Schlüssel abrufen, indem Sie die .p8 Datei in einem Text-Editor öffnen und alles zwischen -----BEGIN PRIVATE KEY----- und -----END PRIVATE KEY----- ohne Zeilenumbrüche kopieren.
  • keyId: die ID des heruntergeladenen Schlüssels

Dieses zurückgegebene Token ist der geheime Clientschlüsselwert, den Sie zum Konfigurieren des Apple-Anbieters verwenden.

Wichtig

Das Client-Geheimnis ist ein wichtiger Sicherheitsnachweis. Teilen Sie dieses Geheimnis nicht mit jemandem und verbreiten Sie es nicht in einer Clientanwendung.

Fügen Sie das Clientgeheimnis als Anwendungseinstellung für die App hinzu, und verwenden Sie dabei einen Einstellungsnamen Ihrer Wahl. Notieren Sie sich diesen Namen zur späteren Verwendung.

Hinzufügen von Anbieterinformationen zu Ihrer Anwendung

Hinweis

Die erforderliche Konfiguration ist in einem neuen API-Format verfügbar, das derzeit nur durch eine dateibasierte Konfiguration (Vorschau)unterstützt wird. Sie müssen die hier aufgeführten Schritte ausführen, um eine solche Datei zu verwenden.

In diesem Abschnitt wird die Aktualisierung der Konfiguration beschrieben, um Ihren neuen IDP einzuschließen. Im Folgenden ist eine Beispielkonfiguration aufgeführt.

  1. Fügen Sie im identityProviders Objekt ein apple Objekt hinzu, wenn noch kein Objekt vorhanden ist.

  2. Weisen Sie dem Schlüssel ein Objekt mit einem darin enthaltenen Objekt registration und optional ein Objekt login zu:

    "apple" : {
       "registration" : {
            "clientId": "<client ID>",
            "clientSecretSettingName": "APP_SETTING_CONTAINING_APPLE_CLIENT_SECRET" 
        },
       "login": {
             "scopes": []
       }
    }
    
  3. Setzen Sie im registration-Objekt die clientId auf die gesammelte Client-ID.

  4. Setzen Sie im registration-Objekt clientSecretSettingName auf den Namen der Anwendungseinstellung, in der Sie das Clientgeheimnis gespeichert haben.

  5. login Im Objekt können Sie festlegen, dass das scopes Array eine Liste von Bereichen enthält, die bei der Authentifizierung mit Apple verwendet werden, z. B. Name und E-Mail. Wenn Bereiche konfiguriert sind, werden sie explizit auf dem Einwilligungsbildschirm angefordert, wenn sich Benutzer*innen zum ersten Mal anmelden.

Nachdem Sie diese Konfiguration festgelegt haben, können Sie Ihren Apple-Anbieter für die Authentifizierung in Ihrer App verwenden.

Eine vollständige Konfiguration kann wie im folgenden Beispiel aussehen, in dem die APPLE_GENERATED_CLIENT_SECRET Einstellung auf eine Anwendungseinstellung verweist, die einen generierten JWT enthält:

{
    "platform": {
        "enabled": true
    },
    "globalValidation": {
        "redirectToProvider": "apple",
        "unauthenticatedClientAction": "RedirectToLoginPage"
    },
    "identityProviders": {
        "apple": {
            "registration": {
                "clientId": "com.contoso.example.client",
                "clientSecretSettingName": "APPLE_GENERATED_CLIENT_SECRET"
            },
            "login": {
                "scopes": []
            }
        }
    },
    "login": {
        "tokenStore": {
            "enabled": true
        }
    }     
}