系列文章目录



文章目录

  • 系列文章目录
  • 前言
  • 一、CaptivePortal是什么?
  • 二、Wi-Fi Portal认证过程
  • 总结



前言

连接WiFi后自动弹出认证页面,实现Captive Portal的方法有很多,常见的几种方式有:

  • DNS拦截:拦截所有DNS请求且返回认证主机IP地址(设置了强制主页),这样用户访问任何网站都会看到同一个强制主页。
  • HTTP重定向:利用HTTP重定向功能将所有的HTTP请求重定向到认证主机,如此一来,用户的发出的任何HTTP请求都会得到重定向后的强制主页。当用户通过认证后,便不再重定向用户请求。
  • IP跳转:把所有IP包里的目标地址改为认证主机地址,在认证主机上进行404跳转,当然是跳转到强制主页了。
  • 内核层劫持:当网关收到一个访问外网地址(80端口)的TCP SYN请求包后,立即伪造一个来自外网地址的TCP ACK包。客户端收到此伪造的响应后会误认为外网主机可以连接便再次发送ACK,此时TCP握手成功。客户端发起请求,网关再次劫持后回应ACK+PUSH包,其中就包含强制主页。

一、CaptivePortal是什么?

中文通常译作“强制主页”或“强制登录门户”。是一个登录Web页面,通常由网络运营商或网关在用户能够正常访问互联网之前拦截用户的请求并将一个强制登录或认证主页呈现(通常是通过浏览器)给用户。该页面可能要求用户输入认证信息、支付、接受某些条款或者其他用户授权等,随后用户才能被授权访问互联网。该技术广泛用于移动和个人宽带服务,包括有线电视、商业WiFi、家庭热点等,也可用于访问企业和住宅区有线网络。

二、Wi-Fi Portal认证过程

CaptivePortalLoginActivity:
 MyWebViewClient:
  onPageStarted()
   reevaluateNetwork()
    callVoidMethodIfExists(mCaptivePortal, "reevaluateNetwork")
    testForCaptivePortal()
  onPageFinished()
   reevaluateNetwork()
    callVoidMethodIfExists(mCaptivePortal, "reevaluateNetwork")
    testForCaptivePortal()

testForCaptivePortal() 
  urlConnection = (HttpURLConnection) mNetwork.openConnection(mUrl)
  httpResponseCode = urlConnection.getResponseCode()
 if (isDismissed(httpResponseCode, locationHeader, mProbeSpec)) {
                     done(Result.DISMISSED)
   mCaptivePortal.reportCaptivePortalDismissed()
    ConnectivityService$CaptivePortalImpl.appResponse(APP_RETURN_DISMISSED)
     mNetowrkMonitor.notifyCaptivePortalAppFinished(APP_RETURN_DISMISSED)
      NetowrkMonitor.sendMessage(CMD_CAPTIVE_PORTAL_APP_FINISHED, APP_RETURN_DISMISSED)
       NetowrkMonitor$DefaultState.CMD_CAPTIVE_PORTAL_APP_FINISHED
        CaptivePortal App responded with
        APP_RETURN_DISMISSED
         sendMessage(CMD_FORCE_REEVALUATION, NO_UID, 0)
          NetowrkMonitor$DefaultState.CMD_FORCE_REEVALUATION

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Wi-Fi Portal认证的过程。