Ab sgcWebSockets 2026.1.0 unterstützt Azure AMQP 1.0 die CBS-Authentifizierung mit SAS-Tokens und JWT.
Azure Service Bus setzt Claims-Based Security (CBS) über AMQP ein, um Sender und Empfänger nach dem ersten SASL-Handshake zu autorisieren. Der Client öffnet einen Management-Link zum Knoten $cbs und sendet eine put-token-Anfrage, die entweder ein Shared-Access-Signature(SAS)-Token oder ein von Microsoft Entra ID ausgestelltes JSON Web Token (JWT) enthält. Sobald der Broker das Token validiert, wird die Autorisierung für ihre Lebensdauer zwischengespeichert, und die Anwendung kann Sender- und Empfänger-Links zu Queues, Topics oder Subscriptions anlegen.
So funktioniert Azure CBS
Azure Service Bus setzt CBS über AMQP ein, um Sender und Empfänger nach dem ersten SASL-Handshake zu autorisieren. Der Client öffnet einen Management-Link zum Knoten $cbs und sendet eine put-token-Anfrage, die entweder ein SAS-Token oder ein von Microsoft Entra ID ausgestelltes JWT enthält. Sobald der Broker das Token validiert, wird die Autorisierung für ihre Lebensdauer zwischengespeichert, und die Anwendung kann Sender- und Empfänger-Links zu Queues, Topics oder Subscriptions anlegen.
Der AMQP1-Client in sgcWebSockets 2026.1.0 automatisiert diesen Ablauf über zwei Hilfsmethoden, die sich für Delphi-Entwickler natürlich anfühlen:
- CreateAzureCbsSasToken baut ein CBS-Sender-/Empfänger-Link-Paar auf, erzeugt ein SAS-Token für die Zielentität und veröffentlicht es an $cbs. Verwende es, wenn du dich mit einer Shared-Access-Policy authentifizierst.
- CreateAzureCbsJWT folgt demselben CBS-Austausch, bezieht aber zuvor mit dem Client-Credentials-Grant ein Access-Token von Microsoft Entra ID (Azure AD), bevor es das JWT an $cbs sendet.
Beide Methoden erfordern eine aktive AMQP-Verbindung und akzeptieren folgende Parameter:
- aName: Bezeichner für das intern erzeugte CBS-Link-Paar.
- aNameSpace und aEntityName: Der Service-Bus-Namespace (ohne das Suffix .servicebus.windows.net) und der Pfad der Queue, des Topics oder der Subscription, der zum Aufbau der Token-Audience verwendet wird.
- aKeyName / aKeyValue: Name und Schlüssel der Shared-Access-Policy für SAS-Tokens. Die Komponente signiert das Token und sendet es mit dem Token-Typ servicebus.windows.net:sastoken.
- aTenant, aApplicationId, aSecret: Microsoft-Entra-(Azure-AD)-Verzeichnis-ID, Anwendungs-(Client-)ID und Client Secret, die zum Anfordern des JWT mit dem Client-Credentials-Flow verwendet werden.
- aListeningPort (JWT): Lokaler HTTP-Port für die OAuth-2.0-Weiterleitung (Standard 8080, wenn nicht angegeben).
- aExpiration und aTimeout: Lebensdauer des ausgestellten Tokens (in Sekunden) und maximale Wartezeit (in Millisekunden) für die CBS-Aushandlung.
- aRaiseIfError: Wenn auf True gesetzt, löst die Methode eine Ausnahme aus, wenn das Beschaffen des Tokens oder die CBS-Antwort fehlschlägt.
Die folgenden Beispiele zeigen, wie du dich mit CBS authentifizierst, bevor du Nachrichten sendest.
// ... create TCP client
oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := False;
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Port := 5671;
oClient.TLS := True;
// ... create AMQP1 protocol client
oAMQP1 := TsgcWSClient_AMQP1.Create(nil);
oAMQP1.Specifications.RFC6455 := False;
oAMQP1.AMQPOptions.Authentication.AuthType := amqp1authSASLAnonymous;
oAMQP1.Client := oClient;
// ... connect and publish SAS token through CBS
oClient.Active := True;
// ... wait till the connection is active and send the authentication
oAMQP1.CreateAzureCbsSasToken('cbs', 'esegece', 'queue1',
'RootManageSharedAccessKey', 'BhJ78+w8kMXhS/eE/nBy0cRzodx9tipbi+ASbAXIaH8=',
3600, 10000, True);
Das nächste Beispiel konzentriert sich ausschließlich auf die Authentifizierung mit Microsoft Entra ID (Azure AD) per JWT. Es zeigt, wie du mit dem Client-Credentials-Flow ein Token anforderst und es an $cbs veröffentlichst, bevor du Links zum Senden oder Empfangen von Nachrichten anlegst.
oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := False;
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Host := 'esegece.servicebus.windows.net';
oClient.Port := 5671;
oClient.TLS := True;
// ... create AMQP1 protocol client
oAMQP1 := TsgcWSClient_AMQP1.Create(nil);
oAMQP1.Specifications.RFC6455 := False;
oAMQP1.AMQPOptions.Authentication.AuthType := amqp1authSASLAnonymous;
oAMQP1.Client := oClient;
// ... connect and publish JWT through CBS
oClient.Active := True;
// ... wait till the connection is active and send the authentication
oAMQP1.CreateAzureCbsJWT('cbs', 'esegece', 'queue1',
'00000000-0000-0000-0000-000000000000', // Tenant ID
'11111111-1111-1111-1111-111111111111', // Application ID
'client-secret', 8080, 3600, 10000, True);
