2013-04-28 33 views
2

我有一个iOS应用程序通过XMLRPC连接到Django服务器(协议并不重要)。身份验证通过标准Cookie持续存在,并通过AFNetworking通过NSURLConnection进行透明处理。当请求未通过身份验证时,Django XMLRPC库会返回403错误,如果发生这种情况,应用程序会向用户显示登录页面。这种方法在几年内运行良好。403无线热点错误

最近出现的问题是连接到WiFi热点但未通过热点认证的用户。他们加载了应用程序并显示登录页面,该页面一定是从热点返回的403错误的结果。如果他们首先验证热点,那么一切正常。

我试图找到一种解决方案,以防止我的应用程序将此类403错误解释为失败的身份验证。我假设有两件事情发生:

  • 热点重定向到一个URL,返回403错误;或
  • 该热点立即返回403错误。

第一种情况很容易通过阻止301302重定向进行管理。幸运的是,AFNetworking使这一切变得简单。

第二种情况比较困难,我看不出从403的起源地。

有没有人知道标题中是否有其他内容可以检测到403的来源,或者在没有登录到热点时是否有标准的重定向请求?

编辑

下面列举一下我的Django服务头部看起来像一个403

HTTP/1.1 403 FORBIDDEN 
Server: nginx 
Date: Sun, 28 Apr 2013 07:21:34 GMT 
Content-Type: text/html; charset=utf-8 
Content-Length: 0 
Connection: keep-alive 
Vary: Cookie 
Set-Cookie: sessionid=5a5ce154d1229e40c3773e8f6999a32d; expires=Sun, 18-Aug-2013 07:21:34 GMT; httponly; Max-Age=9676800; Path=/ 
+0

您可以记录返回的标题以查看可用内容。你有权修改Web服务吗? – Wain 2013-04-28 07:23:00

+0

我很遗憾所讨论的热点位于世界的另一边,所以我无法检查。我编辑我的问题,以显示我的web服务的头像是什么样的......没有什么用处。 – chris 2013-04-28 07:28:25

+0

现在我想到了......我可以创建一些中间件来向HTTPRepsonse添加一些内容以识别响应的来源......看起来像是一种黑客。 – chris 2013-04-28 07:52:02

回答

1

我能找到的最简单的解决方案是一个自定义标题从我的Django的服务器添加到响应,并验证客户端中的头文件以确保它来自服务器而不是热点。