Generar los tokens de prueba de posesión para las claves sucesivas

Puede usar los métodos addKey y removeKey definidos en los recursos aplicación y servicePrincipal para poner en servicio las claves de expiración mediante programación.

Como parte de la validación de solicitud de estos métodos, se verifica una prueba de posesión de una clave existente antes de que se puedan invocar los métodos. La prueba se representa mediante un token de JWT autofirmado. Este token de JWT debe estar firmado con la clave privada de uno de los certificados válidos existentes de la aplicación. La duración del token no debe superar los 10 minutos.

Nota: Las aplicaciones de que no tengan ningún certificado válido existente (sea porque aún no se han agregado o porque ya expiraron todos los certificados) no podrán usar esta acción del servicio. En su lugar, puede usar la operación Actualizar aplicación para realizar una actualización.

El token debe contener las siguientes notificaciones:

  • aud - El público debe ser 00000002-0000-0000-c000-000000000000.
  • iss - El emisor debe ser el ObjectId de Azure AD de la aplicación que realiza la llamada (no el applicationId ni el clientId).
  • nbf - No antes de tiempo.
  • exp - La fecha de expiración debe ser "nbf" + 10 minutos.

Puede usar el siguiente ejemplo de código para generar el token de prueba de posesión.

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

Nota: La prueba se puede generar con otras herramientas, como PowerShell o la firma con Azure KeyVault. Es importante tener en cuenta que el carácter de relleno "=" no debe incluirse en el encabezado del JWT y la carga, o se devolverá un error Authentication_MissingOrMalformed.