Generar los tokens de prueba de posesión para las claves sucesivasGenerating proof of possession tokens for rolling keys

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.You can use the addKey and removeKey methods defined on the application and servicePrincipal resources to roll expiring keys programmatically.

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.As part of the request validation for these methods, a proof of possession of an existing key is verified before the methods can be invoked. La prueba se representa mediante un token de JWT autofirmado.The proof is represented by a self-signed JWT token. Este token de JWT debe estar firmado con la clave privada de uno de los certificados válidos existentes de la aplicación.This JWT token must be signed using the private key of one of the application's existing valid certificates. La duración del token no debe superar los 10 minutos.The token lifespan should not exceed 10 minutes.

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.Note: Applications that don’t have any existing valid certificates (no certificates have been added yet, or all certificates have expired), won’t be able to use this service action. En su lugar, puede usar la operación Actualizar aplicación para realizar una actualización.You can use the Update application operation to perform an update instead.

El token debe contener las siguientes notificaciones:The token should contain the following claims:

  • aud - El público debe ser 00000002-0000-0000-c000-000000000000.aud - Audience needs to be 00000002-0000-0000-c000-000000000000.
  • iss - El emisor debe ser el id. de la aplicación que realiza la llamada.iss - Issuer needs to be the id of the application that is making the call.
  • nbf - No antes de tiempo.nbf - Not before time.
  • exp - La fecha de expiración debe ser "nbf" + 10 minutos.exp - Expiration time should be "nbf" + 10 mins.

Puede usar el siguiente ejemplo de código para generar el token de prueba de posesión.You can use the following code example to generate this proof of possession token.

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