Partager via


Concepts communs

Cet article fournit des concepts courants lors du développement d’applications qui utilisent l’API REST Azure Notification Hubs.

Notes

Pour garantir un niveau de sécurité élevé, Notification Hubs désactivera la prise en charge des versions 1.0 et 1.1 de TLS à partir du 30 avril 2020. Pour plus d’informations, consultez Tls (Transport Layer Security) dans la documentation Azure Notification Hubs.

Analyser la chaîne de connexion

Pour accéder à un hub de notification, vous devez disposer de deux informations : le nom du hub et une chaîne de connexion. La chaîne de connexion contient des informations sur le point de terminaison de votre hub et les informations d’identification de sécurité utilisées pour y accéder (Pour SAS, elle contient un nom de règle et une valeur de clé).

Le code suivant analyse la chaîne de connexion pour extraire les informations pertinentes :

public partial class ConnectionStringUtility
{
    public string Endpoint { get; private set; }
    public string SasKeyName { get; private set; }
    public string SasKeyValue { get; private set; }

    public ConnectionStringUtility(string connectionString)
    {
        //Parse Connectionstring
        char[] separator = { ';' };
        string[] parts = connectionString.Split(separator);
        for (int i = 0; i < parts.Length; i++)
        {
            if (parts[i].StartsWith("Endpoint"))
                Endpoint = "https" + parts[i].Substring(11);
            if (parts[i].StartsWith("SharedAccessKeyName"))
                SasKeyName = parts[i].Substring(20);
            if (parts[i].StartsWith("SharedAccessKey"))
                SasKeyValue = parts[i].Substring(16);
        }
    }
}
var parts = connectionString.split(';');
if (parts.length != 3)
throw "Error parsing connection string";

parts.forEach(function(part) {
if (part.indexOf('Endpoint') == 0) {
endpoint = 'https' + part.substring(11);
} else if (part.indexOf('SharedAccessKeyName') == 0) {
sasKeyName = part.substring(20);
} else if (part.indexOf('SharedAccessKey') == 0) {
sasKeyValue = part.substring(16);
}
});

Créer un jeton de sécurité SAS

Pour s’authentifier à l’aide de SAS, un client doit spécifier un jeton SAP dans l’en-tête Authorization de ses demandes. Le jeton est construit à partir des informations extraites de la chaîne de connexion et de la requête actuelle qui doit être authentifiée. Le jeton se présente sous la forme suivante :

SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>

Le jeton fait référence à un keyName (pour envoyer des notifications, vous utilisez généralement la propriété DefaultFullSharedAccessSignature qui est créée automatiquement sur tous les hubs de notification).

La signature du jeton SAS est calculée à l’aide du HMAC-SHA256 d’une valeur de chaîne à signer avec la propriété PrimaryKey d’une règle d’autorisation. La valeur de chaîne à signer se compose d’un URI de ressource et d’une expiration, au format suivant :

StringToSign = <resourceURI> + "\n" + expiry;

Utilisez l’URI de ressource non codé pour cette opération. L’URI de ressource est l’URI complet de la ressource Service Bus à laquelle vous souhaitez accéder. Le formulaire est le suivant :

http://<namespace>.servicebus.windows.net/<hubName>

Par exemple :

http://contoso.servicebus.windows.net/myHub

L’échéance est représentée par le nombre de secondes depuis l’époque 00:00:00 UTC 1er janvier 1970.

La règle d’autorisation d’accès partagé utilisée pour la signature doit être configurée sur l’entité spécifiée par cet URI. Dans l’exemple précédent, URI est http://contoso.servicebus.windows.net/myHub ou http://contoso.servicebus.windows.net.

L’URI resourceURI encodé en URL doit être identique à l’URI utilisé dans la chaîne à signer pendant le calcul de la signature. Elle doit être encodée en pourcentage et en minuscules.

Le code suivant, en fonction d’un URI de requête, crée un jeton SAS. La version Java utilise le codec Apache Commons et la version Javascript utilise CryptoJS.

public partial class ConnectionStringUtility
{
    public string getSaSToken(string uri, int minUntilExpire)
    {
        string targetUri = Uri.EscapeDataString(uri.ToLower()).ToLower();

        // Add an expiration in seconds to it.
        long expiresOnDate = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
        expiresOnDate += minUntilExpire * 60 * 1000;
        long expires_seconds = expiresOnDate / 1000;
        String toSign = targetUri + "\n" + expires_seconds;

        // Generate a HMAC-SHA256 hash or the uri and expiration using your secret key.
        MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256);
        BinaryStringEncoding encoding = BinaryStringEncoding.Utf8;
        var messageBuffer = CryptographicBuffer.ConvertStringToBinary(toSign, encoding);
        IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(SasKeyValue, encoding);
        CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer);
        IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer);

        string signature = Uri.EscapeDataString(CryptographicBuffer.EncodeToBase64String(signedMessage));

        return "SharedAccessSignature sr=" + targetUri + "&sig=" + signature + "&se=" + expires_seconds + "&skn=" + SasKeyName;
    }
}
var getSelfSignedToken = function(targetUri, sharedKey, ruleId,
expiresInMins) {
targetUri = encodeURIComponent(targetUri.toLowerCase()).toLowerCase();

// Set expiration in seconds
var expireOnDate = new Date();
expireOnDate.setMinutes(expireOnDate.getMinutes() + expiresInMins);
var expires = Date.UTC(expireOnDate.getUTCFullYear(), expireOnDate
.getUTCMonth(), expireOnDate.getUTCDate(), expireOnDate
.getUTCHours(), expireOnDate.getUTCMinutes(), expireOnDate
.getUTCSeconds()) / 1000;
var tosign = targetUri + '\n' + expires;

// using CryptoJS
var signature = CryptoJS.HmacSHA256(tosign, sharedKey);
var base64signature = signature.toString(CryptoJS.enc.Base64);
var base64UriEncoded = encodeURIComponent(base64signature);

// construct autorization string
var token = "SharedAccessSignature sr=" + targetUri + "&sig="
+ base64UriEncoded + "&se=" + expires + "&skn=" + ruleId;
// console.log("signature:" + token);
return token;
};