ios - iOS 7 Web 应用程序中的 HTTP 身份验证没有响应

标签 ios http authentication ios7

我的组织有一个在 iOS 6 中完美运行的网络应用程序。你访问该网站,该网站会告诉你将该页面添加到你的主屏幕,然后繁荣,一个漂亮的 HTML5 网络应用程序被添加到主屏幕.

因为我们正在处理敏感数据,所以网络应用程序使用 HTTP 身份验证(通过 native WebKit 身份验证对话框)来验证用户/通行证。它在 iOS 7 之前一直运行顺利。现在当有人试图调用 HTTP 身份验证对话框时,什么也没有发生。当状态栏中的微调器出现时,它显然是尝试加载某些内容,但从未弹出任何对话框,基本上破坏了“应用程序”。

还有其他人遇到过这个吗?您认为这是 Apple 端的错误吗?任何解决方法?

最佳答案

我的公司去年秋天遇到了这个问题,从 iOS 6 开始,我们能够确定的是,这是一个真正的 Apple Safari 错误,作为其安全“增强”的一部分。他们没有对基本原理进行真正的解释,但这是我们在调试和数据包嗅探器中看到的。

在正常操作中,Safari 浏览器将通过 GET 从服务器请求页面(或页面中的对象)。如果该 Assets 受到访问控制列表的保护,在我们的例子中是 Apache Basic Auth,并且它是 session 中该主机上的第一个请求,服务器将使用 401 HTTP 响应 header 进行响应,指示客户端(浏览器)它需要再次请求,这次添加一个具有授权凭据的基本身份验证 header 。然后浏览器向用户显示一个登录对话框,他们可以在其中输入用户和传递凭据,然后提交或取消请求。提交时,客户端会在 auth header 中使用这些凭据重新请求。

假设凭据在第二个 GET 请求中被接受,正确的 Assets 将在响应中返回,浏览器中的文档将继续加载页面的其余部分(假设它是您请求的页面)。如果您有驻留在不同主机上的嵌入式 Assets ,并且该主机需要对该 Assets 进行身份验证,则该过程会在页面加载时重复。

这是它坏掉的地方。如果您在同一页面上嵌入了对来自 2 个以上主机的对象的调用,这需要基本身份验证,则该页面上的第三次身份验证提示将被抑制,因此浏览器将永远旋转,等待您在您从未见过的提示中输入凭据.您的 Safari 浏览器现在卡在停滞的身份验证提示上,在这个选项卡和任何其他选项卡上,甚至在重新加载时,您都不会收到另一个提示,除非您硬关闭浏览器或重新启动设备。

这不会影响 Chrome,只会影响 Safari,并且它会同时出现在装有 iOS 6 或更高版本的 iPhone 和 iPad 上。在撰写本文时,我使用的是最新的 iOS 版本 (7.0.6),但问题仍然存在。

去年我们有一个解决方法,我们将创建一个内部页面,其中包含每个嵌入式主机的数组,然后我们将使用一个 iframe 循环遍历该页面,在该主机的位置嵌入对 favicon.ico 的调用。直到最近,这一直有效,现在,可能是因为 iOS 7 卡住背景选项卡的功能,身份验证提示再次卡住。

这是 JavaScript 示例:

hosts=["store","profile","www","secure-store","images","m","modules"];
devhost=location.hostname;
var i=0;
while (hosts[i])
{
newhost=devhost.replace('store.mydomain',hosts[i]+'.mydomain');
document.write("<iframe Xhidden seamless=seamless width=0 height=0 src=http://"+newhost+"/favicon.ico><img height='16' width='20' alt='NOT' title='NOT AUTHENTICATED' src=http://"+newhost+"/favicon.ico> Authenticated on "+newhost+"</a></br></iframe>");
document.write("<img height='16' width='20' alt='NOT' title='NOT AUTHENTICATED' src="+(newhost.indexOf('secure')>0?'https://':'http://')+newhost+"/favicon.ico> Authenticated on "+newhost+"</a></br>");
i++;
}

document.write 中的第二个集合将直观地指示哪些主机已通过身份验证,因为现在会显示它们的图标。它还可以让您知道哪个主机可能已停止运行,因为它的图标丢失了。

由于此解决方法在 iOS 7 上停止工作,我们唯一麻烦的解决方案是为每个图标预先打开一个单独的选项卡(直接在 URL 中),输入授权,返回,转到下一个在列表中重复,直到您缓存了页面上使用的所有主机的所有身份验证凭据。那时,您可以加载原始页面,因为您的信用现在已被缓存。对最终消费者来说很粗糙,而且完全不合理,但这是我们需要为公共(public) CDN 后面的测试站点做的事情,因为我们需要使用 ACL 保护该开发站点上的 Assets 。

截至今天,我们仍在寻找更好的解决方法。在 Android、Windows 或任何其他 iOS 上不是问题。

当然,当乔布斯在世时效果会更好。

希望这对您有所帮助。

关于ios - iOS 7 Web 应用程序中的 HTTP 身份验证没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19012077/

相关文章:

authentication - ServiceStack Redis 身份验证持久化

ios - 如何从 iPhone 应用程序中删除客户端证书?

c# - .NET SoapClient 类发送的默认 http 用户代理 header 是什么?

image - meteor 图像,CSS, "Normal"Web 服务

rest - 创建多个资源时的 HTTP POST 响应 Location header

node.js - Loopback 支持代理身份验证吗?

node.js - 我使用 Parse.com 和 nodejs 进行用户身份验证,但每个人都是同一个用户

iphone - 插入读卡器后,AudioServicesPlaySystemSound 在 iPhone 中无法正常工作

ios - 如何使用 XCode 7 在 Storyboard 中将 View 高度设置为屏幕高度的百分比

ios - 使 SKScene 中所有事件的 NSTimer 失效