Gerando um token de comprovação de posse para sobrepor chavesGenerating proof of possession tokens for rolling keys

Você pode usar os métodos addKey e removeKey definidos no aplicativo e recursos servicePrincipal para acumular as chaves expiradas por programação.You can use the addKey and removeKey methods defined on the application and servicePrincipal resources to roll expiring keys programmatically.

Como parte da solicitação de validação para esses métodos, uma comprovação de posse de uma chave existente é verificada antes que os métodos possam ser invocados.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. As comprovações são representadas por um token JWT autoassinado.The proof is represented by a self-signed JWT token. Esse token de JWT deve ser assinado usando a chave privada de um dos certificados válidos existentes do aplicativo.This JWT token must be signed using the private key of one of the application's existing valid certificates. O tempo de vida do token não deve exceder 10 minutos.The token lifespan should not exceed 10 minutes.

Observação: Aplicativos que não têm certificados válidos existentes (nenhum certificado foi adicionado ainda, ou todos os certificados expiraram), não poderão usar essa ação de serviço.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. Você pode usar a operação Atualizar aplicativo para executar uma atualização.You can use the Update application operation to perform an update instead.

O token deve conter os seguintes argumentos:The token should contain the following claims:

  • aud – A audiência deve ser 00000002-0000-0000-c000-000000000000.aud - Audience needs to be 00000002-0000-0000-c000-000000000000.
  • iss - O emissor deve ser o ID do aplicativo que está fazendo a chamada.iss - Issuer needs to be the id of the application that is making the call.
  • nbf – Não antes da hora.nbf - Not before time.
  • exp – O tempo de expiração deve ser "nbf" + 10 min.exp - Expiration time should be "nbf" + 10 mins.

Você pode usar o seguinte exemplo de código para gerar esse token de comprovação de posse.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);
        }
    }
}