Generación de tokens de prueba de posesión para claves graduales

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 que no tienen ningún certificado válido existente (aún no se han agregado certificados o todos los certificados han expirado), no pueden usar esta acción de 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 identificador de la aplicación o el objeto servicePrincipal que inicia la solicitud.
  • nbf: no antes de la hora.
  • exp: el tiempo de expiración debe ser el valor de nbf + 10 minutos.

Puede usar los siguientes ejemplos de código para generar este 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);
        }
    }
}

También puede generar la prueba mediante la firma en Azure KeyVault. Es importante tener en cuenta que el carácter de relleno '=' no debe incluirse en el encabezado JWT y la carga o se devolverá un error de Authentication_MissingOrMalformed .

Ahora que tiene su token de prueba de posesión, puede usarlo para: