Partager via


Pour vous authentifier auprès des espaces de noms, utilisez les jetons web JSON OAuth 2.0 (JWT).

Cet article explique comment s’authentifier auprès de l’espace de noms Azure Event Grid à l’aide de jetons web JSON OAuth 2.0.

Le répartiteur MQTT d’Azure Event Grid prend en charge l’authentification JWT OAuth 2.0, qui permet aux clients de se connecter et de s’authentifier auprès d’un espace de noms Event Grid à l’aide de jetons web JSON émis par n’importe quel fournisseur d’identité, en dehors de l’ID Microsoft Entra.

Prérequis

Pour utiliser l’authentification JWT OAuth 2.0 pour les espaces de noms, vous devez disposer des conditions préalables suivantes :

  • Fournisseur d’identité qui peut émettre des jetons web JSON.
  • Certificat d’autorité de certification qui inclut vos clés publiques utilisées pour valider les jetons clients (Coffre de clés) ou le fichier PEM de vos certificats de clé publique (chargement direct).

Étapes générales

Pour utiliser l’authentification JWT OAuth 2.0 pour les espaces de noms, procédez comme suit :

  1. Créez un espace de noms et configurez ses sous-ressources.

  2. Activez l’identité managée sur votre espace de noms Event Grid.

  3. Configurez les paramètres d’authentification OAuth 2.0 sur votre espace de noms Event Grid en procédant comme suit :

    1. Créez un compte Azure Key Vault qui héberge le certificat d’autorité de certification qui inclut vos clés publiques et ajoutez l’attribution de rôle dans Key Vault pour l’identité managée de l’espace de noms.
    2. Vous pouvez également charger dans le namespace le fichier PEM de vos certificats de clé publique.
  4. Vos clients peuvent se connecter à l’espace de noms Event Grid en utilisant les jetons fournis par votre fournisseur d’identité.

Créez un espace de noms et configurez ses sous-ressources

Suivez les instructions de Démarrage rapide : Publier et s’abonner aux messages MQTT sur l’espace de noms Event Grid avec le portail Azure pour créer un espace de noms et configurer ses sous-ressources. Ignorez les étapes de création du certificat et du client à mesure que les identités clientes proviennent du jeton fourni. Les attributs client sont basés sur les revendications personnalisées dans le jeton client. Les attributs clients sont utilisés dans la requête de groupe client, les variables de modèle de rubrique et la configuration d’enrichissement du routage.

Activer l’identité managée sur votre espace de noms Event Grid

L’espace de noms utilise l’identité managée pour accéder à votre instance Azure Key Vault, pour obtenir le certificat de serveur de votre domaine personnalisé. Utilisez la commande suivante pour activer l’identité managée attribuée par le système sur votre espace de noms Event Grid :

az eventgrid namespace update --resource-group <resource group name> --name <namespace name> --identity "{type:systemassigned}" 

Pour plus d’informations sur la configuration des identités système et attribuées par l’utilisateur en utilisant le Portail Azure, consultez Activer l’identité managée pour un espace de noms Event Grid.

Configurer les paramètres d’authentification JWT OAuth 2.0 sur votre espace de noms Event Grid -Key Vault

Tout d’abord, créez un compte Azure Key Vault, chargez votre certificat de serveur et attribuez à l’identité managée de l’espace de noms un rôle approprié sur le coffre de clés. Ensuite, vous configurez des paramètres d’authentification personnalisés sur votre espace de noms Event Grid à l’aide du portail Azure ou d’Azure CLI. Vous devez d’abord créer l’espace de noms, puis le mettre à jour en procédant comme suit.

Créer un compte Azure Key Vault et charger votre certificat de serveur

  1. Utilisez la commande suivante pour créer un compte Azure Key Vault :

    az keyvault create --name "<your-unique-keyvault-name>" --resource-group "<resource group name>" --location "centraluseuap" 
    
  2. Utilisez la commande suivante pour importer un certificat dans votre Azure Key Vault

    az keyvault certificate import --vault-name "<your-key-vault-name>" -n "<cert name>" -f "<path to your certificate pem file> " 
    

    Remarque

    Votre certificat doit inclure le nom de domaine dans le Subject Alternative Name (SAN) pour DNS. Pour plus d’informations, consultez Tutoriel : Importation d’un certificat dans Azure Key Vault.

Ajouter une attribution de rôle dans Azure Key Vault pour l’identité managée de l’espace de noms

Vous devez fournir un accès à l’espace de noms pour accéder à votre compte Azure Key Vault en procédant comme suit :

  1. Obtenez l’ID du principal d’identité managée par le système de l’espace de noms Event Grid en utilisant de la commande suivante

    $principalId=(az eventgrid namespace show --resource-group <resource group name> --name <namespace name> --query identity.principalId -o tsv) 
    
  2. Obtenez l’ID de votre ressource Azure Key Vault.

    $keyVaultResourceId=(az keyvault show --resource-group <resource group name> --name <your key vault name> --query id -o tsv) 
    
  3. Ajoutez l’attribution de rôle dans Key Vault pour l’identité managée de l’espace de noms.

    az role assignment create --role "Key Vault Certificate User" --assignee $principalId --scope $keyVaultResourceId 
    

    Pour plus d’informations sur l’accès à Key Vault et l’expérience du portail, consultez Fournir un accès aux clés, certificats et secrets Key Vault avec un contrôle d’accès en fonction du rôle Azure.

Utiliser le portail Azure pour configurer l’authentification

  1. Accédez à votre espace de noms Event Grid dans le Portail Azure.

  2. Dans la page espace de noms Event Grid, sélectionnez Configuration dans le menu de gauche.

  3. Dans la section authentification JWT personnalisée, spécifiez les valeurs des propriétés suivantes :

    1. Sélectionnez Activer l’authentification JWT personnalisée.

    2. Émetteur de jeton : entrez la valeur des revendications de l’émetteur des JWT, présentées par les clients MQTT.

    3. Pour le certificat émetteur, sélectionnez À partir d’Azure Key Vault.

      Capture d’écran montrant la sélection de l’option Azure Key Vault de la page Configuration d’un espace de noms Event Grid.

    4. Dans la nouvelle page, spécifiez les valeurs des propriétés suivantes.

      1. URL de certificat: identificateur de certificat du certificat émetteur dans Azure Key Vault que vous avez créé. Vous pouvez choisir Sélectionner un certificat en utilisant un coffre de clés pour sélectionner le certificat et le coffre de clés depuis vos abonnements.

      2. Identité: identité utilisée pour s’authentifier auprès de Key Vault pour accéder au certificat émetteur créé.

      3. Sélectionnez Ajouter.

        Capture d’écran montrant la page Ajouter un certificat émetteur.

  4. Dans la page Configuration, sélectionnez Appliquer.

    Remarque

    Vous pouvez ajouter jusqu’à deux certificats iss à des fins de rotation de certificat/clé.

Utiliser l’interface de ligne de commande Microsoft Azure

Utilisez la commande suivante pour mettre à jour votre espace de noms avec la configuration d’authentification JWT personnalisée.

az resource update \
  --resource-type Microsoft.EventGrid/namespaces \
  --api-version 2024-06-01-preview \
  --ids /subscriptions/1111a1a1-bb2b-cc3c-dd4d-ffffee5e5e5e/resourceGroups/sample-rg/providers/Microsoft.EventGrid/namespaces/sample-namespace \
  --set properties.topicSpacesConfiguration.clientAuthentication='{
    \"customJwtAuthentication\":{
      \"tokenIssuer\":\"sample-issuer\",
      \"issuerCertificates\":[
        {
          \"certificateUrl\":\"https://sample-vault.vault.azure.net/certificates/sample-cert/12345abcdef67890\",
          \"identity\":{
            \"type\":\"UserAssigned\",
            \"userAssignedIdentity\":\"/subscriptions/1111a1a1-bb2b-cc3c-dd4d-ffffee5e5e5e/resourceGroups/sample-rg/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sample-identity\"
          }
        }
      ]
    }
  }'
 

Format JSON Web Token

Les jetons Web JSON doivent comporter des sections d'en-tête JWT, de charge utile JWT et de signature JWT.

En-tête JWT

L’en-tête doit contenir au moins typ et alg champs.  typ doit toujours être JWS et alg doit toujours être RS256. L’en-tête de jeton doit être le suivant :

{
    "typ": "JWT",
    "alg": "RS256"
}

Charge utile JWT

Event Grid nécessite les revendications suivantes : iss, sub, aud, exp, nbf.

Nom Descriptif
iss Émetteur. La valeur dans JWT doit correspondre à l’émetteur dans la configuration de l’espace de noms Event Grid pour l’authentification JWT personnalisée.
sub Objet. La valeur est utilisée comme nom d’identité d’authentification.
aud Audience. La valeur est un tableau de chaînes. La valeur doit contenir un nom d’hôte d’espace de noms Event Grid standard et/ou un domaine personnalisé pour cet espace de noms Event Grid (s’il est configuré). L’audience peut contenir d’autres chaînes, mais nous avons besoin d’au moins l’une de ces chaînes pour être un nom d’hôte d’espace de noms Event Grid standard ou un domaine personnalisé pour cet espace de noms.
exp Expiration. Heure Unix à laquelle JWT expire.
nbf Pas avant. Heure d’unité lorsque JWT devient valide.

Event Grid mappe toutes les revendications aux attributs clients s’ils ont l’un des types suivants : int32, string, array of strings. Les revendications standard iss, sub, aud, exp, nbf sont exclues des attributs clients. Dans l’exemple JWT suivant, seules trois revendications sont converties en attributs clients, num_attr, str_attr, str_list_attr, car elles ont des types corrects int32, string, array of strings.  incorrect_attr_1, incorrect_attr_2, incorrect_attr_3 ne sont pas convertis en attributs clients, car ils ont des types incorrects : float, array of integers, object.

{
    "iss": "correct_issuer",
    "sub": "d1",
    "aud": "testns.mqtt-broker-int.azure.net",
    "exp": 1712876224,
    "nbf": 1712869024,
    "num_attr": 1,
    "str_attr": "some string",
    "str_list_attr": [
        "string 1",
        "string 2"
    ],
    "incorrect_attr_1": 1.23,
    "incorrect_attr_2": [
        1,
        2,
        3
    ],
    "incorrect_attr_3": {
        "field": "value"
    }
}

Configurer les paramètres d’authentification JWT OAuth 2.0 sur votre espace de noms Event Grid - Chargement direct

Dans cette étape, vous allez configurer des paramètres d’authentification JWT personnalisés sur votre espace de noms Event Grid à l’aide du portail Azure et d’Azure CLI. Vous devez d’abord créer l’espace de noms, puis le mettre à jour en procédant comme suit.

Utiliser le portail Azure

  1. Accédez à votre espace de noms Event Grid dans le portail Azure.
  2. Dans la page Espace de noms Event Grid, sélectionnez Configuration dans le menu de gauche.
  3. Dans la section Authentification JWT personnalisée, spécifiez les valeurs des propriétés suivantes :
    1. Sélectionnez Activer l’authentification JWT personnalisée.

    2. Émetteur de jeton : entrez la valeur des revendications de l’émetteur des JWT, présentées par les clients MQTT.

    3. Sélectionnez l’option de certificat de l’émetteur : chargement direct.

      Capture d’écran montrant la sélection de l’option Chargement direct de la page Configuration d’un espace de noms Event Grid.

  4. Dans la nouvelle page, spécifiez les valeurs des propriétés suivantes.
    1. Certificat : chargez votre certificat de serveur au format PEM.

    2. Enfant : identificateur de clé unique pour le certificat.

    3. Sélectionnez Ajouter.

      Capture d'écran qui montre la page de téléversement du certificat de l'émetteur.

  5. Dans la page Configuration, sélectionnez Appliquer.

Utiliser l’interface de ligne de commande Microsoft Azure

Utilisez la commande suivante pour mettre à jour votre espace de noms avec la configuration de l’authentification JWT OAuth 2.0.

az eventgrid namespace update \ 
    --resource-group <resource-group-name> \ 
    --name <namespace-name> \ 
    --api-version 2024-12-15-preview \ 
    --set customJwtAuthenticationSettings='{ 
        "tokenIssuer": "issuer-name", 
        "encodedIssuerCertificates": [
            { 
                "kid": "key1", 
                "encodedCertificate": "-----BEGIN CERTIFICATE-----\n<certificate-in-PEM-format>\n-----END CERTIFICATE-----" 
            } 
        ] 
    } 
  • Remplacez <resource-group-name>, , <namespace-name><location>, <key-vault-name>, et <certificate-name><certificate-in-PEM-format>par vos valeurs réelles.
  • La valeur encodedCertificate doit inclure le certificat complet et la clé publique au format PEM, y compris les en-têtes ( "-----BEGIN CERTIFICATE-----", "-----END CERTIFICATE----, ``-----BEGIN PUBLIC KEY----- and -----END PUBLIC KEY-----).
  • Vérifiez que le certificat de clé publique fourni est valide et approuvé par votre fournisseur d’identité.
  • Mettez régulièrement à jour les encodedIssuerCertificates en cas de rotation ou d’expiration des certificats.

Format JSON Web Token

Les jetons Web JSON doivent comporter des sections d'en-tête JWT, de charge utile JWT et de signature JWT.

Event Grid nécessite les revendications suivantes : iss, sub, aud, exp, nbf.

  • kid est facultatif. S’il est présent, le certificat avec correspondance kid est utilisé pour la validation.
  • Liste des revendications standard qui ne sont pas utilisées en tant qu’attributs - iss, , subaud, exp, nbf, , iat, . jti
  • Toutes les revendications qui ont un type de données correct (nombre qui correspond à int32, chaîne, tableau de chaînes) sont utilisées comme attributs. Dans l’exemple num_attr_pos, num_attr_neg, les str_attrstr_list_attr revendications ont des types de données corrects et sont utilisées comme attributs.
  • Dans l’exemple bool_attr, num_attr_to_big, les num_attr_floatobj_attr revendications ont des types de données incorrects et ne sont pas utilisées comme attributs.
{ 
  "typ": "JWT", 
  "alg": "RS256", 
  "kid": "keyId1" 
}.{ 
  "iss": "some-issuer", 
  "sub": "device1", 
  "aud": "event-grid-namespace.ts.eventgrid.azure.net", 
  "exp": 1770426501, 
  "nbf": 1738886901, 
  "bool_attr": true, 
  "num_attr_pos": 1, 
  "num_attr_neg": -1, 
  "num_attr_to_big": 9223372036854775807, 
  "num_attr_float": 1.23, 
  "str_attr": "str_value", 
  "str_list_attr": [ 
    "str_value_1", 
    "str_value_2" 
  ], 
  "obj_attr": { 
      "key": "value" 
  } 
}