Authentifizieren von Benutzern mithilfe eines Application Load Balancers - Elastic Load Balancing

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Authentifizieren von Benutzern mithilfe eines Application Load Balancers

Sie können einen Application Load Balancer so konfigurieren, dass Benutzer auf sichere Weise authentifiziert werden, wenn sie auf ihre Anwendungen zugreifen. So können Sie den Aufwand für das Authentifizieren der Benutzer auf Ihren Load Balancer verlagern, damit sich Ihre Anwendungen auf die Geschäftslogik konzentrieren können.

Die folgenden Anwendungsfälle werden unterstützt:

  • Authentifizieren von Benutzern über einen Identitätsanbieter (IdP), der mit OpenID Connect (OIDC) konform ist

  • Authentifizieren Sie Benutzer über soziale Netzwerke IdPs wie Amazon oder Google über die von Amazon Cognito unterstützten Benutzerpools. FaceBook

  • Authentifizieren Sie Benutzer über Unternehmensidentitäten mithilfe von SAML, OpenID Connect (OIDC) oder OAuth über die von Amazon Cognito unterstützten Benutzerpools.

Vorbereiten der Nutzung eines OIDC-konformen Identitätsanbieters

Gehen Sie wie folgt vor, wenn Sie für Ihren Application Load Balancer einen OIDC-konformen Identitätsanbieter verwenden:

  • Erstellen Sie unter Ihrem Identitätsanbieter eine neue OIDC-App. Das DNS des Identitätsanbieters muss öffentlich auflösbar sein.

  • Sie müssen eine Client-ID und einen Clientschlüssel konfigurieren.

  • Rufen Sie die folgenden Arten von Endpunkten ab, die vom Identitätsanbieter veröffentlicht werden: Autorisierung, Token und Benutzerinformationen. Sie finden diese Informationen in der Konfiguration.

  • Die Identitätsanbieter-Endpunktzertifikate sollten von einer vertrauenswürdigen öffentlichen Zertifizierungsstelle ausgestellt werden.

  • Die DNS-Datensätze für die Endpunkte müssen öffentlich auflösbar sein, auch wenn sie in private IP-Adressen aufgelöst werden.

  • Erlauben Sie je nach Nutzung durch Ihre Benutzer eine der folgenden Umleitungs-URLs in Ihrer Identitätsanbieter-App. Hierbei ist DNS der Domainname Ihres Load Balancers und CNAME der DNS-Alias für Ihre Anwendung:

    • https://DNS/oauth2/idpresponse

    • https://CNAME/oauth2/idpresponse

Vorbereitung für die Verwendung von Amazon Cognito

Die Amazon Cognito Cognito-Integration für Application Load Balancers ist in den folgenden Regionen verfügbar:

  • USA Ost (Nord-Virginia)

  • USA Ost (Ohio)

  • USA West (Nordkalifornien)

  • USA West (Oregon)

  • Kanada (Zentral)

  • Europa (Stockholm)

  • Europa (Milan)

  • Europa (Frankfurt)

  • Europa (Zürich)

  • Europa (Irland)

  • Europe (London)

  • Europe (Paris)

  • Südamerika (São Paulo)

  • Asien-Pazifik (Tokio)

  • Asien-Pazifik (Seoul)

  • Asien-Pazifik (Osaka)

  • Asia Pacific (Mumbai)

  • Asien-Pazifik (Singapur)

  • Asien-Pazifik (Sydney)

  • Asien-Pazifik (Jakarta)

  • Naher Osten (VAE)

  • Naher Osten (Bahrain)

  • Afrika (Kapstadt)

  • Israel (Tel Aviv)

Gehen Sie wie folgt vor, wenn Sie Amazon-Cognito-Benutzerpools für Ihren Application Load Balancer verwenden:

  • Erstellen Sie einen Benutzerpool. Weitere Informationen finden Sie unter Amazon-Cognito-Benutzerpools im Amazon-Cognito-Entwicklerhandbuch.

  • Erstellen Sie einen Benutzerpool-Client. Sie müssen den Client so konfigurieren, dass ein Clientschlüssel generiert wird, der Ablauf zur Code-Erteilung verwendet wird und die gleichen OAuth-Bereiche wie für den Load Balancer unterstützt werden. Weitere Informationen finden Sie unter Konfigurieren eines Benutzerpool-App-Clients im Amazon-Cognito-Entwicklerhandbuch.

  • Erstellen Sie eine Benutzerpool-Domain. Weitere Informationen finden Sie unter Hinzufügen eines Domainnamens für Ihren Benutzerpool im Amazon-Cognito-Entwicklerhandbuch.

  • Überprüfen Sie, ob der angeforderte Bereich ein ID-Token zurückgibt. Beispiel: Der Standardbereich openid gibt ein ID-Token zurück, der Bereich aws.cognito.signin.user.admin hingegen nicht.

    Hinweis: Application Load Balancers unterstützen keine von Amazon Cognito ausgegebenen benutzerdefinierten Zugriffstoken. Weitere Informationen finden Sie unter Pre-Token-Generierung im Amazon Cognito Developer Guide.

  • Aktivieren Sie den Identitätsanbieter im Verbundabschnitt, um einen Verbund mit einem Anbieter von Social Identities bzw. Unternehmensidentitäten einzurichten. Weitere Informationen finden Sie unter Hinzufügen von Social Sign-in zu einem Benutzerpool oder Hinzufügen der Anmeldung mit einem SAML-Identitätsanbieter zu einem Benutzerpool im Amazon-Cognito-Entwicklerhandbuch.

  • Erlauben Sie die folgenden Umleitungs-URLs im Feld für die Rückruf-URL für Amazon Cognito. Hierbei ist DNS der Domainname Ihres Load Balancers und CNAME der DNS-Alias für Ihre Anwendung (falls zutreffend):

    • https://DNS/oauth2/idpresponse

    • https://CNAME/oauth2/idpresponse

  • Erlauben Sie Ihre Benutzerpool-Domain für die Rückruf-URL Ihrer Identitätsanbieter-App. Verwenden Sie das für Ihren Identitätsanbieter erforderliche Format. Beispielsweise:

    • https://domain-prefix.auth.region.amazoncognito.com/saml2/idpresponse

    • https://user-pool-domain/oauth2/idpresponse

Die Callback-URL in den App-Client-Einstellungen darf ausschließlich Kleinbuchstaben enthalten.

Damit ein Benutzer einen Load Balancer für die Verwendung von Amazon Cognito zum Authentifizieren von Benutzern konfigurieren kann, müssen Sie dem Benutzer die Berechtigung zum Aufrufen der Aktion cognito-idp:DescribeUserPoolClient gewähren.

Bereiten Sie sich auf die Nutzung von Amazon vor CloudFront

Aktivieren Sie die folgenden Einstellungen, wenn Sie eine CloudFront Distribution vor Ihrem Application Load Balancer verwenden:

  • Anforderungsheader weiterleiten (alle) — Stellt sicher, dass Antworten für authentifizierte Anfragen CloudFront nicht zwischengespeichert werden. Damit wird vermieden, dass sie nach Ablauf der Authentifizierungssitzung aus dem Zwischenspeicher geladen werden. Um dieses Risiko zu verringern, wenn das Caching aktiviert ist, können Besitzer einer CloudFront Distribution alternativ festlegen, dass der time-to-live (TTL-) Wert abläuft, bevor das Authentifizierungscookie abläuft.

  • Abfragezeichenfolge weiterleiten und zwischenspeichern (alle) – Stellt sicher, dass der Load Balancer Zugriff auf die Abfragezeichenfolgenparameter hat, die für die Authentifizierung des Benutzers beim IdP erforderlich sind.

  • Cookie-Weiterleitung (alle) — Stellt sicher, dass alle Authentifizierungs-Cookies an den Load Balancer CloudFront weitergeleitet werden.

Konfigurieren der Benutzerauthentifizierung

Sie konfigurieren die Benutzerauthentifizierung, indem Sie eine Authentifizierungsaktion für eine oder mehrere Listener-Regeln erstellen. Die Aktionstypen authenticate-cognito und authenticate-oidc werden nur mit HTTPS-Listenern unterstützt. Eine Beschreibung der entsprechenden Felder finden Sie unter AuthenticateCognitoActionConfigund AuthenticateOidcActionConfigin der Elastic Load Balancing API-Referenzversion 2015-12-01.

Der Load Balancer sendet ein Session-Cookie an den Client, um den Authentifizierungsstatus beizubehalten. Dieses Cookie enthält immer das Attribut secure, da die Benutzerauthentifizierung einen HTTPS-Listener erfordert. Dieses Cookie enthält das Attribut SameSite=None mit CORS-Anforderungen (Cross-Origin Resource Sharing).

Für einen Load Balancer, der mehrere Anwendungen unterstützt, die eine unabhängige Client-Authentifizierung verlangen, sollte jede Listener-Regel mit einer Authentifizierungsaktion einen eindeutigen Cookie-Namen haben. Dadurch wird sichergestellt, dass Clients immer beim IdP authentifiziert werden, bevor sie an die in der Regel angegebene Zielgruppe weitergeleitet werden.

Application Load Balancer unterstützen keine Cookie-Werte, die URL-codiert sind.

Das Feld SessionTimeout ist standardmäßig auf 7 Tage festgelegt. Wenn Sie kürzere Sitzungen benötigen, können Sie auch eine Sitzungs-Zeitbeschränkung von bis zu lediglich einer Sekunde konfigurieren. Weitere Informationen finden Sie unter Sitzungs-Timeout.

Legen Sie das Feld OnUnauthenticatedRequest je nach Bedarf für Ihre Anwendung fest. Beispielsweise:

  • Anwendungen, bei denen sich der Benutzer mit einer Social Identity oder Unternehmensidentität anmelden muss: Dies wird von der Standardoption authenticate unterstützt. Wenn der Benutzer nicht angemeldet ist, leitet der Load Balancer die Anforderung an den Identitätsanbieter-Autorisierungsendpunkt weiter. Der Benutzer wird dann vom Identitätsanbieter aufgefordert, sich über die entsprechende Benutzeroberfläche anzumelden.

  • Anwendungen mit einer personalisierten Ansicht für angemeldete Benutzer und einer allgemeinen Ansicht für nicht angemeldete Benutzer: Verwenden Sie die Option allow, um diese Art von Anwendung zu unterstützen. Wenn der Benutzer angemeldet ist, stellt der Load Balancer die Benutzeransprüche bereit und die Anwendung kann eine personalisierte Ansicht anzeigen. Wenn der Benutzer nicht angemeldet ist, leitet der Load Balancer die Anforderung ohne die Benutzeransprüche weiter und die Anwendung kann die allgemeine Ansicht anzeigen.

  • Einseitige Anwendungen JavaScript , die alle paar Sekunden geladen werden — Wenn Sie die deny Option verwenden, gibt der Load Balancer bei AJAX-Aufrufen, die keine Authentifizierungsinformationen enthalten, den Fehler HTTP 401 Unauthorized zurück. Wenn die Authentifizierungsinformationen des Benutzers jedoch abgelaufen sind, wird der Client zum IdP-Autorisierungsendpunkt weitergeleitet.

Der Load Balancer muss mit dem Identitätsanbieter-Tokenendpunkt (TokenEndpoint) und dem Endpunkt mit den Benutzerinformationen (UserInfoEndpoint) des Identitätsanbieters kommunizieren können. Application Load Balancer unterstützen IPv4 nur bei der Kommunikation mit diesen Endpunkten. Wenn Ihr IdP öffentliche Adressen verwendet, stellen Sie sicher, dass die Sicherheitsgruppen für Ihren Load Balancer und die Netzwerk-ACLs für Ihre VPC den Zugriff auf die Endpunkte zulassen. Wenn Sie einen internen Load Balancer oder den IP-Adresstyp verwendendualstack-without-public-ipv4, kann ein NAT-Gateway dem Load Balancer die Kommunikation mit den Endpunkten ermöglichen. Weitere Informationen finden Sie unter Grundlagen zu NAT-Gateways im Amazon-VPC-Benutzerhandbuch.

Verwenden Sie den folgenden create-rule-Befehl, um die Benutzerauthentifizierung zu konfigurieren.

aws elbv2 create-rule --listener-arn listener-arn --priority 10 \ --conditions Field=path-pattern,Values="/login" --actions file://actions.json

Im Folgenden finden Sie ein Beispiel für die actions.json-Datei, die eine authenticate-oidc-Aktion und eine forward-Aktion angibt. AuthenticationRequestExtraParams ermöglicht es Ihnen, während der Authentifizierung zusätzliche Parameter an einen IdP zu übergeben. In der Dokumentation Ihres Identitätsanbieters ist angegeben, welche Felder unterstützt werden.

[{ "Type": "authenticate-oidc", "AuthenticateOidcConfig": { "Issuer": "https://idp-issuer.com", "AuthorizationEndpoint": "https://authorization-endpoint.com", "TokenEndpoint": "https://token-endpoint.com", "UserInfoEndpoint": "https://user-info-endpoint.com", "ClientId": "abcdefghijklmnopqrstuvwxyz123456789", "ClientSecret": "123456789012345678901234567890", "SessionCookieName": "my-cookie", "SessionTimeout": 3600, "Scope": "email", "AuthenticationRequestExtraParams": { "display": "page", "prompt": "login" }, "OnUnauthenticatedRequest": "deny" }, "Order": 1 }, { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-code:account-id:targetgroup/target-group-name/target-group-id", "Order": 2 }]

Unten ist ein Beispiel für die Datei actions.json angegeben, in der die Aktion authenticate-cognito und die Aktion forward enthalten sind.

[{ "Type": "authenticate-cognito", "AuthenticateCognitoConfig": { "UserPoolArn": "arn:aws:cognito-idp:region-code:account-id:userpool/user-pool-id", "UserPoolClientId": "abcdefghijklmnopqrstuvwxyz123456789", "UserPoolDomain": "userPoolDomain1", "SessionCookieName": "my-cookie", "SessionTimeout": 3600, "Scope": "email", "AuthenticationRequestExtraParams": { "display": "page", "prompt": "login" }, "OnUnauthenticatedRequest": "deny" }, "Order": 1 }, { "Type": "forward", "TargetGroupArn": "arn:aws:elasticloadbalancing:region-code:account-id:targetgroup/target-group-name/target-group-id", "Order": 2 }]

Weitere Informationen finden Sie unter Listener-Regeln.

Authentifizierungsfluss

Das folgende Netzwerkdiagramm ist eine visuelle Darstellung dazu, wie ein Application Load Balancer OIDC zur Benutzerauthentifizierung verwendet.

So authentifiziert der Application Load Balancer Benutzer über OIDC

Die folgenden nummerierten Punkte heben die im vorangehenden Netzwerkdiagramm gezeigten Elemente hervor und erläutern sie.

  1. Der Benutzer sendet eine HTTPS-Anforderung an eine Website, die hinter einem Application Load Balancer gehostet wird. Wenn die Bedingungen für eine Regel mit einer Authentifizierungsaktion erfüllt sind, führt der Load Balancer in den Headern der Anforderungen eine Prüfung auf ein Cookie für eine Authentifizierungssitzung durch.

  2. Falls das Cookie nicht vorhanden ist, leitet der Load Balancer den Benutzer an den Identitätsanbieter-Autorisierungsendpunkt um, damit der Benutzer vom Identitätsanbieter authentifiziert werden kann.

  3. Nachdem der Benutzer authentifiziert wurde, wird er vom Identitätsanbieter mit einem Code für die Gewährung der Autorisierung zurück an den Load Balancer gesendet.

  4. Der Load Balancer präsentiert dem IdP-Token-Endpunkt den Code für die Gewährung der Autorisierung.

  5. Nach Erhalt eines gültigen Codes für die Gewährung der Autorisierung stellt der IdP dem Application Load Balancer das ID-Token und das Zugriffstoken zur Verfügung.

  6. Der Application Load Balancer sendet dann das Zugriffstoken an den Endpunkt für Benutzerinformationen.

  7. Der Endpunkt der Benutzerinformationen tauscht das Zugriffstoken gegen Benutzeransprüche aus.

  8. Der Application Load Balancer leitet den Benutzer mit dem AWSELB-Cookie für die Authentifizierungssitzung zur ursprünglichen URI weiter. Da für die meisten Browser in Bezug auf Cookies eine Größenbeschränkung von 4 KB gilt, unterteilt der Load Balancer Anwendungs-Cookie, die größer als 4 KB sind, in mehrere Cookies. Wenn die Gesamtgröße der Benutzeransprüche und des Zugriffstokens, die vom Identitätsanbieter eingehen, über 11 KB liegt, gibt der Load Balancer die HTTP 500-Fehlermeldung an den Client zurück und erhöht die Metrik ELBAuthUserClaimsSizeExceeded.

  9. Der Application Load Balancer validiert das Cookie und leitet die Benutzerinformationen an Ziele in den festgelegten X-AMZN-OIDC-*-HTTP-Headern weiter. Weitere Informationen finden Sie unter Codierung von Benutzeransprüchen und Signaturverifizierung.

  10. Das Ziel sendet eine Antwort zurück an den Application Load Balancer.

  11. Der Application Load Balancer sendet die endgültige Antwort an den Benutzer.

Jede neue Anforderung durchläuft die Schritte 1 bis 11, während nachfolgende Anforderungen die Schritte 9 bis 11 durchlaufen. Das heißt, jede nachfolgende Anforderung beginnt bei Schritt 9, solange das Cookie nicht abgelaufen ist.

Das AWSALBAuthNonce-Cookie wird dem Anforderungsheader hinzugefügt, nachdem sich der Benutzer beim IdP authentifiziert hat. Dies ändert nichts daran, wie der Application Load Balancer Anfragen zur Umleitung vom IdP verarbeitet.

Wenn der Identitätsanbieter ein gültiges Aktualisierungstoken im ID-Token bereitstellt, speichert der Load Balancer das Aktualisierungstoken und nutzt es jeweils zum Aktualisieren der Benutzeransprüche, sobald das Zugriffstoken abgelaufen ist. Dieser Vorgang wird fortgesetzt, bis für die Sitzung der Wert für die Zeitüberschreitung erreicht ist oder die Identitätsanbieter-Aktualisierung fehlschlägt. Wenn sich der Benutzer abmeldet, tritt für die Aktualisierung ein Fehler auf und der Load Balancer leitet den Benutzer an den Identitätsanbieter-Autorisierungsendpunkt weiter. Auf diese Weise kann der Load Balancer Sitzungen verwerfen, nachdem sich der Benutzer abgemeldet hat. Weitere Informationen finden Sie unter Sitzungs-Timeout.

Anmerkung

Der Ablauf des Cookies unterscheidet sich vom Ablauf der Authentifizierungssitzung. Der Ablauf des Cookies ist ein Attribut des Cookies, das auf 7 Tage festgelegt ist. Die tatsächliche Länge der Authentifizierungssitzung wird durch die Sitzungs-Zeitüberschreitung bestimmt, das im Application Load Balancer für das Authentifizierungsfeature konfiguriert wurde. Dieses Sitzungs-Timeout ist im Wert des Authentifizierungs-Cookies enthalten, der ebenfalls verschlüsselt ist.

Codierung von Benutzeransprüchen und Signaturverifizierung

Nachdem der Load Balancer einen Benutzer erfolgreich authentifiziert hat, sendet er die vom Identitätsanbieter erhaltenen Benutzeransprüche an das Ziel. Der Load Balancer signiert den Benutzeranspruch, damit diese Anwendungen die Signatur prüfen und sicherstellen können, dass die Ansprüche vom Load Balancer gesendet wurden.

Der Load Balancer fügt die folgenden HTTP-Header hinzu:

x-amzn-oidc-accesstoken

Das Zugriffstoken des Tokenendpunkts als Klartext

x-amzn-oidc-identity

Das Betrefffeld (sub) vom Endpunkt mit den Benutzerinformationen als Klartext

Hinweis: Der sub-Anspruch ist der beste Weg, um einen bestimmten Benutzer zu identifizieren..

x-amzn-oidc-data

Die Benutzeransprüche im JWT-Format (JSON-Web-Tokens)

Zugriffstoken und Benutzeransprüche unterscheiden sich von den ID-Token. Zugriffstoken und Benutzeransprüche ermöglichen nur den Zugriff auf Serverressourcen, während ID-Token zusätzliche Informationen zur Authentifizierung eines Benutzers enthalten. Der Application Load Balancer erstellt bei der Authentifizierung eines Benutzers ein neues Zugriffstoken und leitet nur die Zugriffstoken und Ansprüche an das Backend weiter, nicht jedoch die ID-Token-Informationen.

Diese Token weisen zwar das JWT-Format auf, sind aber keine ID-Token. Das JWT-Format umfasst einen Header, eine Nutzlast und eine Signatur (jeweils mit base64-URL-Verschlüsselung) und beinhalten Padding-Zeichen am Ende. Ein Application Load Balancer verwendet ES256 (ECDSA verwendet P-256 und SHA256), um die JWT-Signatur zu generieren.

Der JWT-Header ist ein JSON-Objekt mit den folgenden Feldern:

{ "alg": "algorithm", "kid": "12345678-1234-1234-1234-123456789012", "signer": "arn:aws:elasticloadbalancing:region-code:account-id:loadbalancer/app/load-balancer-name/load-balancer-id", "iss": "url", "client": "client-id", "exp": "expiration" }

Die JWT-Nutzlast ist ein JSON-Objekt mit den Benutzeransprüchen, die vom Identitätsanbieterendpunkt mit den Benutzerinformationen empfangen wurden.

{ "sub": "1234567890", "name": "name", "email": "alias@example.com", ... }

Da der Load Balancer die Benutzeransprüche nicht verschlüsselt, empfehlen wir Ihnen, für die Zielgruppe die Nutzung von HTTPS zu konfigurieren. Wenn Sie für Ihre Zielgruppe die Nutzung von HTTP konfigurieren, sollten Sie darauf achten, den Datenverkehr mithilfe von Sicherheitsgruppen auf Ihren Load Balancer zu beschränken.

Um die Sicherheit zu gewährleisten, müssen Sie die Signatur überprüfen, bevor Sie eine Autorisierung auf der Grundlage der Ansprüche vornehmen, und überprüfen, ob das signer Feld im JWT-Header den erwarteten Application Load Balancer Balancer-ARN enthält.

Sie erhalten den öffentlichen Schlüssel, indem Sie die Schlüssel-ID aus dem JWT-Header verwenden, um den öffentlichen Schlüssel aus dem Endpunkt zu suchen. Der Endpunkt für jede AWS -Region lautet wie folgt:

https://public-keys.auth.elb.region.amazonaws.com/key-id

Denn AWS GovCloud (US) die Endpunkte lauten wie folgt:

https://s3-us-gov-west-1.amazonaws.com/aws-elb-public-keys-prod-us-gov-west-1/key-id https://s3-us-gov-east-1.amazonaws.com/aws-elb-public-keys-prod-us-gov-east-1/key-id

Im folgenden Beispiel wird veranschaulicht, wie Sie die Schlüssel-ID, den öffentlichen Schlüssel und die Nutzlast in Python 3.x abrufen:

import jwt import requests import base64 import json # Step 1: Validate the signer expected_alb_arn = 'arn:aws:elasticloadbalancing:region-code:account-id:loadbalancer/app/load-balancer-name/load-balancer-id' encoded_jwt = headers.dict['x-amzn-oidc-data'] jwt_headers = encoded_jwt.split('.')[0] decoded_jwt_headers = base64.b64decode(jwt_headers) decoded_jwt_headers = decoded_jwt_headers.decode("utf-8") decoded_json = json.loads(decoded_jwt_headers) received_alb_arn = decoded_json['signer'] assert expected_alb_arn == received_alb_arn, "Invalid Signer" # Step 2: Get the key id from JWT headers (the kid field) kid = decoded_json['kid'] # Step 3: Get the public key from regional endpoint url = 'https://public-keys.auth.elb.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 4: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES256'])

Im folgenden Beispiel wird veranschaulicht, wie Sie die Schlüssel-ID, den öffentlichen Schlüssel und die Nutzlast in Python 2.7 abrufen:

import jwt import requests import base64 import json # Step 1: Validate the signer expected_alb_arn = 'arn:aws:elasticloadbalancing:region-code:account-id:loadbalancer/app/load-balancer-name/load-balancer-id' encoded_jwt = headers.dict['x-amzn-oidc-data'] jwt_headers = encoded_jwt.split('.')[0] decoded_jwt_headers = base64.b64decode(jwt_headers) decoded_json = json.loads(decoded_jwt_headers) received_alb_arn = decoded_json['signer'] assert expected_alb_arn == received_alb_arn, "Invalid Signer" # Step 2: Get the key id from JWT headers (the kid field) kid = decoded_json['kid'] # Step 3: Get the public key from regional endpoint url = 'https://public-keys.auth.elb.' + region + '.amazonaws.com/' + kid req = requests.get(url) pub_key = req.text # Step 4: Get the payload payload = jwt.decode(encoded_jwt, pub_key, algorithms=['ES256'])
Überlegungen
  • In diesen Beispielen wird nicht behandelt, wie die Signatur des Ausstellers anhand der Signatur im Token überprüft werden kann.

  • Standardbibliotheken sind nicht mit dem Padding kompatibel, das im Application-Load-Balancer-Authentifizierungstoken im JWT-Format enthalten ist.

Zeitüberschreitung

Sitzungs-Timeout

Das Aktualisierungstoken und die Sitzungs-Zeitüberschreitung arbeiten wie folgt zusammen:

  • Wenn das Sitzungstimeout kürzer als die Ablaufzeit des Zugriffstokens ist, berücksichtigt der Load Balancer das Sitzungstimeout. Wenn der Benutzer eine aktive Sitzung mit dem IdP hat, wird der Benutzer möglicherweise nicht aufgefordert, sich erneut anzumelden. Andernfalls wird der Benutzer zur Anmeldung umgeleitet.

    • Wenn das IdP-Sitzungs-Timeout länger als das Application-Load-Balancer-Sitzungs-Timeout ist, muss der Benutzer keine Anmeldeinformationen angeben, um sich erneut anzumelden. Stattdessen leitet der IdP die Anforderung mit einem neuen Code für die Gewährung der Autorisierung zurück zum Application Load Balancer. Autorisierungscodes können nur einmal verwendet werden, auch wenn keine erneute Anmeldung erfolgt.

    • Wenn das IdP-Sitzungs-Timeout gleich lang oder kürzer als das Application-Load-Balancer-Sitzungs-Timeout ist, wird der Benutzer aufgefordert, Anmeldeinformationen einzugeben, um sich erneut anzumelden. Nachdem sich der Benutzer angemeldet hat, leitet der IdP mit einem neuen Code für die Gewährung der Autorisierung die Anforderung zurück zum Application Load Balancer und der Rest des Authentifizierungsvorgangs wird fortgesetzt, bis die Anfrage das Backend erreicht.

  • Wenn das Sitzungs-Timeout länger als die Ablaufzeit des Zugriffstokens ist und der Identitätsanbieter keine Aktualisierungstoken unterstützt, behält der Load Balancer die Authentifizierungssitzung bei, bis sie abgelaufen ist. Anschließend muss der Benutzer sich erneut anmelden.

  • Wenn die Sitzungs-Zeitüberschreitung länger als die Ablaufzeit des Zugriffstokens ist und der Identitätsanbieter Aktualisierungstoken unterstützt, aktualisiert der Load Balancer die Benutzersitzung jedes Mal, wenn das Zugriffstoken abläuft. Der Load Balancer fordert den Benutzer erst zum erneuten Anmelden auf, nachdem für die Authentifizierungssitzung die Zeitüberschreitung erreicht wurde oder der Aktualisierungsablauf fehlgeschlagen ist.

Client-Anmelde-Timeout

Ein Client muss den Authentifizierungsprozess innerhalb von 15 Minuten einleiten und abschließen. Wenn ein Client die Authentifizierung nicht innerhalb der 15-minütigen Frist abschließt, erhält er vom Load Balancer einen HTTP-401-Fehler. Dieses Timeout kann nicht geändert oder entfernt werden.

Wenn ein Benutzer beispielsweise die Anmeldeseite über den Application Load Balancer lädt, muss er den Anmeldevorgang innerhalb von 15 Minuten abschließen. Wenn der Benutzer wartet und dann versucht, sich nach Ablauf des 15-Minuten-Timeouts anzumelden, gibt der Load Balancer einen HTTP-401-Fehler zurück. Der Benutzer muss die Seite aktualisieren und erneut versuchen, sich anzumelden.

Authentifizierung und Abmeldung

Wenn eine Anwendung einen authentifizierten Benutzer abmelden muss, sollte die Ablaufzeit des Cookies für die Authentifizierungssitzung auf „-1“ festgelegt und der Client an den Identitätsanbieteredpunkt für die Abmeldung (falls vom Identitätsanbieter unterstützt) weitergeleitet werden. Um zu verhindern, dass Benutzer ein gelöschtes Cookie wiederverwenden, empfehlen wir Ihnen, die Ablaufzeit für das Zugriffstoken so kurz wie möglich zu konfigurieren. Wenn ein Client für einen Load Balancer ein Sitzungs-Cookie bereitstellt, das über ein abgelaufenes Zugriffstoken mit einem Nicht-NULL-Aktualisierungstoken verfügt, fragt der Load Balancer beim Identitätsanbieter nach, ob der Benutzer noch angemeldet ist.

Die Zielseite zur Client-Abmeldung ist eine nicht authentifizierte Seite. Das bedeutet, dass sie nicht hinter einer Application-Load-Balancer-Regel stehen kann, die eine Authentifizierung erfordert.

  • Wenn eine Anforderung an das Ziel gesendet wird, muss die Anwendung den Ablauf für alle Authentifizierungs-Cookies auf -1 setzen. Application Load Balancer unterstützen Cookies mit einer Größe von bis zu 16 KB und können daher bis zu 4 Shards erstellen, die an den Client gesendet werden.

    • Wenn der IdP einen Abmeldeendpunkt hat, sollte er eine Umleitung zum IdP-Abmeldeendpunkt ausgeben, z. B. zu dem im Amazon-Cognito-Entwicklerhandbuch dokumentierten LOGOUT-Endpunkt.

    • Wenn der IdP keinen Abmeldeendpunkt hat, geht die Anfrage zurück zur Client-Abmelde-Zielseite und der Anmeldevorgang wird neu gestartet.

  • Unter der Annahme, dass der IdP über einen Abmeldeendpunkt verfügt, muss der IdP Zugriffs- und Aktualisierungstoken ablaufen lassen und den Benutzer zurück zur Zielseite für die Client-Abmeldung weiterleiten.

  • Nachfolgende Anforderungen folgen dem ursprünglichen Authentifizierungsablauf.