Generieren von Besitznachweistoken für rollierende Schlüssel

Sie können die Methoden addKey und removeKey verwenden, die für die Anwendung definiert sind, sowie die Ressourcen servicePrincipal für das programmgesteuerte Rollover von auslaufenden Schlüsseln.

Im Rahmen der Anforderungsüberprüfung für diese Methoden wird ein Besitznachweis eines vorhandenen Schlüssels überprüft, bevor die Methoden aufgerufen werden können. Der Nachweis wird durch ein selbstsigniertes JWT-Token dargestellt. Dieses JWT-Token muss mit dem privaten Schlüssel eines der vorhandenen gültigen Zertifikate der Anwendung signiert werden. Die Existenzdauer des Tokens sollte 10 Minuten nicht überschreiten.

Hinweis: Anwendungen, die keine gültigen Zertifikate besitzen (es wurden noch keine Zertifikate hinzugefügt oder alle Zertifikate sind abgelaufen), können diese Dienstaktion nicht nutzen. Sie können den Vorgang Anwendung aktualisieren verwenden, um stattdessen ein Update durchzuführen.

Das Token sollte den folgenden Anforderungen enthalten:

  • aud – Benutzergruppe muss 00000002-0000-0000-c000-000000000000 sein.
  • iss – Aussteller muss die Azure AD-Objekt-ID der Anwendung sein, die den Aufruf vornimmt (nicht applicationId oder clientId).
  • nbf – Nicht vor der Zeit.
  • exp – Ablaufzeit sollte „nbf“ + 10 Minuten sein.

Sie können das folgende Codebeispiel verwenden, um diesen Besitznachweistoken zu generieren.

using System;
using System.Collections.Generic;
using System.Security.Cryptography.X509Certificates;
using Microsoft.IdentityModel.Tokens;
using Microsoft.IdentityModel.JsonWebTokens;

namespace MicrosoftIdentityPlatformProofTokenGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            // Configure the following
            string pfxFilePath = "<Path to your certificate file";
            string password = "<Certificate password>";
            string objectId = "<id of the application or servicePrincipal object>";

            // Get signing certificate
            X509Certificate2 signingCert = new X509Certificate2(pfxFilePath, password);

            // audience
            string aud = $"00000002-0000-0000-c000-000000000000";

            // aud and iss are the only required claims.
            var claims = new Dictionary<string, object>()
            {
                { "aud", aud },
                { "iss", objectId }
            };

            // token validity should not be more than 10 minutes
            var now = DateTime.UtcNow;
            var securityTokenDescriptor = new SecurityTokenDescriptor
            {
                Claims = claims,
                NotBefore = now,
                Expires = now.AddMinutes(10),
                SigningCredentials = new X509SigningCredentials(signingCert)
            };

            var handler = new JsonWebTokenHandler();
            var x = handler.CreateToken(securityTokenDescriptor);
            Console.WriteLine(x);
        }
    }
}

Hinweis: Der Nachweis kann mit anderen Tools generiert werden, z. B. PowerShell oder Signatur mithilfe von Azure KeyVault. Es ist wichtig zu beachten, dass das Auffüllzeichen "=" nicht im JWT-Header und der Nutzlast enthalten sein darf. Andernfalls wird ein Authentication_MissingOrMalformed Fehler zurückgegeben.