Share via


Générer des jetons de preuve de possession pour les clés propagées

Vous pouvez utiliser les méthodes addKey et removeKey définies dans les ressources application et servicePrincipal pour déployer les clés qui expirent par programme.

Dans le cadre de la validation de la demande pour ces méthodes, une preuve de possession d’une clé existante est vérifiée avant que les méthodes ne puissent être invoquées. La preuve est représentée par un jeton JWT auto-signé. Ce jeton JWT doit être signé à l’aide de la clé privée de l’un des certificats valides existants de l’application. La durée de vie du jeton ne doit pas dépasser 10 minutes.

Note: Les applications qui n’ont aucun certificat valide existant (aucun certificat n’a encore été ajouté ou tous les certificats ont expiré) ne peuvent pas utiliser cette action de service. Vous pouvez utiliser l’opération de Mise à jour de l’application pour effectuer une mise à jour à la place.

Le jeton doit contenir les revendications suivantes :

  • aud : l’audience doit être 00000002-0000-0000-c000-000000000000.
  • iss : l’émetteur doit être l’ID de l’application ou de l’objet servicePrincipal qui lance la demande.
  • nbf : Pas avant l’heure.
  • exp : l’heure d’expiration doit être la valeur nbf + 10 minutes.

Vous pouvez utiliser les exemples de code suivants pour générer ce jeton de preuve de possession.

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);
        }
    }
}

Vous pouvez également générer la preuve à l’aide de la signature dans Azure KeyVault. Il est important de noter que le caractère de remplissage '=' ne doit pas être inclus dans l’en-tête JWT et la charge utile, sinon une erreur Authentication_MissingOrMalformed sera retournée.

Maintenant que vous avez votre jeton de preuve de possession, vous pouvez l’utiliser pour :