Dela via


Vanliga begrepp

Den här artikeln innehåller vanliga begrepp när du utvecklar program som använder REST-API:et för Azure Notification Hubs.

Anteckning

För att säkerställa en högre säkerhetsnivå inaktiverar Notification Hubs stöd för TLS-versionerna 1.0 och 1.1 den 30 april 2020. Mer information finns i TLS (Transport Layer Security) i Azure Notification Hubs-dokumentationen.

Parsa anslutningssträng

För att få åtkomst till en meddelandehubb måste du ha två typer av information: hubbnamnet och en anslutningssträng. Anslutningssträngen innehåller information om hubbens slutpunkt och de säkerhetsautentiseringsuppgifter som används för att komma åt den (för SAS innehåller den ett regelnamn och ett nyckelvärde).

Följande kod parsar anslutningssträngen för att extrahera relevant information:

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

Skapa SAS-säkerhetstoken

För att kunna autentisera med hjälp av SAS måste en klient ange en SAS-token i auktoriseringshuvudet för sina begäranden. Token skapas utifrån den information som extraheras från anslutningssträngen och den aktuella begäran som måste autentiseras. Token har följande formulär:

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

Token refererar till ett keyName (för att skicka meddelanden använder du vanligtvis egenskapen DefaultFullSharedAccessSignature som skapas automatiskt på alla meddelandehubbar).

Signaturen för SAS-token beräknas med hjälp av HMAC-SHA256 för ett sträng-till-tecken-värde med egenskapen PrimaryKey för en auktoriseringsregel. Värdet string-to-sign består av en resurs-URI och en förfallodatum, formaterad enligt följande:

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

Använd den okodade resurs-URI:n för den här åtgärden. Resurs-URI:n är den fullständiga URI:n för Service Bus-resursen som åtkomst begärs till. Formuläret är följande:

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

Exempel:

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

Förfallotiden representeras som antalet sekunder sedan epoken 00:00:00 UTC den 1 januari 1970.

Auktoriseringsregeln för delad åtkomst som används för signering måste konfigureras på den entitet som anges av denna URI. I föregående exempel är http://contoso.servicebus.windows.net/myHub URI eller http://contoso.servicebus.windows.net.

Den URL-kodade resourceURI :n måste vara samma som den URI som används i sträng-till-signera under beräkningen av signaturen. Det ska vara procentkodat och gemener.

Följande kod, givet en begärande-URI, skapar en SAS-token. Java-versionen använder Apache Commons Codec och Javascript-versionen använder 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;
};