Создание подтверждения маркеров владения для сменных ключей

Вы можете использовать методы addKey и removeKey, определенные в ресурсах application и servicePrincipal, для программной смены ключей с истекающим сроком действия.

В рамках подтверждения запроса для этих методов проверяется подтверждение владения существующего ключа перед вызовом этих методов. Подтверждение представляется в виде самозаверяющего маркера JWT. Маркер JWT должен быть подписан с использованием закрытого ключа одного из существующих действительных сертификатов приложения. Срок действия маркера не должен превышать 10 минут.

Примечание: Приложения, у которых нет существующих действительных сертификатов (сертификаты еще не добавлены или срок действия всех сертификатов истек), не могут использовать это действие службы. Чтобы вместо этого выполнить обновление, вы можете использовать операцию обновления приложения.

Маркер должен содержать следующие утверждения:

  • aud: аудитория должна быть 00000002-0000-0000-c000-000000000000.
  • iss: издатель должен быть идентификатором приложения или объекта servicePrincipal , который инициирует запрос.
  • nbf: Не раньше времени.
  • exp: время окончания срока действия должно иметь значение nbf + 10 минут.

Для создания этого подтверждения маркера владения можно использовать следующие примеры кода.

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

Вы также можете создать подтверждение с помощью сигнатуры в Azure KeyVault. Важно отметить, что символ заполнения "=" не должен включаться в заголовок JWT и полезные данные, иначе будет возвращена ошибка Authentication_MissingOrMalformed .

Теперь, когда у вас есть подтверждение владения маркером, его можно использовать для выполнения следующего: