Delen via


Algemene concepten

Dit artikel bevat algemene concepten bij het ontwikkelen van toepassingen die gebruikmaken van de Azure Notification Hubs REST API.

Notitie

Om een hoger beveiligingsniveau te garanderen, schakelt Notification Hubs op 30 april 2020 ondersteuning uit voor TLS-versies 1.0 en 1.1. Zie Transport Layer Security (TLS) in de documentatie van Azure Notification Hubs voor meer informatie.

Connection string parseren

Als u toegang wilt krijgen tot een Notification Hub, moet u twee gegevens hebben: de naam van de hub en een connection string. De connection string bevat informatie over het eindpunt van uw hub en de beveiligingsreferenties die worden gebruikt voor toegang (voor SAS bevat deze een regelnaam en een sleutelwaarde).

De volgende code parseert de connection string om de relevante informatie te extraheren:

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

SAS-beveiligingstoken maken

Als u wilt verifiëren met sas, moet een client een SAS-token opgeven in de autorisatieheader van hun aanvragen. Het token wordt samengesteld op basis van de informatie die is geëxtraheerd uit de connection string en de huidige aanvraag die moet worden geverifieerd. Het token heeft de volgende vorm:

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

Het token verwijst naar een keyName (voor het verzenden van meldingen gebruikt u meestal de eigenschap DefaultFullSharedAccessSignature die automatisch wordt gemaakt op alle Notification Hubs).

De handtekening voor het SAS-token wordt berekend met behulp van de HMAC-SHA256 van een tekenreeks-to-sign-waarde met de eigenschap PrimaryKey van een autorisatieregel. De tekenreeks-naar-tekenwaarde bestaat uit een resource-URI en een verloopdatum, die als volgt zijn opgemaakt:

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

Gebruik de niet-gecodeerde resource-URI voor deze bewerking. De resource-URI is de volledige URI van de Service Bus-resource waartoe toegang wordt geclaimd. Het formulier ziet er als volgt uit:

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

Bijvoorbeeld:

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

De vervaldatum wordt weergegeven als het aantal seconden sinds het tijdvak 00:00:00 UTC op 1 januari 1970.

De autorisatieregel voor gedeelde toegang die wordt gebruikt voor ondertekening, moet worden geconfigureerd voor de entiteit die is opgegeven door deze URI. In het vorige voorbeeld is http://contoso.servicebus.windows.net/myHub de URI of http://contoso.servicebus.windows.net.

De resourceURI met URL-codering moet hetzelfde zijn als de URI die wordt gebruikt in de tekenreeks-to-sign tijdens de berekening van de handtekening. Deze moet zijn gecodeerd met procenten en kleine letters.

Met de volgende code, gegeven een aanvraag-URI, wordt een SAS-token gemaakt. De Java-versie maakt gebruik van Apache Commons Codec en de Javascript-versie maakt gebruik van 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;
};