Skip to main content

Captive Portals

A captive portal displays a splash page when users connect to your WiFi network. Users must authenticate (via email, social login, voucher, or payment) before gaining internet access. IronWifi hosts and manages your captive portal in the cloud.

Quick Start

  1. Navigate to Captive Portals > Add Captive Portal
  2. Enter a name and select your network
  3. Choose your vendor (access point brand)
  4. Enable authentication providers (email, social login, etc.)
  5. Copy the Splash Page URL to your controller
  6. Configure the Walled Garden on your controller
  7. Test by connecting to the WiFi network

How Captive Portals Work

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│ User │────▶│ Access │────▶│ IronWifi │
│ Device │ │ Point │ │ RADIUS │
└──────────────┘ └──────────────┘ └──────────────┘
│ │
│ HTTP Request │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Redirect │◀────────────────────────│ Walled │
│ to Splash │ │ Garden │
└──────────────┘ └──────────────┘


┌──────────────┐ ┌──────────────┐
│ Splash │────▶│ Auth │ (Google, Email, SMS, etc.)
│ Page │ │ Provider │
└──────────────┘ └──────────────┘

│ Success

┌──────────────┐
│ Internet │
│ Access │
└──────────────┘

Creating a Captive Portal

  1. Navigate to Captive Portals
  2. Click Add Captive Portal
  3. Configure the settings described below
  4. Click Save

Basic Settings

SettingDescription
NameGive your Captive Portal a descriptive name
DescriptionOptional description for your reference
NetworkThe network this portal belongs to (uses that network's RADIUS servers)
VendorBrand of your Access Points or Controller

Authentication Settings

Splash Page URL

This is the URL where your splash page is hosted. Configure this URL in your Controller settings as the External Captive Portal.

tip

The Splash Page URL is displayed in your Captive Portal settings after creation.

On Success Redirect

Define where users go after successful authentication:

OptionDescription
Initially Requested URLReturn to the page they were trying to visit
Success PageShow a custom success page
External URLRedirect to a specific URL (include protocol, e.g., https://www.example.com)

Language

Select the language for internal error and notice messages.

Authentication Providers

Configure which authentication methods are available on your splash page:

  • Email - Users enter their email address
  • Social Login - Google, Facebook, LinkedIn, Twitter, Apple
  • SMS - Phone verification via text message
  • Vouchers - Pre-generated access codes
  • Username/Password - Traditional login
  • SAML - Enterprise single sign-on
  • Payment - Pay for access via Stripe, Braintree, PayPal

See Authentication Providers for detailed configuration.

Portal Pages

Customize the pages users see during authentication:

  • Splash Page - Initial landing page
  • Success Page - Shown after successful authentication
  • Error Page - Displayed when authentication fails
  • Terms Page - Terms and conditions

See Portal Pages for customization options.

Advanced Features

File Library

Upload and manage static files for your portal pages:

  • Logos and images
  • Custom CSS stylesheets
  • JavaScript files

Reference uploaded files using relative paths:

<img src="./logo.png">
<link type="text/css" href="custom.css" />

Cloud CDN

Enable Google Cloud CDN for faster loading of static files. This adds caching headers to improve performance globally.

Client Analytics

Collect detailed visitor information:

  • Screen resolution
  • Operating system
  • Browser and version
  • Installed fonts
  • Device type

Data is available in Reports.

MAC-Based Authentication

Allow returning users to auto-authenticate based on their device's MAC address:

  1. MAC address is extracted from the URL
  2. If the device was previously authenticated, access is granted automatically
  3. Users can manage authorized devices in their profile
  4. Administrators can deauthorize devices in the Console
note

If you delete a user, their MAC address associations are also deleted.

Purchase Confirmation

Enable to automatically send confirmation emails after successful access purchases.

Security Settings

IP Address Whitelist

Restrict access to the captive portal by IP range:

127.0.0.1, 10.0.2.0/24, 192.168.1.0/24

Leave empty for public access.

Webhook URL

Receive POST notifications after every successful authentication:

{
"user_type": "new",
"username": "john@example.com",
"logindate": "2024-01-15T10:30:00Z",
"request_url": "https://...",
"ap_mac": "AA:BB:CC:DD:EE:FF",
"client_mac": "11:22:33:44:55:66",
"auth_provider_name": "email",
"captive_portal_name": "Guest WiFi",
"orig_response": {}
}

Webhook Integration Examples

Zapier Integration:

  1. Create a Zap with "Webhooks by Zapier" trigger
  2. Select "Catch Hook"
  3. Copy the webhook URL to IronWifi
  4. Connect to apps like:
    • Google Sheets (log all logins)
    • Mailchimp (add to mailing list)
    • Slack (notify on new users)
    • HubSpot (create contacts)

Custom Integration (Node.js):

const express = require('express');
const app = express();
app.use(express.json());

app.post('/webhook/ironwifi', (req, res) => {
const { username, auth_provider_name, logindate } = req.body;

// Log to database
console.log(`New login: ${username} via ${auth_provider_name}`);

// Send welcome email
if (req.body.user_type === 'new') {
sendWelcomeEmail(username);
}

// Add to CRM
addToMailingList(username);

res.status(200).send('OK');
});

app.listen(3000);

Python Flask Example:

from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/webhook/ironwifi', methods=['POST'])
def handle_webhook():
data = request.json

# Process authentication event
username = data.get('username')
provider = data.get('auth_provider_name')

# Your custom logic here
log_authentication(username, provider)

return 'OK', 200

Webhook Behavior

AspectDetails
Timeout10 seconds - ensure your endpoint responds quickly
Retries3 attempts with exponential backoff (1s, 5s, 30s)
FormatJSON POST request with Content-Type: application/json
Expected ResponseHTTP 2xx status code

Webhook Troubleshooting

Webhook not triggering:

  1. Verify the webhook URL is publicly accessible (not localhost)
  2. Check URL includes https:// protocol
  3. Ensure your server accepts POST requests
  4. Review firewall rules allowing inbound connections

Webhook receiving but failing:

  1. Return HTTP 200 status within 10 seconds
  2. Process data asynchronously for slow operations
  3. Log incoming requests to debug payload issues
  4. Check your server logs for errors

Testing your webhook:

# Test with curl
curl -X POST https://your-server.com/webhook/ironwifi \
-H "Content-Type: application/json" \
-d '{
"user_type": "new",
"username": "test@example.com",
"auth_provider_name": "email"
}'

Common webhook errors:

ErrorCauseSolution
Connection timeoutServer unreachableCheck server is running and accessible
SSL certificate errorInvalid/expired certInstall valid SSL certificate
500 Internal Server ErrorCode exceptionCheck server logs, validate JSON parsing
401 UnauthorizedAuth requiredRemove authentication or add API key handling

Controller Configuration

Your Captive Portal settings page displays information needed for controller configuration:

SAML Settings (if enabled)

SettingDescription
SAML ACS URLAssertion Consumer URL for your Identity Provider
SAML Logout URLOptional logout URL for IdP configuration
Entity IdGlobally unique name for this SAML entity

RADIUS Servers

IP addresses, ports, and shared secrets for Primary and Backup servers (same as Network settings).

Walled Garden

List of IP addresses and domains to add to your controller's pre-authorization access list. See Walled Garden Guide.

important

All visitors need access to the Splash Page URL, hosted at 107.178.250.42/32

Guest Manager

Configure how temporary user accounts are created during captive portal authentication.

Auto-Registration Settings

SettingDescription
Auto-create usersAutomatically create user accounts when guests authenticate
Default groupAssign new users to a specific group with predefined policies
Username formatUse email, phone number, or generate unique ID
Password policyAuto-generate or allow user-defined passwords

User Data Collection

Configure which information to collect during registration:

FieldRequiredNotes
EmailConfigurablePrimary identifier for most providers
Full NameOptionalFirst/last name fields
Phone NumberOptionalRequired for SMS authentication
CompanyOptionalUseful for business venues
Custom FieldsOptionalAdd your own fields (e.g., room number, department)

Account Policies

SettingDescriptionRecommended
Account ExpirationHow long until account is deleted30-90 days
Session DurationMax time per login session24 hours
Max SessionsConcurrent device limit3-5 devices
Re-authenticationRequire login after period7 days

Data Privacy

For GDPR and privacy compliance:

  • Enable consent checkbox before data collection
  • Link to your privacy policy on splash page
  • Configure data retention period in account policies
  • Support data export and deletion requests
tip

Set account expiration to match your data retention policy to automatically comply with privacy regulations.

Session Management

Session Timeout

Configure how long users stay authenticated:

SettingDescription
Session TimeoutMaximum session duration (e.g., 24 hours)
Idle TimeoutDisconnect after inactivity (e.g., 30 minutes)
Session LimitMaximum concurrent sessions per user

Bandwidth Limits

Control network usage per user:

SettingDescription
Download LimitMaximum download speed (Mbps)
Upload LimitMaximum upload speed (Mbps)
Data CapMaximum data transfer per session

Access Schedules

Restrict access to specific times:

  • Business hours only
  • Weekdays vs weekends
  • Custom schedules

Analytics & Reporting

Track captive portal usage in the IronWifi Console:

Available Reports

ReportDescription
AuthenticationsSuccessful/failed login attempts
User ActivitySession duration, data usage
Provider UsageWhich auth methods are popular
Device TypesMobile vs desktop breakdown
Peak TimesBusiest connection times

Accessing Reports

  1. Navigate to Reports in the Console
  2. Select Captive Portal category
  3. Choose date range and filters
  4. Export to CSV or PDF

Real-time Monitoring

  • View currently connected users
  • Monitor active sessions
  • Track bandwidth usage

Troubleshooting

Splash Page Not Loading

  1. Verify 107.178.250.42/32 is in your Walled Garden
  2. Check controller external captive portal URL is correct
  3. Ensure HTTPS redirect is enabled on controller
  4. Test direct access to splash URL in browser

Authentication Failing

  1. Check IronWifi Console > Logs for error messages
  2. Verify authentication provider credentials (OAuth keys, etc.)
  3. Ensure all required domains are in Walled Garden
  4. Test with different authentication method

Users Not Redirected

  1. Verify captive portal is enabled on controller
  2. Check client is on correct VLAN/SSID
  3. Some apps bypass captive portal - test with browser
  4. Check for DNS issues

Social Login Not Working

  1. Verify OAuth app credentials are correct
  2. Check redirect URI matches IronWifi settings
  3. Ensure social provider domains in Walled Garden
  4. Test in incognito/private browser window

MAC Authentication Issues

  1. Verify MAC address format matches controller
  2. Check user has MAC authentication enabled
  3. Ensure device was previously authenticated
  4. Review MAC authorization logs

Mobile Device Behavior

Mobile devices handle captive portals differently. Understanding these behaviors helps troubleshoot issues.

Captive Network Assistant (CNA)

Most devices use a mini-browser to detect and display captive portals:

DeviceCNA BehaviorNotes
iOSAuto-opens popup browserLimited functionality, no extensions
AndroidNotification + popup browserVaries by manufacturer
WindowsNotification to open browserClick required
macOSAuto-opens popup browserSimilar to iOS
ChromeOSNotification + popupSign-in required prompt

iOS-Specific Issues

CNA limitations on iOS:

  • No access to cookies from main Safari
  • Social login popups may not work
  • Limited JavaScript support
  • Users may need to tap "Use Without Internet" and manually open Safari

Workaround for social login:

<!-- Add a link to open full Safari -->
<p class="cna-notice">
Having trouble? <a href="{{splash_url}}" target="_blank">Open in Safari</a>
</p>

Detecting CNA browser:

// iOS CNA has limited window size
if (window.innerWidth < 400 && /CaptiveNetworkSupport/.test(navigator.userAgent)) {
document.body.classList.add('cna-mode');
}

Android-Specific Issues

Common Android problems:

  • Some devices don't auto-detect captive portals
  • VPN apps may interfere with detection
  • "Always-on VPN" blocks captive portal

Solutions:

  1. Instruct users to disable VPN temporarily
  2. Provide manual URL to access splash page
  3. Configure controller to use HTTP (not HTTPS) redirect initially

Apps Bypassing Captive Portal

Some apps bypass captive portal detection:

App TypeBehaviorSolution
VPN appsTunnel traffic, skip portalUser must disable VPN
Email appsBackground sync failsUser opens browser to authenticate
Some gamesDirect socket connectionsBlock until authenticated
Banking appsCertificate pinning failsAuthenticate via browser first

Best Practices for Mobile

  1. Keep splash pages simple - Complex JS may fail in CNA
  2. Test social login in CNA - May need "Open in browser" fallback
  3. Provide manual URL - Display splash URL for manual access
  4. Use responsive design - CNA browsers have small viewports
  5. Avoid pop-ups - Many CNA browsers block them
  6. Test on real devices - Simulators don't replicate CNA behavior

FAQ

How do I customize the splash page design?

See Portal Pages for customization options including the visual editor and HTML/CSS editing.

Can I use my own domain for the splash page?

Yes, contact IronWifi support to configure a custom domain with SSL certificate.

How do I require terms acceptance?

Enable the Terms page in Portal Pages and configure the checkbox requirement in your splash page settings.

Can users authenticate on multiple devices?

Yes, configure the session limit in Guest Manager settings. Users can also manage their authorized devices.

How do I set up paid WiFi access?

Enable a payment provider (Stripe, Braintree) in Authentication Providers and configure access plans with pricing.

GDPR & Privacy Compliance

For EU customers and GDPR compliance:

Ensure your splash page includes:

  1. Clear consent checkbox - Users must actively opt-in
  2. Privacy policy link - Accessible before authentication
  3. Purpose explanation - What data is collected and why
  4. Marketing opt-in - Separate checkbox for promotional emails
<div class="consent-section">
<div class="checkbox-group">
<input type="checkbox" id="privacy" required>
<label for="privacy">
I have read and agree to the
<a href="/privacy-policy" target="_blank">Privacy Policy</a> *
</label>
</div>

<div class="checkbox-group">
<input type="checkbox" id="marketing">
<label for="marketing">
I agree to receive promotional emails (optional)
</label>
</div>
</div>

Data Retention

Configure data retention policies in IronWifi:

Data TypeRecommended RetentionNotes
Authentication logs90 daysRequired for security
User accountsUntil deletion requestGDPR right to erasure
Session data30 daysNetwork troubleshooting
Marketing consentIndefinitelyProof of consent

User Rights Implementation

Support GDPR user rights:

  • Right to access: Users can view their data in profile
  • Right to erasure: Delete user accounts on request
  • Right to portability: Export user data as CSV/JSON
  • Right to rectification: Users can update their information

If using analytics or tracking:

<div id="cookie-notice" class="cookie-banner">
<p>We use cookies to improve your experience.
<a href="/cookie-policy">Learn more</a></p>
<button onclick="acceptCookies()">Accept</button>
<button onclick="declineCookies()">Decline</button>
</div>

Troubleshooting Flowchart

                    CAPTIVE PORTAL NOT WORKING
|
v
+---------------+---------------+
| |
v v
Splash page loads? No redirect?
| |
Yes | No Yes | No
| | | |
v v v v
Check Check Check Check
auth walled CP is DHCP/DNS
providers garden enabled settings
| | | |
v v v v
+--------------------+ +--------------------+
| AUTH ISSUES | | REDIRECT ISSUES |
+--------------------+ +--------------------+
| | | |
| - OAuth creds? | | - DNS redirect? |
| - Walled garden | | - HTTPS intercept? |
| domains? | | - Client on |
| - Provider | | correct VLAN? |
| enabled? | | - Firewall rules? |
+--------------------+ +--------------------+

SPLASH PAGE NOT LOADING
|
v
Is 107.178.250.42 in walled garden?
|
No | Yes
| |
v v
Add it Check controller
and captive portal
retry URL configuration
|
v
Is URL exactly correct?
(including https://)
|
No | Yes
| |
v v
Fix URL Check DNS
resolution
from client

API & Programmatic Management

Manage captive portals programmatically via the IronWifi API.

Authentication

curl -X POST https://console.ironwifi.com/api/auth \
-H "Content-Type: application/json" \
-d '{"username": "your@email.com", "password": "your-password"}'

Response:

{
"token": "eyJhbGciOiJIUzI1NiIs..."
}

List Captive Portals

curl -X GET https://console.ironwifi.com/api/captive-portals \
-H "Authorization: Bearer YOUR_TOKEN"

Get Captive Portal Details

curl -X GET https://console.ironwifi.com/api/captive-portals/{id} \
-H "Authorization: Bearer YOUR_TOKEN"

Update Captive Portal

curl -X PUT https://console.ironwifi.com/api/captive-portals/{id} \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Portal Name",
"redirect_url": "https://example.com"
}'

List Authenticated Users

curl -X GET https://console.ironwifi.com/api/captive-portals/{id}/sessions \
-H "Authorization: Bearer YOUR_TOKEN"

Disconnect User

curl -X DELETE https://console.ironwifi.com/api/sessions/{session_id} \
-H "Authorization: Bearer YOUR_TOKEN"

API Rate Limits

EndpointRate Limit
Authentication10/minute
Read operations100/minute
Write operations30/minute

See API Documentation for complete reference.

Controller Configuration Guides

Configure your access point/controller for captive portal:

Ubiquiti

VendorConfiguration Guide
UniFi ControllerUniFi Guide
UniFi HotspotUniFi Hotspot Guide

Cisco

VendorConfiguration Guide
MerakiMeraki Guide
CatalystCatalyst Guide
WLCWLC Guide
Mobility ExpressMobility Guide

Aruba

VendorConfiguration Guide
IAP (Instant)Aruba IAP Guide
Instant OnInstant On Guide
Mobility ControllerMobility Controller Guide

Ruckus

VendorConfiguration Guide
SmartZoneSmartZone Guide
Ruckus CloudRuckus Cloud Guide
Zone DirectorZone Director Guide
Ruckus Flex (Unleashed)Ruckus Flex Guide

Other Vendors

VendorConfiguration Guide
MikroTikMikroTik Guide
FortiGateFortiGate Guide
TP-Link OmadaOmada Guide
TP-Link EAPEAP Guide
Juniper MistMist Guide
pfSensepfSense Guide
OPNsenseOPNsense Guide
GrandstreamGrandstream Guide
CambiumCambium Guide
NETGEARNETGEAR Guide
SonicWallSonicWall Guide
ZyxelZyxel Guide
DrayTekDrayTek Guide
PeplinkPeplink Guide
TeltonikaTeltonika Guide
D-Link NucliasD-Link Nuclias Guide
Proxim WirelessProxim Guide
WatchGuardWatchGuard Guide
Alcatel-LucentAlcatel-Lucent Guide
CoovaChilliCoovaChilli Guide