Zum Hauptinhalt springen

Individuelles Captive Portal: HTML- und CSS-Leitfaden

Dieser maßgebliche technische Referenzleitfaden beschreibt die Entwicklungsstandards, die CSS-Architektur und die Einschränkungen auf Netzwerkebene, die für den Entwurf und die Codierung einer benutzerdefinierten Captive Portal Landingpage erforderlich sind. Er bietet Frontend-Entwicklern und Netzwerkarchitekten umsetzbare Strategien zur Navigation in Apple CNA- und Android-Webview-Umgebungen, um pixelgenaue, konforme und hochperformante Gäste-WiFi-Erlebnisse zu gewährleisten.

Von Tom HackettVeröffentlicht
📖 11 Min. Lesezeit2,768 Wörter2 ausgearbeitete Beispiele3 Übungsfragen8 Schlüsseldefinitionen

Video overview

Diesen Leitfaden anhören

Podcast-Transkript ansehen
Custom Captive Portal: HTML- und CSS-Leitfaden — Ein Purple Technical Briefing [INTRODUCTION] Willkommen zur Purple Technical Briefing-Reihe. Heute widmen wir uns einem Thema, das jede einzelne Gast-WiFi-Bereitstellung betrifft — dem Captive Portal. Konkret geht es darum, wie Sie sauberes, zuverlässiges HTML und CSS für eine benutzerdefinierte Captive Portal Landingpage schreiben. Wenn Sie sich jemals mit dem Hotel-WiFi verbunden haben und von einer fehlerhaften Splash-Page begrüßt wurden — fehlende Bilder, unformatierter Text, ein Login-Button, der nicht auf Berührung reagiert —, haben Sie erlebt, was passiert, wenn ein Entwickler ein Portal erstellt, ohne die Einschränkungen der Umgebung zu verstehen, in der es ausgeführt wird. Heute werden wir dafür sorgen, dass Ihnen das nicht passiert. Dieses Briefing richtet sich an Frontend-Entwickler, Creative Designer und Webentwickler, die entweder ein Captive Portal von Grund auf neu erstellen oder eine bestehende Vorlage anpassen. Wir behandeln die HTML-Struktur, die entscheidenden CSS-Regeln, die Einschränkungen des Apple CNA-Mini-Browsers, über die selbst erfahrene Entwickler stolpern, und wie Plattformen wie der Portal-Builder von Purple diese Komplexität fast vollständig beseitigen können. Lassen Sie uns direkt einsteigen. [TECHNICAL DEEP-DIVE] Lassen Sie uns zunächst klären, was ein Captive Portal auf Netzwerkebene eigentlich ist. Wenn sich ein Gerät mit einem WiFi-Netzwerk verbindet, das eine Authentifizierung erfordert, fängt das Netzwerk den HTTP-Datenverkehr ab und leitet den Benutzer auf eine Landingpage weiter. Dies ist das Captive Portal. Der Benutzer sieht eine Splash-Page, führt eine Aktion aus — Eingabe einer E-Mail-Adresse, Akzeptieren von Bedingungen, Anmeldung über Social Media — und das Netzwerk gewährt anschließend vollen Internetzugang. Der entscheidende Punkt ist, wo diese Seite gerendert wird. Auf iOS-Geräten öffnet sie sich innerhalb des Captive Network Assistant von Apple — dem CNA —, bei dem es sich um eine abgespeckte WebKit-Webview handelt. Es ist nicht Safari. Es hat keine persistenten Cookies. Es kann keine externen Ressourcen laden. Es verfügt über eine eingeschränkte JavaScript-Unterstützung. Und es schließt sich in dem Moment, in dem der Benutzer zu einer anderen App wechselt. Auf macOS rendert der CNA mit einer festen Auflösung von 900 mal 572 Pixeln. Auf Android nutzen moderne Geräte Chrome Custom Tabs, die wesentlich leistungsfähiger sind. Windows 10 öffnet den Standardbrowser des Benutzers. Samsung-Geräte verwenden Samsung Internet. Diese Plattformfragmentierung ist die mit Abstand größte Ursache für fehlerhafte Captive Portale im Live-Betrieb. Entwickler testen auf ihrem Android-Handy, alles sieht großartig aus, und dann erhalten die iPhone-nutzenden Gäste des Hotels einen weißen Bildschirm mit unformatiertem Text. Sprechen wir also darüber, wie man defensiv programmiert. Die goldene Regel für Captive Portal HTML und CSS lautet: Behandeln Sie die Seite so, als gäbe es keine Internetverbindung. Denn während der Authentifizierungsphase gibt es keine. Das Netzwerk ist gefangen (captive). Jede Ressource, die Ihre Seite von einer externen URL zu laden versucht — eine Google-Schriftart, ein auf einem CDN gehostetes Stylesheet, eine JavaScript-Bibliothek, ein Logo-Bild —, wird geräuschlos fehlschlagen oder eine Ladeschnecke verursachen, die sich endlos dreht. Beginnen Sie mit der HTML-Struktur. Ihr Dokument sollte eine saubere HTML5-Seite sein. Im Head-Bereich benötigen Sie ein Viewport-Meta-Tag mit dem Inhalt width equals device-width und initial-scale equals one. Dies ist für das mobile Rendering unverzichtbar. Ohne dieses Tag rendert iOS die Seite mit einer Breite von 980 Pixeln und skaliert sie herunter, wodurch alles mikroskopisch klein dargestellt wird. Ihr CSS muss inline sein - entweder in einem Style-Block innerhalb des Head-Elements oder als Inline-Style-Attribute direkt an den einzelnen Elementen. Verwenden Sie kein externes Stylesheet, das über ein Link-Tag eingebunden ist. Dieses Stylesheet liegt auf Ihrem Server, den das Captive Portal während der Authentifizierung nicht erreichen kann. Die Seite würde völlig unformatiert gerendert. Verwenden Sie für Schriftarten einen System-Font-Stack. Etwas wie: font-family - apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif. Dies weist den Browser an, die jeweils verfügbare System-Schriftart zu nutzen. Verwenden Sie keine Google Fonts. Der Import-Aufruf wird fehlschlagen und Ihre Fallback-Schriftart wird Times New Roman sein, was nicht dem Markenerlebnis entspricht, für das Ihr Kunde bezahlt. Für Bilder - Ihr Logo, Hintergrundgrafiken, dekorative Elemente - haben Sie zwei Optionen. Entweder Sie stellen sie über denselben Captive Portal Server bereit, was bedeutet, dass sie sich im selben lokalen Netzwerk befinden und vor Abschluss der Authentifizierung zugänglich sind. Oder, noch besser, Sie codieren sie als Base64-Daten-URIs direkt in Ihrem HTML oder CSS. Dies eliminiert die externe Abhängigkeit vollständig. Lassen Sie uns nun über das Seitenlayout sprechen. Da über neunzig Prozent der Logins über ein Captive Portal auf mobilen Geräten stattfinden, sollte Ihr Design Mobile-First sein. Das bedeutet ein einspaltiges Layout mit einer maximalen Breite von etwa 480 Pixeln, zentriert auf der Seite. Verwenden Sie Flexbox auf dem Body-Element - display flex, flex-direction column, align-items centre, justify-content centre, min-height 100 viewport height. Dadurch wird Ihre Inhaltskarte auf jeder Bildschirmgröße vertikal und horizontal zentriert. Ihre primäre Call-to-Action-Schaltfläche muss touchfreundlich sein. Die Human Interface Guidelines von Apple schreiben ein Mindest-Tippziel von 44 mal 44 Pixeln vor. In der Praxis empfiehlt sich für einen primären CTA eine Höhe von eher 48 Pixeln, die volle Breite innerhalb des Containers und ein Border-Radius von etwa 8 bis 12 Pixeln. Setzen Sie für Formularfelder - E-Mail-Eingabe, Namenseingabe - die Schriftgröße auf mindestens 16 Pixel. Dies ist entscheidend. Windows, iOS Safari und die CNA zoomen automatisch in jedes Eingabefeld mit einer Schriftgröße unter 16 Pixeln hinein, was Ihr sorgfältig gestaltetes Layout zunichte macht. Eine Schriftgröße von 16 Pixeln oder mehr verhindert dieses Zoom-Verhalten. Der Bereich für die rechtliche Einwilligung verdient besondere Aufmerksamkeit. Unter der GDPR müssen Sie, wenn Sie personenbezogene Daten erheben - und sei es nur eine E-Mail-Adresse -, eine ausdrückliche, informierte Einwilligung einholen. Dies bedeutet ein Kontrollkästchen, das standardmäßig nicht aktiviert ist, mit einer sichtbaren Beschriftung, die klar angibt, worin der Nutzer einwilligt. Aktivieren Sie das Kontrollkästchen nicht im Voraus. Das Kontrollkästchen für die Einwilligung muss selbst ohne Scrollen deutlich sichtbar sein. Nun zu einem kritischen Implementierungsdetail, das speziell für iOS CNA gilt. Wenn der Benutzer die Authentifizierung abschließt, überwacht die CNA, ob die Captive-Domain zugänglich geworden ist. Die Überprüfung wird durch eine vollständige Seitennavigation ausgelöst, nicht durch JavaScript AJAX-Aufrufe. Das bedeutet: Wenn Sie eine Single-Page-App entwickeln, die das Formular über fetch oder XMLHttpRequest übermittelt und das DOM ohne vollständige Seitenweiterleitung aktualisiert, wird die CNA nie erkennen, dass die Authentifizierung abgeschlossen ist. Sie müssen nach der Authentifizierung zu einer neuen URL weiterleiten - eine vollständige HTTP-Weiterleitung, keine JavaScript DOM-Manipulation. Dies ist einer der häufigsten Fehler bei der Entwicklung von Captive Portals. Halten Sie JavaScript so minimal wie möglich. Die CNA bietet nur eingeschränkte JS-Unterstützung und keinen Zugriff auf localStorage oder sessionStorage. Cookies werden gelöscht, wenn die CNA geschlossen wird. Jedes Zustandsmanagement, das auf diesen Browser-APIs basiert, wird fehlschlagen. Vanilla JavaScript Event Listener sind in Ordnung. jQuery ist eine externe Abhängigkeit von 30 Kilobyte, deren Laden fehlschlagen wird. [IMPLEMENTIERUNGSEMPFEHLUNGEN UND STOLPERSTEINE] Hier ist die praktische Checkliste für die Implementierung. Erstens: Viewport-Meta-Tag, immer. Zweitens: Gesamtes CSS inline, keine externen Stylesheets. Drittens: Alle Bilder werden entweder vom Captive Portal Server bereitgestellt oder sind Base64-kodiert. Viertens: System-Schriftarten, keine Webfonts. Fünftens: Mindestens 16 Pixel Schriftgröße in allen Eingabefeldern. Sechstens: Touch-freundliche Tippziele, mindestens 44 mal 44 Pixel. Siebtens: Einspaltiges Layout, maximale Breite 480 Pixel. Achtens: Vollständige Seitenweiterleitung bei der Authentifizierung, keine JavaScript-Zustandsaktualisierung. Neuntens: DSGVO-konformes Zustimmungs-Kontrollkästchen, standardmäßig deaktiviert. Zehntens: Testen Sie auf einem echten iOS-Gerät in einem tatsächlichen Captive-Netzwerk, nicht in einer Browser-Vorschau. Die Fehler, die ich in der Praxis am häufigsten sehe. Erstens: Google Fonts - entfernen Sie den Import, er wird fehlschlagen. Zweitens: Externe JavaScript-Bibliotheken - Bootstrap, jQuery, jedes über CDN gehostete Skript wird fehlschlagen. Drittens: In einem externen Stylesheet deklarierte CSS-Variablen - sie müssen sich in Ihrem Inline-Style-Block befinden. Viertens: Hintergrundbilder, auf die per URL verwiesen wird - kodieren Sie diese mit Base64. Fünftens: AJAX-Formularübermittlung ohne Weiterleitung nach der Authentifizierung - die CNA wird den Abschluss der Authentifizierung nicht erkennen. Nun zu der ehrlichen Diskussion über das Selberbauen im Vergleich zum Kaufen. Der Aufbau eines maßgeschneiderten Captive Portals von Grund auf bedeutet, dass Sie auch für die Backend-Infrastruktur verantwortlich sind - den RADIUS-Server, die Datenbank, das SSL-Zertifikat, die DNS-Konfiguration, die Netzwerkintegration mit Ihren Access Points und das laufende Einspielen von Sicherheits-Patches. Dies ist ein erheblicher technischer Aufwand. Der Portal Builder von Purple bietet Ihnen eine Drag-and-Drop-Oberfläche mit einem benutzerdefinierten HTML- und CSS-Editor für Entwickler, die eine pixelgenaue Kontrolle benötigen, während er die gesamte Backend-Infrastruktur übernimmt - die Authentifizierung, die Datenerfassung, die Analysen, die DSGVO-Compliance-Tools und die Netzwerkintegrationen mit über 200 Access Point-Herstellern. Sie erhalten die kreative Kontrolle ohne den Aufwand für die Infrastruktur. [SCHNELLE FRAGEN UND ANTWORTEN] Kann ich CSS Grid in einem Captive Portal verwenden? Ja, aber testen Sie dies speziell auf dem iOS CNA. Flexbox bietet eine breitere Unterstützung in älteren WebKit-Versionen. Kann ich SVG-Logos verwenden? Ja, Inline-SVGs werden vollständig unterstützt und sind gegenüber Base64-codierten PNGs für Logos vorzuziehen, da sie auf Retina-Displays perfekt skalieren. Unterstützt der macOS CNA dieselben Einschränkungen wie der iOS CNA? Im Großen und Ganzen ja, mit einem Unterschied: Der macOS CNA wird in einem festen Fenster von 900 mal 572 Pixeln gerendert. Kann ich ein CSS-Framework wie Tailwind verwenden? Nur, wenn Sie eine bereinigte, eigenständige CSS-Datei erstellen und diese direkt in Ihren Style-Block einfügen. Wie sieht es mit HTTPS aus? Ihr Captive Portal muss über HTTP bereitgestellt werden, damit die erste Weiterleitung funktioniert - HTTPS-Verbindungen können vom Captive-Netzwerk nicht abgefangen werden. [ZUSAMMENFASSUNG UND NÄCHSTE SCHRITTE] Um das heutige Briefing zusammenzufassen: Ein benutzerdefiniertes Captive Portal ist eine eingeschränkte Web-Umgebung und kein Standard-Browser-Kontext. Der Apple CNA und die Android Webviews legen strenge Einschränkungen für externe Ressourcen, Cookies, JavaScript und den Sitzungsstatus fest. Die Lösung besteht darin, eigenständige HTML-Seiten mit Inline-CSS, System-Schriftarten, Base64-codierten Bildern und ganzseitigen Weiterleitungen bei der Authentifizierung zu erstellen. Für Betreiber von Veranstaltungsorten und IT-Teams, die ihre Optionen abwägen: Wenn Ihre Anforderung ein vollständig gebrandetes, maßgeschneidertes Portal mit individuellem HTML und CSS ist, haben Sie die Wahl, den gesamten Stack selbst zu entwickeln und zu warten - was ein erheblicher technischer Aufwand ist - oder eine Plattform wie Purple zu nutzen, die die Bearbeitung von benutzerdefiniertem HTML und CSS auf einer produktionsreifen Backend-Infrastruktur ermöglicht. Die nächsten Schritte: Lesen Sie die Dokumentation zum Portal-Editor von Purple, überprüfen Sie Ihr bestehendes Portal anhand der heute besprochenen Mobile-First-Checkliste und nutzen Sie, falls Sie ganz neu anfangen, die von uns skizzierte HTML-Vorlagenstruktur als Ausgangsbasis. Vielen Dank fürs Zuhören, und wir sehen uns beim nächsten Briefing.

Teil unserer Kernserie: Captive Portal Leitfaden

Individuelles Captive Portal: HTML- und CSS-Leitfaden

Management-Zusammenfassung

Für Enterprise-Standorte - von Luxushotels Hospitality und Einzelhandelsketten Retail bis hin zu Verkehrsknotenpunkten Transport und modernen medizinischen Campusen Healthcare - ist die Gäste-WiFi-Begrüßungsseite die digitale Haustür. Allerdings erfolgen über 90% der Gäste-WiFi-Logins auf mobilen Geräten, auf denen die Darstellung nicht durch Standard-Browser wie Safari oder Chrome gesteuert wird, sondern durch stark eingeschränkte Captive Network Assistant (CNA) Webviews [1]. Diese "Mini-Browser" erzwingen strenge Sandbox-Einschränkungen: Sie blockieren externe CDNs, deaktivieren persistente Cookies, ignorieren externe Webfonts und schränken die Ausführung von JavaScript stark ein, um Sicherheitsrisiken zu minimieren und Session-Hijacking zu verhindern [2].

Wenn ein Entwickler eine Begrüßungsseite mit traditionellen Webstandards entwirft, führen diese Einschränkungen zu fehlerhaften Layouts, fehlenden Brand-Assets und nicht funktionierenden Login-Buttons, was sich direkt auf die Kundenzufriedenheit und das digitale Engagement auswirkt. Dieser Leitfaden bietet Lösungen für diese Herausforderungen und stellt defensive Codierungspraktiken vor - wie Inline-CSS, Base64-Asset-Codierung, System-Font-Stacks und explizite navigationsgesteuerte Authentifizierungs-Handshakes -, um ein nahtloses plattformübergreifendes Rendering zu gewährleisten. Darüber hinaus untersuchen wir, wie Entwickler durch die Nutzung einer Managed Solution wie dem Portal-Builder von Purple die volle kreative Kontrolle über HTML/CSS behalten und gleichzeitig die RADIUS-Authentifizierung, die Datenbank-Skalierung, die GDPR/PCI-Compliance und die Multi-Vendor-AP-Integrationen auslagern können [3].

Technischer Deep-Dive

Um ein stabiles, individuelles Captive Portal zu erstellen, müssen Entwickler die Interzeption auf Netzwerkebene und die Browser-Virtualisierung verstehen, die stattfinden, wenn sich ein Gast mit einer offenen SSID verbindet.

Der Captive Portal Lifecycle

Wenn sich ein Client-Gerät mit einer Captive SSID verbindet, wird die folgende Sequenz ausgelöst:

  1. IP-Zuweisung: Das Gerät schließt einen 3-Wege-Handshake ab und fordert eine IP-Adresse über DHCP an.
  2. Aktiver Konnektivitätstest: Der Hintergrund-Netzwerkmanager des Betriebssystems sendet sofort einen HTTP-GET-Request an eine dedizierte, herstellerneutrale Canary-URL (z. B. Apples http://captive.apple.com/hotspot-detect.html oder Googles http://connectivitycheck.gstatic.com/generate_204) [1].
  3. DNS/HTTP-Interzeption: Der lokale Wireless LAN Controller (WLC) oder Access Point (AP) fängt diesen Port-80-HTTP-Request ab. Anstatt den erwarteten HTTP-Status 200 oder 204 zurückzugeben, leitet das Gateway den Datenverkehr des Clients über einen HTTP-302-Redirect an die URL der Landingpage des Captive Portals weiter [2].
  4. Webview-Generierung: Nach dem Erkennen des Redirects startet das Betriebssystem seinen nativen Captive Network Assistant (CNA) Mini-Browser, um die weitergeleitete Begrüßungsseite anzuzeigen, sodass der Benutzer keinen vollständigen Browser manuell öffnen muss.5. Authentifizierung und Zustandsübergang: Der Benutzer füllt das Anmeldeformular aus und sendet die Anmeldedaten an den Portal-Server zurück, der das Gateway (häufig über einen RADIUS Access-Accept oder einen externen API-Aufruf) anweist, die MAC-Adresse zu autorisieren.
  5. CNA-Exit-Handshake: Der CNA-Minibrowser führt einen weiteren HTTP GET zu seiner Canary-URL aus. Wenn er die erwartete Antwort 200/204 erhält, ändert er seine Schaltfläche oben rechts von "Abbrechen" auf "Fertig" und stellt die WiFi Verbindung als primäre Netzwerkschnittstelle her.

Plattformspezifische Einschränkungen von Minibrowsern

Jedes Betriebssystem verarbeitet diesen Lebenszyklus in unterschiedlichen Webview-Umgebungen, was zu einem stark fragmentierten Verhalten führt. Die folgende Tabelle beschreibt diese kritischen Einschränkungen im Detail:

Plattform / Webview Anzeigemethode Persistente Cookies Externe Webfonts JavaScript-Ausführung Fensterabmessungen Auslöser für Exit-Handshake
Apple iOS CNA (Websheet) Minibrowser-Popup Blockiert (Beim Schließen gelöscht) Blockiert (Offline) Eingeschränkt (Kein localStorage/sessionStorage) Responsive (Gerätebreite) Nur ganzseitiger HTTP-Redirect [1]
Apple macOS CNA (Captive Network Assistant) Minibrowser-Popup Blockiert Blockiert Eingeschränkt (Keine Alert- oder Confirm-Dialoge) Fest (900px x 572px) Nur ganzseitiger HTTP-Redirect
Android (Google) (CaptivePortalLogin) Push-Benachrichtigung -> Chrome Custom Tab Zulässig (Gemeinsam mit Chrome genutzt) Zulässig (Wenn im Walled Garden freigegeben) Vollständig Responsive Automatisch (Captive Portal API / 204-Prüfung) [2]
Samsung Android (Samsung Internet) Push-Benachrichtigung -> Minibrowser Zulässig Zulässig Vollständig Responsive Automatisch
Windows 10/11 (Standardbrowser) Auto-Start des Standardbrowsers Zulässig (Vollständiger Browserkontext) Zulässig Vollständig Responsive Manuell / Automatisch

Individuelles Captive Portal: HTML- und CSS-Leitfaden - cna constraints comparison

Umgehung der Apple CNA "Fertig"-Button-Falle beim Coding

Eines der häufigsten Fehlerszenarien bei der Entwicklung individueller Portale ist die "Fertig"-Button-Falle auf iOS-Geräten. Wenn sich ein Benutzer authentifiziert, muss das iOS Websheet-Webview erkennen, dass das Netzwerk nicht mehr captive ist. Dies geschieht durch die Überwachung des Erfolgs seiner im Hintergrund ausgeführten Canary-Anfragen.Entscheidend ist, dass der iOS CNA diese Prüfung nur bei einer vollständigen HTTP-Seitennavigation (Location-Redirect) auslöst. Wenn ein Entwickler eine moderne Single Page Application (SPA) erstellt, die Formulardaten über einen asynchronen AJAX-Aufruf (z. B. fetch() oder Axios) übermittelt und das DOM dynamisch aktualisiert, ohne die URL zu ändern, wird der CNA seine Konnektivitätsprüfung niemals erneut ausführen. Der Benutzer wird auf Gateway-Ebene authentifiziert, aber die Schaltfläche des CNA in der oberen rechten Ecke bleibt auf "Abbrechen" (bzw. "Cancel") stehen. Wenn der frustrierte Benutzer auf "Abbrechen" klickt, trennt das iOS-Gerät sofort die Verbindung zur SSID und beendet die WiFi-Sitzung [1].

Um dies zu verhindern, muss der Handler für den erfolgreichen Authentifizierungsabschluss eine vollständige Seitenweiterleitung zu einer physischen Landingpage durchführen (z. B. window.location.href = '/success') oder das Anmeldeformular nativ über eine Standard-HTTP-POST-Aktion übermitteln.

Implementierungshandbuch

Um eine konsistente Darstellung auf allen Plattformen zu gewährleisten, müssen Entwickler von modernen, asset-lastigen Webdesigns zu einem hochgradig in sich geschlossenen, defensiven Codierungsstil übergehen.

Die goldene Regel: Design für null Internetkonnektivität

Während des Captive-Zustands hat das Client-Gerät keinen Zugriff auf das breitere Internet. Es kann nur IP-Adressen und Domänen auflösen und darauf zugreifen, die explizit in der Walled Garden-Liste des Wireless-Controllers freigegeben sind (wie z. B. die IP-Adresse des Captive Portal-Servers selbst). Daher schlägt das Laden aller in Ihrem HTML referenzierten externen Ressourcen fehl, was zu einem fehlerhaften Layout führt.

Um defensiv zu gestalten, implementieren Sie die folgende Checkliste für Mobile-First Captive Portal-Design:

Individuelles Captive Portal: HTML- und CSS-Leitfaden - mobile first checklist

1. Viewport-Konfiguration

Um zu verhindern, dass Mobilgeräte den Viewport auf eine Desktop-Breite (typischerweise 980px) herunterskalieren, muss der HTML-<head> ein responsives Viewport-Meta-Tag enthalten. Ohne dieses Tag erscheinen Text- und Eingabefelder auf Mobilgeräten mikroskopisch klein:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

2. CSS einbetten und externe Abhängigkeiten entfernen

Verlinken Sie niemals auf externe CSS-Dateien oder CDNs (z. B. Bootstrap, Tailwind oder Google Fonts). Sämtlicher CSS-Code muss in einem <style>-Block im HTML-<head> eingebettet sein.

Verwenden Sie für die Typografie einen System-Schriftstapel (System Font Stack), der auf vorinstallierte lokale Betriebssystem-Schriftarten verweist. Dies vermeidet HTTP-Anfragen vollständig und stellt sicher, dass die Seite sofort mit der nativen, hochwertigen serifenlosen Schriftart des Geräts geladen wird:

body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    background-color: #F5F1ED; /* Pearl White Brand Colour */
    color: #011638; /* Dark Blue Brand Colour */
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
}

3. Base64 Asset-Kodierung

Bilder, Logos und Icons sollten nicht über externe HTTP-URLs referenziert werden, es sei denn, die Hosting-Domain ist im Walled Garden des Gateways auf der Whitelist. Die zuverlässigste Methode besteht darin, kleine visuelle Assets (wie PNG- oder SVG-Logos) direkt als Base64-Daten-URIs in das HTML oder CSS zu kodieren:

<!-- Inline Base64 Logo Beispiel -->
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIj48Y2lyY2xlIGN4PSI1MCIgY3k9IjUwIiByPSI0MCIgZmlsbD0iIzc0NThGRCIvPjwvc3ZnPg==" alt="Purple Logo" class="brand-logo">

4. Optimierung von Eingabefeldern und Touch-Zielen

Um den Standards für mobile Benutzerfreundlichkeit (wie den Human Interface Guidelines von Apple) zu entsprechen, müssen alle interaktiven Elemente für die Toucheingabe optimiert sein:

  • Schriftgröße für Eingaben: Die Schriftgröße für Eingabetexte muss mindestens 16px betragen. Wenn die Schriftgröße geringer ist (z. B. 14px), zoomen iOS Safari und der CNA beim Fokussieren automatisch in das Eingabefeld hinein, was das Seitenlayout verzerrt [1].
  • Touch-Ziele: Schaltflächen, Kontrollkästchen und Links müssen eine Mindestgröße für das Touch-Ziel von 44px x 44px aufweisen, um versehentliche Klicks oder Frustration bei den Benutzern zu vermeiden.

5. Rechtliche Einwilligung und GDPR-Konformität

Bei der Erfassung von Gästedaten (z. B. E-Mail, Telefonnummer oder Social-Media-Profile) muss die HTML-Struktur eine ausdrückliche rechtliche Einwilligung unterstützen. Gemäß GDPR sind vorausgewählte Kontrollkästchen oder implizite Einverständniserklärungen (z. B. „Mit der Anmeldung stimmen Sie unseren Bedingungen zu“) nicht konform [3].

  • Stellen Sie ein standardmäßig nicht ausgewähltes Kontrollkästchen für die Allgemeinen Geschäftsbedingungen und Datenschutzrichtlinien bereit.
  • Platzieren Sie detaillierten Rechtstext in einem scrollbaren Container mit begrenzter Höhe (max-height: 120px; overflow-y: auto;), um das Hauptanmeldeformular im sichtbaren Bereich (above the fold) zu halten.
<div class="consent-container">
    <input type="checkbox" id="terms_consent" name="terms_consent" required>
    <label for="terms_consent">
        Ich stimme den <a href="#" onclick="showTerms()">Nutzungsbedingungen</a> ausdrücklich zu und willige in die Verarbeitung meiner Daten gemäß der <a href="#" onclick="showPrivacy()">Datenschutzrichtlinie</a> ein.
    </label>
</div>

Haben Sie Fragen zu Ihrem spezifischen Setup?

Unser Team arbeitet mit Standortbetreibern, IT-Managern und Netzwerktechnikern an über 80.000 Standorten zusammen. Buchen Sie ein 20-minütiges Gespräch und wir zeigen Ihnen, wie andere diese Herausforderungen gelöst haben.

Benutzerdefinierte Captive Portal HTML/CSS-Vorlage

Unten finden Sie eine vollständige, produktionsbereite HTML/CSS-Vorlage in einer einzigen Datei, die alle Mobile-First- und CNA-konformen Best Practices berücksichtigt. Sie bietet ein responsives Layout, einen System-Schriftstapel, Base64-bereite Platzhalter für Assets, touchfreundliche Eingabefelder und explizite, GDPR-konforme Einwilligungsstrukturen:

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>Gast WiFi Login</title>
    <style>
        /* CSS Reset & Variablen-Deklarationen */
        :root {
            --color-primary: #7458FD; /* Purple Markenfarbe */
            --color-dark: #011638; /* Dunkelblau */
            --color-light: #F5F1ED; /* Perlenweiß */
            --color-white: #FFFFFF;
            --color-border: #D1D5DB;
            --radius-container: 12px;
            --radius-element: 6px;
        }
        
        * {
            box-sizing: border-box;
            -webkit-tap-highlight-color: transparent;
        }
        
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
            background-color: var(--color-light);
            color: var(--color-dark);
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            min-height: 100vh;
        }
        
        /* Responsives Card-Layout */
        .portal-card {
            background-color: var(--color-white);
            width: 100%;
            max-width: 420px;
            padding: 32px 24px;
            border-radius: var(--radius-container);
            box-shadow: 0 4px 20px rgba(1, 22, 56, 0.05);
            text-align: center;
        }
        
        .logo-container {
            margin-bottom: 24px;
        }
        
        /* Eingebetteter Base64 Logo-Platzhalter */
        .logo {
            width: 120px;
            height: auto;
        }
        
        h1 {
            font-size: 24px;
            font-weight: 700;
            margin: 0 0 8px 0;
            color: var(--color-dark);
        }
        
        p {
            font-size: 14px;
            color: #4B5563;
            margin: 0 0 24px 0;
            line-height: 1.5;
        }
        
        /* Formular-Styles */
        .form-group {
            text-align: left;
            margin-bottom: 16px;
        }
        
        label {
            display: block;
            font-size: 14px;
            font-weight: 600;
            margin-bottom: 6px;
            color: var(--color-dark);
        }
        
        /* Wichtig: Schriftgröße muss mindestens 16px betragen, um den iOS Auto-Zoom zu verhindern */
        input[type="email"],
        input[type="text"] {
            width: 100%;
            height: 48px;
            padding: 12px 16px;
            font-size: 16px;
            border: 1px solid var(--color-border);
            border-radius: var(--radius-element);
            background-color: var(--color-white);
            color: var(--color-dark);
            outline: none;
            transition: border-color 0.2s;
        }
        
        input[type="email"]:focus,
        input[type="text"]:focus {
            border-color: var(--color-primary);
            box-shadow: 0 0 0 3px rgba(116, 88, 253, 0.15);
        }
        
        /* Einwilligung-Styles */
        .consent-group {
            display: flex;
            align-items: flex-start;
            text-align: left;
            margin: 20px 0;
        }
        
        /* Touch-freundliche Zielgröße */
        input[type="checkbox"] {
            width: 20px;
            height: 20px;
            margin: 2px 12px 0 0;
            flex-shrink: 0;
            cursor: pointer;
            accent-color: var(--color-primary);
        }
        
        .consent-label {
            font-size: 13px;
            line-height: 1.4;
            color: #4B5563;
            user-select: none;
        }
        
        .consent-label a {
            color: var(--color-primary);
            text-decoration: none;
            font-weight: 600;
        }
        
        .consent-label a:hover {
            text-decoration: underline;
        }
        
        /* Touch-Friendly CTA Button (Minimum 44px height) */
        .btn-submit {
            width: 100%;
            height: 48px;
            background-color: var(--color-primary);
            color: var(--color-white);
            border: none;
            border-radius: var(--radius-element);
            font-size: 16px;
            font-weight: 600;
            cursor: pointer;
            transition: background-color 0.2s;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        
        .btn-submit:hover {
            background-color: #5B3EE3;
        }
        
        .btn-submit:active {
            background-color: #4A2FD4;
        }
        
        /* Legal Terms Scrollbox */
        .terms-scrollbox {
            display: none; /* Toggled via JS */
            text-align: left;
            font-size: 11px;
            color: #6B7280;
            background-color: var(--color-light);
            padding: 12px;
            border-radius: var(--radius-element);
            max-height: 100px;
            overflow-y: auto;
            margin-bottom: 16px;
            border: 1px solid var(--color-border);
        }
        
        .footer {
            margin-top: 24px;
            font-size: 11px;
            color: #9CA3AF;
        }
    </style>
</head>
<body>

    <div class="portal-card">
        <div class="logo-container">
            <!-- Replace src with your actual Base64-encoded SVG or PNG -->
            <svg class="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 30">
                <rect width="100" height="30" rx="6" fill="#7458FD"/>
                <text x="50" y="20" font-family="sans-serif" font-size="12" fill="#FFFFFF" font-weight="bold" text-anchor="middle">IHRE MARKE</text>
            </svg>
        </div>
        
        <h1>Willkommen im Gäste WiFi</h1>
        <p>Bitte geben Sie unten Ihre Daten ein, um einen sicheren, schnellen Internetzugang zu erhalten.</p>
        
        <!-- Form must submit natively (full page navigation) to clear Apple CNA -->
        <form action="/login/submit" method="POST" onsubmit="return validateForm()">
            <div class="form-group">
                <label for="guest_name">Vollständiger Name</label>
                <input type="text" id="guest_name" name="name" placeholder="Max Mustermann" required autocomplete="name">
            </div>
            
            <div class="form-group">
                <label for="guest_email">E-Mail-Adresse</label>
                <input type="email" id="guest_email" name="email" placeholder="john@example.com" required autocomplete="email">
            </div>
            
            <div class="consent-group">
                <input type="checkbox" id="terms_consent" name="terms_accepted" required>
                <label for="terms_consent" class="consent-label">
                    Ich akzeptiere die <a href="#" onclick="toggleTerms(event)">Nutzungsbedingungen</a> und willige in die Datenverarbeitung gemäß den GDPR-Vorschriften ein.
                </label>
            </div>
            
            <div id="terms_box" class="terms-scrollbox">
                <strong>WiFi Nutzungsbedingungen:</strong><br>
                1. Dieser Dienst wird ohne Gewährleistung bereitgestellt.<br>
                2. Nutzer dürfen keine illegalen, bandbreitenintensiven Aktivitäten durchführen.<br>
                3. Personenbezogene Daten werden ausschließlich für die Authentifizierung und Marketing-Einwilligungen in Übereinstimmung mit unserer Datenschutzrichtlinie erhoben.
            </div>
            
            <button type="submit" class="btn-submit">Mit WiFi verbinden</button>
        </form>
        
        <div class="footer">
            Powered by Purple | Secure Guest WiFi
        </div>
    </div>

    <script>
        function toggleTerms(e) {
            e.preventDefault();
            var box = document.getElementById('terms_box');
            box.style.display = (box.style.display === 'block') ? 'none' : 'block';
        }
        
        function validateForm() {
            var consent = document.getElementById('terms_consent');
            if (!consent.checked) {
                alert('Sie müssen die Nutzungsbedingungen akzeptieren, um eine Verbindung herzustellen.');
                return false;
            }
            return true;
        }
    </script>
</body>
</html>

Fehlerbehebung & Risikominimierung

Bei der Bereitstellung von selbst codierten HTML/CSS-basierten Captive Portals stoßen IT-Betriebsteams häufig auf mehrere schwerwiegende operationelle Risiken:

1. Die SSL/TLS-Zertifikatswarnschleife

Da Captive Portals durch das Abfangen von Datenverkehr funktionieren, stellen sie einen grundlegenden Konflikt mit der modernen HTTPS-Websicherheit dar. Wenn ein Nutzer versucht, eine HTTPS-Website aufzurufen (z. B. https://www.google.com), und das Gateway versucht, diesen Datenverkehr auf ein HTTP-basiertes Captive Portal umzuleiten, erkennt der Browser eine Diskrepanz im SSL-Zertifikat und zeigt eine kritische Sicherheitswarnung "Ihre Verbindung ist nicht privat" an.

  • Risikominimierung: Versuchen Sie niemals, HTTPS-Datenverkehr direkt abzufangen. Verlassen Sie sich stattdessen vollständig auf den nativen CNA-Assistenten des Betriebssystems (der eine unverschlüsselte HTTP-Anfrage stellt, um die Umleitung auszulösen). Stellen Sie sicher, dass die Domain Ihres Captive Portals über ein gültiges, öffentlich vertrauenswürdiges SSL-Zertifikat (z. B. Let's Encrypt oder DigiCert) verfügt und erst dann über HTTPS bereitgestellt wird, wenn die anfängliche HTTP-Umleitung den Nutzer erfolgreich zu Ihrer Portal-Domain weitergeleitet hat [2].

2. DNS-Auflösungsfehler (Die Walled-Garden-Falle)

Wenn Ihre benutzerdefinierte HTML-Seite auf externe Ressourcen verweist - wie z. B. einen OAuth-Endpunkt für Social Login (z. B. Facebook, Google) oder ein Zahlungs-Gateway - schlagen die DNS-Anfragen für diese Domains fehl, es sei denn, sie sind explizit im Walled Garden des Wireless Controllers freigegeben. Wenn eine Domain in der Whitelist fehlt, gerät der Anmeldefluss ins Stocken und zeigt einen leeren Bildschirm an.

  • Risikominderung: Führen Sie eine strikte, minimale Walled Garden-Liste. Bei der Verwendung von Social Logins sollten Sie die spezifischen Wildcard-Domains freigeben, die von den Identitätsanbietern empfohlen werden (z. B. *.google.com, *.gstatic.com).

3. Sitzungs-Timeout und Schwachstellen bei MAC-Spoofing

Standardmäßige Captive Portals authentifizieren Geräte anhand ihrer MAC-Adressen. Moderne mobile Betriebssysteme (iOS 14+ und Android 10+) verwenden jedoch standardmäßig zufällige MAC-Adressen (private WiFi-Adressen) und rotieren diese regelmäßig. Dies kann dazu führen, dass Gäste wiederholt zur erneuten Authentifizierung aufgefordert werden, was die Benutzererfahrung beeinträchtigt [1].

  • Risikominderung: Implementieren Sie angemessene Sitzungs-Timeouts (z. B. 24 Stunden) auf dem RADIUS-Server, um veraltete Sitzungen zu verhindern, und nutzen Sie moderne Authentifizierungsstandards wie Passpoint (Hotspot 2.0) oder WPA3-Enterprise für ein nahtloses, sicheres Onboarding, das MAC-basierte Captive Portals vollständig umgeht.

Relevanz der Purple-Produkte: Eigenentwicklung vs. Kauf

Während das Codieren einer einzelnen HTML-Seite unkompliziert ist, stellt das Hosten, Sichern und Skalieren einer benutzerdefinierten Captive Portal-Infrastruktur enorme technische und Compliance-Hürden dar. Die folgende Tabelle vergleicht die entwicklungsbezogenen und operativen Realitäten eines selbstgehosteten benutzerdefinierten Portals mit der verwalteten Enterprise-Plattform von Purple:

Feature / Betriebliche Anforderung Selbstgehostetes benutzerdefiniertes Portal Purple Enterprise WiFi Plattform
HTML/CSS-Anpassung Vollständig manuelle Codierung, Hochladen von Dateien auf einzelne APs oder lokale Webserver. Pixelgenauer Entwickler-Editor, der benutzerdefinierte HTML/CSS-Injections ermöglicht, kombiniert mit einem visuellen Drag-and-Drop-Builder.
RADIUS-Infrastruktur Hochverfügbare FreeRADIUS- oder Cloud-RADIUS-Server müssen bereitgestellt, konfiguriert und gewartet werden [4]. Integrierte, global verteilte, cloud-native RADIUS-Infrastruktur mit Active-Active-Redundanz und 99,99 % Verfügbarkeits-SLAs.
Multi-Vendor-AP-Unterstützung Benutzerdefinierte Integrationsskripte für jeden Hardware-Hersteller (Cisco, Aruba, Meraki, Ruckus) erforderlich [5]. Native Out-of-the-box-Integration mit über 200 Hardware-Modellen; einheitliche Portal-Bereitstellung über heterogene Hardware-Infrastrukturen hinweg.
Datenschutz & Compliance Der Betreiber übernimmt die 100%ige rechtliche Haftung für die Einhaltung von GDPR, CCPA und PCI-DSS, einschließlich sicherer Datenbankverschlüsselung und Workflows zur Datenlöschung. Vollständig konform durch Design. Integriertes Einwilligungsmanagement, automatisierte Löschanfragen von Betroffenen und sicheres, ISO 27001-zertifiziertes Hosting.
Analytics & Marketing Erfordert den Aufbau benutzerdefinierter Pipelines für die Datenerfassung und die Integration von Marketing-Tools von Drittanbietern. Enterprise-grade Analytics-Dashboard mit Echtzeit-Besucherstromanalyse, Kennzahlen zur Wiederkehrrate und automatisierten Auslösern für Marketingkampagnen [6].\n
  • Minderungs-ROI: Die Implementierung eines expliziten, nicht angekreuzten Zustimmungs-Kontrollkästchens und das Hosten von Bedingungen in einer optimierten Scrollbox gewährleistet eine 100%ige Einhaltung von Vorschriften, minimiert das Risiko von Bußgeldern in Millionenhöhe und schützt den Ruf der Marke.

Zusammenfassung der wichtigsten Erkenntnisse

  • Die CNA-Sandbox ist restriktiv: Apples iOS Websheet und macOS CNA sind stark eingeschränkte Sandbox-Umgebungen, die externe Ressourcen, Cookies und Web-Schriftarten blockieren. Das gesamte Styling und alle Ressourcen müssen in sich geschlossen sein (Inline-CSS, Base64-Bilder, System-Schriftarten) [1].
  • AJAX unterbricht den iOS-Exit-Handshake: Um das iOS-Gerät erfolgreich von "gesperrt" auf "verbunden" umzustellen (wodurch sich die Schaltfläche oben rechts von "Abbrechen" auf "Fertig" ändert), müssen Sie eine ganzseitige HTTP-Weiterleitung auslösen. Asynchrone DOM-Aktualisierungen führen dazu, dass das Gerät in einer Captive-Schleife verbleibt.
  • Mobile-First ist obligatorisch: Über 90 % der Anmeldungen erfolgen auf Mobilgeräten. Entwerfen Sie ein einspaltiges Layout (max-width: 480px), nutzen Sie touchfreundliche Tippziele (mindestens 44px x 44px) und erzwingen Sie eine Schriftgröße von mindestens 16px bei allen Texteingaben, um ein automatisches Heranzoomen des iOS-Browsers zu verhindern.
  • Walled Gardens steuern DNS: Jede externe Domain, auf die während des Logins verwiesen wird (z. B. APIs für Social Logins), muss explizit in der Walled Garden-Liste des Wireless-Controllers freigegeben werden, andernfalls kann die Seite nicht geladen werden.
  • Purple beseitigt Backend-Komplexität: Die Nutzung des Portal-Builders von Purple gibt Entwicklern die vollständige HTML/CSS-Kontrolle über einen benutzerdefinierten Editor, während die immense Last in Bezug auf Sicherheit, Skalierung und Compliance für RADIUS, AP-Integrationen verschiedener Hersteller und GDPR-konformes Datenbankmanagement abgegeben wird [3].

Referenzen


Hören Sie sich das technische Briefing an

Hören Sie einem Senior Solutions Architect zu, der die technischen Einschränkungen und Implementierungsstrategien für benutzerdefinierte Captive Portals erläutert:

Schlüsseldefinitionen

Captive Portal

Eine Webseite, die neu verbundenen Benutzern eines WiFi-Netzwerks angezeigt wird, bevor ihnen ein breiterer Zugriff auf Netzwerkressourcen gewährt wird. Sie wird in der Regel für die Authentifizierung, die Bezahlung oder die Anzeige von Nutzungsbedingungen verwendet.

IT-Teams stellen Captive Portals auf Gateway-Ebene bereit, um den Gastzugang zu kontrollieren, Benutzerdaten zu erfassen und die Einhaltung gesetzlicher Vorschriften zu erzwingen.

Captive Network Assistant (CNA)

Ein stark eingeschränkter, Sandbox-geschützter Mini-Browser, der von Betriebssystemen (wie Apple iOS und macOS) automatisch gestartet wird, sobald sie eine Umleitung über ein Captive-Netzwerk erkennen, und der ausschließlich dazu dient, die Portal-Authentifizierung zu erleichtern.

CNA-Webviews erzwingen strenge Einschränkungen, einschließlich der Blockierung externer CDNs, persistenter Cookies und des lokalen Speichers, was standardmäßige Webdesigns häufig unbrauchbar macht.

Walled Garden

Eine eingeschränkte Liste von IP-Adressen, Subnetzen oder Domainnamen, auf die ein nicht authentifizierter Gastbenutzer über das Gateway zugreifen darf, bevor er den Anmeldevorgang am Captive Portal abgeschlossen hat.

Entwickler müssen sicherstellen, dass jede externe Ressource (wie Social-Login-APIs oder Payment Gateways) im Walled Garden auf der Whitelist steht, damit der Login-Prozess nicht ins Stocken gerät.

Base64-Codierung

Ein Binär-zu-Text-Codierungsschema, das Binärdaten (wie Bilder) als ASCII-Zeichenfolge darstellt, sodass Ressourcen direkt in HTML- oder CSS-Dokumente eingebettet werden können.

Die Verwendung der Base64-Codierung für Logos und Symbole eliminiert externe HTTP-Anfragen und stellt sicher, dass Design-Elemente in Offline-CNA-Umgebungen einwandfrei gerendert werden.

RADIUS (Remote Authentication Dial-In User Service)

Ein Netzwerkprotokoll, das eine zentralisierte Verwaltung für Authentifizierung, Autorisierung und Abrechnung (AAA) für Benutzer bietet, die sich mit einem Netzwerkdienst verbinden und diesen nutzen.

Der Captive Portal-Server kommuniziert mit einem RADIUS-Server, um die MAC-Adresse des Gasts am Netzwerk-Gateway freizugeben, sobald die Authentifizierungskriterien erfüllt sind.

System-Schriftstapel

Eine CSS font-family-Deklaration, die vorinstallierten Betriebssystem-Schriftarten (wie San Francisco auf iOS, Segoe UI auf Windows und Roboto auf Android) den Vorzug vor externen Webfonts gibt.

Die Implementierung eines System-Schriftstapels sorgt für ein sofortiges Rendern der Typografie, ohne blockierte externe HTTP-Anfragen an Dienste wie Google Fonts auszulösen.

Canary URL

Eine dedizierte, unverschlüsselte HTTP-URL, die von Betriebssystemherstellern gepflegt wird (z. B. captive.apple.com), um zu testen, ob ein Gerät über eine uneingeschränkte Internetverbindung verfügt.

Der Hintergrund-Netzwerkmanager des Betriebssystems prüft diese URL, um das Vorhandensein eines Captive Portals zu erkennen und das CNA-Webview-Popup auszulösen.

Passpoint (Hotspot 2.0)

Ein von der WiFi Alliance entwickelter Industriestandard, der es mobilen Geräten ermöglicht, WiFi-Hotspots automatisch zu erkennen und sich sicher an ihnen zu authentifizieren, wodurch manuelle Captive Portal-Anmeldungen umgangen werden.

Unternehmen nutzen Passpoint zusammen mit Plattformen wie Purple, um Gästen den Übergang von aufwendigen Splash Pages zu nahtlosen, mobilfunkähnlichen, sicheren Roaming-Erlebnissen zu ermöglichen.

Ausgearbeitete Beispiele

Eine luxuriöse Hotelkette mit 250 Zimmern [Hospitality](/industries/hospitality) möchte eine individuelle Gäste-WiFi-Anmeldeseite implementieren, die perfekt zu ihren Premium-Markenrichtlinien passt. Ihre Kreativagentur hat eine Splash-Page entworfen, die eine benutzerdefinierte Markentypografie (gehostet auf Adobe Fonts), mehrere hochauflösende Hintergrundbilder (gehostet auf einem öffentlichen AWS S3-Bucket) und einen mehrstufigen animierten JavaScript-Assistenten nutzt. Nach der Bereitstellung verbinden sich iOS-Gäste mit der SSID, aber das Portal wird als leerer weißer Bildschirm angezeigt, und Benutzer können sich nicht authentifizieren.

Um den leeren Bildschirm und das fehlerhafte Branding zu beheben, müssen wir die Frontend-Architektur des Portals neu strukturieren, um den Einschränkungen der Apple CNA-Sandbox zu entsprechen:

  1. Behebung der Typografie: Da Adobe Fonts eine externe HTTP-Anfrage erfordert, die von der CNA blockiert wird, ersetzen wir den Aufruf der benutzerdefinierten Schriftart durch einen nativen, hochwertigen System-Schriftstapel (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;). Dies gewährleistet ein sofortiges Rendern ohne externe Netzwerkaufrufe.
  2. Asset-Optimierung: Die Hintergrundbilder auf AWS S3 werden blockiert, da sich S3 nicht im Walled Garden des Gateways befindet. Wir komprimieren das primäre Markenlogo, konvertieren es in ein leichtgewichtiges SVG und codieren es direkt im HTML als Base64-Daten-URI. Für den Hintergrund ersetzen wir die schweren Bilder durch einen sauberen, responsiven CSS-Verlauf unter Verwendung der Markenfarben des Hotels, was das Seitengewicht erheblich reduziert.
  3. JavaScript-Vereinfachung: Der mehrstufige animierte Assistent basiert auf externen jQuery- und GSAP-Bibliotheken. Wir entfernen diese externen Abhängigkeiten und strukturieren das Formular in eine einseitige, einspaltige HTML-Struktur um. Die Formularvalidierung wird in leichtgewichtigem, reinem JavaScript neu geschrieben.
  4. Authentifizierungs-Handshake: Die Formularübermittlung wird von einer AJAX-basierten Übermittlung in ein natives HTML-Element <form action="/submit" method="POST"> geändert, um eine vollständige Seitenweiterleitung auszulösen. Dies ermöglicht es dem iOS Websheet, seine Canary-Prüfung auszuführen und die Schaltfläche "Fertig" anzuzeigen.
Kommentar des Prüfers: Dieses Szenario stellt den klassischen Konflikt zwischen anspruchsvollem kreativen Design und den starren Sicherheitsbeschränkungen von Captive Webviews dar. Kreativagenturen behandeln das Captive Portal oft wie eine Standard-Desktop-Website. Da sich das Gerät jedoch in einem vorauthentifizierten Zustand befindet, blockiert das Netzwerk den gesamten externen Datenverkehr. Durch Inlining von CSS, Verwendung von System-Schriftstapeln, Base64-Codierung von Assets und Nutzung nativer Formularübermittlungen bewahren wir die Premium-Markenästhetik und erreichen gleichzeitig eine 100%ige Betriebszuverlässigkeit auf iOS- und Android-Geräten.

Eine nationale Einzelhandelskette [Retail](/industries/retail) mit 450 Filialen möchte E-Mail-Adressen von Gästen über WiFi Splash-Pages erfassen, um ihr CRM zu füllen. Sie verlangen von den Gästen, dass sie sich für Marketing-Newsletter anmelden. Der ursprüngliche Entwurf sieht ein vorab ausgewähltes Kontrollkästchen "Ich stimme dem Erhalt von Marketing-E-Mails zu" vor. Darüber hinaus wird das Portal auf einem einzigen lokalen Server in der Zentrale gehostet. Während der Stoßzeiten (Samstagnachmittag) kommt es bei Gästen im ganzen Land zu schweren Verzögerungen, und viele können die Anmeldeseite nicht laden, was zu einem massiven Einbruch der Datenerfassungsraten führt.

Wir müssen sowohl den Compliance-Verstoß als auch den Infrastruktur-Engpass beheben:

  1. Compliance-Behebung: Gemäß GDPR und CCPA sind vorab angekreuzte Einverständniserklärungen illegal. Wir ändern das HTML so, dass das Kontrollkästchen für die Marketing-Einwilligung standardmäßig nicht aktiviert ist (<input type="checkbox" id="marketing_consent">). Zudem fügen wir ein separates, obligatorisches Kontrollkästchen für die Nutzungsbedingungen hinzu, um die rechtliche Vereinbarung von der Marketing-Einwilligung zu entkoppeln.
  2. Skalierung der Infrastruktur: Das Hosting eines landesweiten Captive Portals auf einem einzigen zentralisierten Server stellt einen Single Point of Failure und einen massiven Latenz-Engpass dar. Wir migrieren das Portal-Frontend zu einem hochverfügbaren, global verteilten Content Delivery Network (CDN) mit Edge-Caching.
  3. RADIUS-Integration: Wir konfigurieren die Access Points der lokalen Geschäfte so, dass sie auf ein Cloud-natives RADIUS-Cluster mit Active-Active-Redundanz verweisen. Dadurch wird sichergestellt, dass Authentifizierungsanfragen lokal am Edge mit einer Latenz von unter 50 ms verarbeitet werden, selbst während der Hauptverkehrszeiten am Samstag.
  4. Migration zu Purple: Um diesen gesamten Entwicklungsaufwand zu eliminieren, migriert der Einzelhändler zu Purple. Die integrierten GDPR-Einwilligungstools von Purple verwalten rechtskonforme Opt-ins automatisch, und die global verteilte Cloud-Infrastruktur verarbeitet Millionen von täglichen Authentifizierungen mit 99,99 % Betriebszeit, wodurch der Skalierungs-Engpass vollständig behoben wird.
Kommentar des Prüfers: Vorab angekreuzte Kontrollkästchen für die Einwilligung stellen ein schwerwiegendes Compliance-Risiko dar, das zu massiven behördlichen Bußgeldern führen kann. Die Entkopplung der Marketing-Einwilligung von den Nutzungsbedingungen ist eine technische und rechtliche Best Practice. Auf der Infrastrukturseite ist das zentralisierte Hosting von Captive Portals ein Anti-Pattern. Eine landesweite Einzelhandelspräsenz erfordert ein dezentrales, Edge-gecachetes Frontend in Kombination mit einem Cloud-nativen RADIUS-Backend. Die Migration zu einer verwalteten Plattform wie Purple eliminiert diese architektonische Komplexität, sodass sich der Einzelhändler auf Marketingkampagnen konzentrieren kann, anstatt sich mit der Skalierung von Datenbanken zu beschäftigen.

Übungsfragen

Q1. Ein IT-Team an einem großen internationalen Flughafen [Transport](/industries/transport) stellt ein selbst programmiertes Captive Portal bereit. Sie stellen fest, dass sich Android-Nutzer zwar nahtlos verbinden, ein erheblicher Teil der iOS-Nutzer jedoch ein Problem hat: Sie authentifizieren sich erfolgreich, können aber nicht im Internet surfen. Bei genauerer Betrachtung zeigen die iOS-Geräte an, dass sie mit der SSID verbunden sind, aber die Schaltfläche oben rechts im Captive-Popup zeigt immer noch "Abbrechen" anstelle von "Fertig". Was ist die Ursache für dieses Problem und wie sollte der Entwickler es beheben?

Hinweis: Analysieren Sie, wie der Apple CNA-Assistent erkennt, dass ein Netzwerk von einem gesperrten in einen authentifizierten Zustand übergegangen ist, und welche Browseraktion erforderlich ist, um diese Prüfung auszulösen.

Musterlösung anzeigen

Die Ursache liegt darin, dass die Erfolgsseite des Portals die Benutzeroberfläche dynamisch über JavaScript (AJAX/SPA-Routing) aktualisiert, anstatt eine vollständige HTTP-Seitennavigation durchzuführen. Der Captive Network Assistant (CNA) Mini-Browser von Apple iOS führt seinen Hintergrund-Verbindungstest (die Canary-Anfrage an captive.apple.com) nur dann erneut aus, wenn eine vollständige URL-Weiterleitung oder Seitennavigation stattfindet. Wenn der Entwickler das Anmeldeformular über AJAX übermittelt und lediglich eine "Erfolgreich"-Meldung im DOM anzeigt, bekommt der CNA nicht mit, dass das Netzwerk freigeschaltet wurde. Folglich bleibt die Schaltfläche oben rechts auf "Abbrechen" stehen. Wenn der Benutzer auf "Abbrechen" klickt, um das Fenster zu schließen, geht das Betriebssystem von einer fehlgeschlagenen Anmeldung aus und trennt die Verbindung zum WiFi-Netzwerk.

Lösung: Der Entwickler muss den Handler für die erfolgreiche Authentifizierung so anpassen, dass eine vollständige Weiterleitung erzwungen wird. Dies kann erreicht werden, indem das Anmeldeformular nativ über ein Standard-HTML <form action="/submit" method="POST"> übermittelt wird oder indem window.location.href = '/success_landing_page' in JavaScript ausgeführt wird, sobald die API eine erfolgreiche Authentifizierungsantwort zurückgibt. Dies löst das erforderliche Laden der vollständigen Seite aus, wodurch der CNA-Assistent gezwungen wird, den Netzwerkstatus neu zu bewerten, zu überprüfen, ob die Canary URL nun erreichbar ist, und die Schaltfläche oben rechts in "Fertig" zu ändern.

Q2. Ein Stadion-Betriebsteam [Events] möchte ein Gäste-WiFi-Netzwerk einrichten, das Marketing-Opt-ins erfasst. Der Compliance-Beauftragte besteht darauf, dass das Portal zu 100 % GDPR-konform sein muss. Das Entwicklerteam präsentiert einen Entwurf, bei dem das Anmeldeformular ein bereits angekreuztes Kontrollkästchen mit dem Text "Ich stimme den Nutzungsbedingungen zu und willige in den Erhalt von Marketing-Newslettern ein" enthält. Warum ist dieses Design nicht konform und wie sollten das HTML/CSS und die Formularstruktur überarbeitet werden, um die GDPR zu erfüllen und gleichzeitig eine hohe Konversionsrate beizubehalten?

Hinweis: Berücksichtigen Sie die strengen Anforderungen der GDPR bezüglich der ausdrücklichen Einwilligung, der Entkopplung von Marketing-Opt-ins von den Nutzungsbedingungen und der physischen Sichtbarkeit von Rechtstexten auf mobilen Bildschirmen.

Musterlösung anzeigen

Das vorgeschlagene Design verstößt in zwei wesentlichen Punkten gegen die GDPR: Erstens stellen vorausgewählte Kontrollkästchen keine wirksame Einwilligung dar, da diese freiwillig, für den konkreten Fall, in informierter Weise und unmissverständlich erfolgen muss. Zweitens ist die Koppelung der Marketing-Einwilligung an die Zustimmung zu den Nutzungsbedingungen nicht konform; ein Benutzer darf nicht gezwungen werden, Marketing-E-Mails als Bedingung für die Nutzung des WiFi-Dienstes zu akzeptieren.

Refactoring-Strategie:

  1. Einwilligung entkoppeln: Teilen Sie das Kontrollkästchen in zwei separate Kontrollkästchen auf. Kontrollkästchen A ist obligatorisch und deckt die Nutzungsbedingungen und die Datenschutzrichtlinie ab. Kontrollkästchen B ist optional und deckt die Anmeldung zum Marketing-Newsletter ab.
  2. Auf nicht ausgewählt setzen: Stellen Sie sicher, dass beide Kontrollkästchen im HTML standardmäßig nicht ausgewählt sind (das Attribut checked wird weggelassen).
  3. Sichtbarkeit über CSS: Da sich über 90 % der Benutzer auf Mobilgeräten befinden, platzieren Sie die Kontrollkästchen direkt über der Schaltfläche 'Verbinden', sodass sie ohne Scrollen im sofort sichtbaren Bereich ('above the fold') sichtbar sind. Verwenden Sie einen System-Font-Stack und setzen Sie die Schriftgröße des Labels auf 14px mit einer Zeilenhöhe von 1.4 für optimale Lesbarkeit.
  4. Scrollbox für Nutzungsbedingungen: Um zu verhindern, dass der rechtliche Text die Formularelemente aus dem Bildschirm schiebt, platzieren Sie die detaillierten Nutzungsbedingungen in einem scrollbaren Container mit fester Höhe (max-height: 100px; overflow-y: auto; background-color: #F5F1ED; border: 1px solid #D1D5DB; border-radius: 6px;), der über einen Textlink auf- und zugeklappt werden kann. Dies sorgt für ein sauberes Layout mit hoher Conversion-Rate bei gleichzeitiger absoluter Einhaltung aller rechtlichen Vorgaben.

Q3. Eine Einzelhandelskette [Retail](/industries/retail) stellt eine selbst programmierte Splash Page in 100 Filialen bereit. Der Designer hat Google Fonts (Montserrat) verwendet und im HTML-Head auf ein von einem CDN gehostetes Bootstrap-Stylesheet verlinkt. Beim Testen in einem Unternehmensnetzwerk wird die Seite wunderschön dargestellt. Bei der Bereitstellung auf einem Test-Store-AP mit einer Captive-Network-Konfiguration wird die Seite jedoch mit unformatiertem Times-New-Roman-Text, fehlerhafter Ausrichtung und fehlenden Symbolen angezeigt. Warum passiert das und wie müssen die Assets überarbeitet werden?

Hinweis: Analysieren Sie den Zustand der Netzwerkverbindung, bevor ein Benutzer authentifiziert wird, und bestimmen Sie, wie der Browser externe HTTP-Anfragen an Domains außerhalb des Walled Garden verarbeitet.

Musterlösung anzeigen

Dieser Fehler tritt auf, weil sich das Gerät beim Laden der Splash Page in einem unauthentifizierten, abgefangenen Zustand befindet. In diesem Zustand blockiert das Wireless Gateway den gesamten ausgehenden Internetverkehr und lässt nur Anfragen an Domains zu, die explizit im Walled Garden des Gateways freigegeben sind. Da die CDN-Domains für Bootstrap (cdn.jsdelivr.net) und Google Fonts (fonts.googleapis.com) nicht freigegeben sind, schlagen die Anfragen des Browsers zum Abrufen des Stylesheets und der Schriftdateien geräuschlos fehl. Infolgedessen greift der Browser auf seine Standard-Rendering-Engine zurück, was zu unformatiertem HTML (Times-New-Roman-Text) und fehlerhaften Layouts führt.

Refactoring-Strategie:

  1. Inline-CSS: Entfernen Sie den Link zum externen Bootstrap-Stylesheet. Kopieren Sie die erforderlichen CSS-Grid/Flexbox-Regeln direkt in einen <style>-Block im HTML-<head>. Dadurch wird sichergestellt, dass alle Layout-Anweisungen in der initialen Single-Page-Payload übertragen werden.
  2. System-Font-Stack implementieren: Entfernen Sie den Google Fonts @import- oder <link>-Aufruf. Ersetzen Sie ihn durch einen nativen System-Font-Stack im CSS (font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;). Dies zwingt das Gerät dazu, hochwertige Schriftarten zu verwenden, die bereits auf dem Betriebssystem vorinstalliert sind, wodurch die externe Netzwerkabhängigkeit vollständig entfällt.
  3. Base64-Codierung für Symbole/Logos: Wenn das Layout auf externe Bilder oder Symbolbibliotheken (wie FontAwesome) angewiesen ist, konvertieren Sie diese Symbole in das SVG-Format und binden Sie sie inline in das HTML oder als Base64-Data-URIs im CSS ein. Dies garantiert, dass die Seite zu 100 % in sich geschlossen ist und selbst bei völlig fehlender Internetverbindung perfekt gerendert wird.

Weiterlesen in dieser Reihe

Ubiquiti UniFi guest portal not redirecting: causes and fixes

Diese Anleitung isoliert einen Fehler bei der Weiterleitung des UniFi Guest Portals, indem sie den Status des Gastes, die Weiterleitung, die Route vor der Autorisierung und die Autorisierung des Controllers nacheinander durchläuft. Sie bietet IT-Teams an Standorten eine fundierte Methode zur Behebung von Konflikten zwischen Gastnetzwerken und Hotspots, Übergaben an externe Portale, aktuellen Anforderungen für UniFi OS-Konten und DNS-Isolationsprüfungen.

Leitfaden lesen →

Cisco Meraki Splashpage funktioniert nicht: Ein Ablaufdiagramm zur Fehlerbehebung

Diese praktische Day-Two-Anleitung isoliert die genaue Stelle, an der ein Cisco Meraki Splash-Flow fehlgeschlagen ist: Client-Autorisierung, Initiierung der HTTP-Weiterleitung, Erreichbarkeit des Walled-Garden oder RADIUS-Anmeldung. Sie bietet IT-Teams vor Ort einen kontrollierten Nachweispfad, um das Guest WiFi wiederherzustellen, ohne tiefgreifende Änderungen an einer aktiven Infrastruktur vorzunehmen.

Leitfaden lesen →

Enterprise Guest WiFi Einrichtungsleitfaden: VLAN-Segmentierung, Sicherheit und Captive Portals

Dieser technische Leitfaden zeigt IT-Teams, wie sie Guest WiFi als kontrollierten Internetzugangsdienst mithilfe von VLAN-Segmentierung, Firewall-Richtlinien und einem Captive Portal einrichten. Er erklärt außerdem, wie die Registrierungsformulare und Onboarding-Steuerelemente von Purple eine angemessene Benutzererfahrung für Besucher unterstützen, ohne die Grenzen um Mitarbeiter-, Zahlungs- und Betriebssysteme zu schwächen.

Leitfaden lesen →

Haben Sie Fragen zu Ihrem spezifischen Setup?

Unser Team arbeitet mit Standortbetreibern, IT-Managern und Netzwerktechnikern an über 80.000 Standorten zusammen. Buchen Sie ein 20-minütiges Gespräch und wir zeigen Ihnen, wie andere diese Herausforderungen gelöst haben.