Gerar a prova de tokens de posse para chaves de rolamento

Você pode usar os métodos addKey e removeKey definidos no aplicativo e recursos servicePrincipal para acumular as chaves expiradas por programação.

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 comprovações são representadas por um token JWT autoassinado. Esse token de JWT deve ser assinado usando a chave privada de um dos certificados válidos existentes do aplicativo. O tempo de vida do token não deve exceder 10 minutos.

Nota: Aplicativos que não têm certificados válidos existentes (nenhum certificado foi adicionado ainda ou todos os certificados expiraram), não podem usar essa ação de serviço. Você pode usar a operação Atualizar aplicativo para executar uma atualização.

O token deve conter os seguintes argumentos:

  • aud: O público precisa ser 00000002-0000-0000-c000-000000000000.
  • iss: o emissor deve ser a ID do aplicativo ou do objeto servicePrincipal que inicia a solicitação.
  • nbf: não antes do tempo.
  • exp: o tempo de expiração deve ser o valor de nbf + 10 minutos.

Você pode usar os exemplos de código a seguir para gerar esse token de prova de posse.

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

Você também pode gerar a prova usando a assinatura no Azure KeyVault. É importante observar que o caractere de preenchimento '=' não deve ser incluído no cabeçalho JWT e na carga ou um erro de Authentication_MissingOrMalformed será retornado.

Agora que você tem seu token de prova de posse, você pode usá-lo para: