如何创建WiFi弹出式登录页面

30

当我到一个WiFi热点的地方(比如Panera Bread)并用我的iPhone连接时,登录页会以弹窗的形式出现。也就是说,无论我运行什么应用程序或者在什么网页上,该登录页面都会从底部滚动出来,要求输入我的登录凭据,然后消失。

但在其他一些热点中,直到我到Safari中尝试加载一个网页之前,我都没有看到登录页面。

iPhone在寻找什么原因导致在一些热点中弹出登录页面而在另一些热点中不弹出?有特殊的HTML元标签吗?还是与重定向的实现方式有关?

3个回答

37

我成功找到了这种认证类型的正确术语: “Captive portal”(强制门户)。在Google中搜索“Captive Portal iPhone”,可以从这些页面获取一些技术细节:onetwothree

要实现Wi-Fi弹出式登录页面:

  1. www.apple.com的DNS请求不能失败
  2. 使用特殊用户代理CaptiveNetworkSupport/1.0 wispr的HTTP请求http://www.apple.com/library/test/success.html不能返回Success

我还没有测试过,但听起来差不多。


下面的评论提到iOS 7的行为有所不同,可能会查询多个服务器。 我没有测试过。因此,最简单的方法是将所有HTTP通信重定向到您的登录页面,并阻止所有非HTTP通信。

微软的强制门户检测使用类似的方法,与iOS7之前的行为相似:其网络连接状态指示器尝试联系http://www.msftncsi.com。 Windows 8和8.1还包括对WISPr的支持

Android的囚禁门户检测(截至AOSP 4.0.1版本)尝试访问http://clients3.google.com/generate_204http://www.google.com/blank.html

因此,为了尽可能地通用,您需要阻止除身份验证之外的所有通信,并在登录页面上包含WISPr支持。

我建议“使用网络上的适当身份验证”--例如PEAP+MSCHAPv2--但Windows使用户设置非常痛苦。 我不知道谁认为“使用Windows身份验证详细信息”是非企业域网络机器的理智默认值,甚至不知道为什么“检查证书有效性”是一个合理的默认值,因为大多数网络将不会把获取适当证书视为优先事项。


1
这是一篇更详细的有趣文章:http://erratasec.blogspot.com/2010/09/apples-secret-wispr-request.html - Aaron Brager
2
@sailor 只有部分正确。在IOS7中,苹果已经从测试单个页面转变为随机测试200多个站点,以查看wifi是否开放。现在您需要测试用户代理而不是URL。 - Jotne
@IvanVučica 嘿,抱歉再次提起这个问题。我对此非常感兴趣。你说:“所以最简单的方法就是将所有HTTP通信重定向到您的登录页面,并阻止所有非HTTP通信。”但如何强制打开浏览器?当连接到我的Linux机器的HotSpot AdHoc Wifi时,我正在寻找简单的打开浏览器方式。--------时间已经过去,事情已经改变。现在该怎么处理呢? - 3pic
@3pic 你不需要这样做。目前移动操作系统会弹出通知(Android)或下拉式的伪“浏览器”(iOS)。在桌面操作系统中,访问HTTP页面的用户将被重定向。就是这样。 - Ivan Vučica
我不明白问题出在哪里,为什么您不能让DNS服务器对任何查询都提供相同的A类型响应,即使是不存在的域名。由于我无法提供更多信息,在此我将不再回复。 - Ivan Vučica
显示剩余11条评论

1

iOS 6 显然已经修复了 WPA2 EAP,因为现在突然弹出了登录窗口。

我们公司的公共 WiFi 需要接受有关监控等方面的条款。我以前总是不得不手动打开 iPhone 或 iPad 上的 Safari 并导航到某个地方,它会重定向到一个内部接受页面,当你点击接受按钮时,它会回到你最初想去的地方。

今天,我升级到 iOS 6,惊喜地看到登录窗口从底部滑出,并允许我点击接受按钮,甚至不用打开 Safari。


-4

我怀疑当登录页面弹出时,Wi-Fi正在使用EAP。这是一种用于身份验证的Wi-Fi协议。在需要转到网页的情况下,认证将是由服务器实施的自定义访问(即比EAP更高级别的访问)。


2
不正确。我也在一个热点上看到过这种情况;它不是典型的EAP登录对话框。显示了一个需要登录的HTML页面。似乎甚至不需要通过HTTP请求。当前应用程序被覆盖在登录网页上。 - Ivan Vučica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接