Allgemeine Konzepte
Dieser Artikel enthält allgemeine Konzepte für die Entwicklung von Anwendungen, die die Azure Notification Hubs-REST-API verwenden.
Hinweis
Um eine höhere Sicherheitsstufe zu gewährleisten, deaktiviert Notification Hubs Unterstützung für die TLS-Versionen 1.0 und 1.1 am 30. April 2020. Weitere Informationen finden Sie unter Transport Layer Security (TLS) in der Dokumentation zu Azure Notification Hubs.
Analysieren der Verbindungszeichenfolge
Für den Zugriff auf einen Notification Hub benötigen Sie zwei Informationen: den Hubnamen und eine Verbindungszeichenfolge. Die Verbindungszeichenfolge enthält Informationen zum Endpunkt Ihres Hubs und zu den Sicherheitsanmeldeinformationen, die für den Zugriff darauf verwendet werden (für SAS enthält sie einen Regelnamen und einen Schlüsselwert).
Der folgende Code analysiert die Verbindungszeichenfolge, um die relevanten Informationen zu extrahieren:
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);
}
});
Erstellen eines SAS-Sicherheitstokens
Um sich mit SAS zu authentifizieren, muss ein Client ein SAS-Token im Autorisierungsheader seiner Anforderungen angeben. Das Token wird aus den Informationen erstellt, die aus der Verbindungszeichenfolge und der aktuellen Anforderung extrahiert wurden, die authentifiziert werden muss. Das Token hat die folgende Form:
SharedAccessSignature sig=<signature-string>&se=<expiry>&skn=<keyName>&sr=<URL-encoded-resourceURI>
Das Token bezieht sich auf einen keyName (zum Senden von Benachrichtigungen verwenden Sie in der Regel die DefaultFullSharedAccessSignature-Eigenschaft , die automatisch auf allen Notification Hubs erstellt wird).
Die Signatur für das SAS-Token wird mithilfe des HMAC-SHA256 eines Zeichenfolgen-zu-Sign-Werts mit der PrimaryKey-Eigenschaft einer Autorisierungsregel berechnet. Der Zeichenfolgen-zu-Sign-Wert besteht aus einem Ressourcen-URI und einem Ablaufdatum, der wie folgt formatiert ist:
StringToSign = <resourceURI> + "\n" + expiry;
Verwenden Sie den nicht codierten Ressourcen-URI für diesen Vorgang. Der Ressourcen-URI ist der vollständige URI der Service Bus-Ressource, auf die der Zugriff beansprucht wird. Das Formular lautet wie folgt:
http://<namespace>.servicebus.windows.net/<hubName>
Beispiel:
http://contoso.servicebus.windows.net/myHub
Der Ablaufwert wird als die Anzahl der Sekunden seit dem 1. Januar 1970 um 00:00:00 UTC dargestellt.
Die für die Signatur verwendete Autorisierungsregel für den gemeinsamen Zugriff muss für die durch diesen URI angegebene Entität konfiguriert werden. Im vorherigen Beispiel ist http://contoso.servicebus.windows.net/myHub
der URI oder http://contoso.servicebus.windows.net
.
Der URL-codierte resourceURI muss mit dem URI übereinstimmen, der während der Berechnung der Signatur in der Zeichenfolge verwendet wird. Es sollte prozentcodiert und kleingeschrieben sein.
Der folgende Code erstellt bei Angabe eines Anforderungs-URI ein SAS-Token. Die Java-Version verwendet den Apache Commons-Codec, und die Javascript-Version verwendet 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;
};