iOS 7 Web应用程序中的HTTP身份验证无响应

时间:2013-09-25 18:04:32

标签: ios http authentication ios7

我的组织有一个在iOS 6中完美运行的网络应用程序。您将访问该网站,该网站会告诉您将该页面添加到您的主屏幕,并且热潮,一个不错的HTML5网络应用程序被添加到主屏幕

由于我们正在处理敏感数据,因此Web应用程序使用HTTP身份验证(通过本机WebKit身份验证对话框)来验证用户/通行证。它在iOS 7之前顺利运行。现在当有人试图召唤HTTP身份验证对话框时,没有任何反应。显然尝试加载某些东西,因为状态栏中的微调器出现了,但没有弹出对话框,基本上打破了“app”。

有没有其他人遇到这个?这是你认为苹果公司的一个错误吗?任何解决方法?

2 个答案:

答案 0 :(得分:3)

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

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

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

这是它被打破的地方。如果您在同一页面上嵌入对来自2个以上主机的对象的调用(需要进行基本身份验证),则该页面上的第3个身份验证提示将被禁止,因此浏览器将永远等待您在您从未看到的提示上输入凭据。您的Safari浏览器现在挂在停止的身份验证提示上,即使在重新加载时也会挂在此任何其他选项卡上,除非您严格关闭浏览器或重新启动设备,否则不会再收到其他提示。

这不会影响Chrome,只会影响Safari,而且它同时适用于iPhone和iOS 6或更高版本的iPad。在撰写本文时,我有最新的iOS版本(7.0.6),问题仍然存在。

我们去年有一个解决方法,在那里我们将创建一个内部页面,其中包含每个嵌入式主机的数组,然后我们将使用iframe在该主机位置嵌入对favicon.ico的调用来循环。直到最近才开始工作,现在,也许是因为iOS 7功能冻结背景标签,auth提示再次被冻结。

以下是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中的第二个集合将直观地显示哪些主机已经过身份验证,因为它们的favicon现在已显示。它还可以让您知道哪个主机可能会停止,因为它的图标缺失。

由于此解决方法已停止在iOS 7上运行,我们唯一的麻烦解决方案是为每个favicons预先打开一个单独的选项卡(直接在URL中),输入auth,返回,转到下一个在列表中,重复,直到您缓存了页面上使用的所有主机的所有auth凭据。此时,您可以加载原始页面,因为您的信用卡现在已被缓存。对于最终消费者而言,这是一种肮脏的,并且完全不合理,但我们需要做的是测试公共CDN背后的网站,因为我们需要使用ACL来保护该开发站点上的资产。

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

当乔布斯还活着的时候,确实工作得更好。

希望其中一些有帮助。

答案 1 :(得分:1)

我有完全相同的问题。基本身份验证适用于以前的iOS版本,但不适用于iOS 7以及添加到主屏幕的Web应用程序。我认为这可能与here描述的对话问题有关。

  

标准对话框根本不起作用,例如提醒,确认或提示。

显示用于对用户进行身份验证的登录提示可能已被阻止(无效或不可见),这就是Web应用程序未通过身份验证阶段的原因。

我想Apple必须在将来的版本中解决这个问题。

编辑:升级到iOS 7.0.3后,基本身份验证在主屏幕Web应用程序模式下也突然重新开始工作。显示登录提示,一切都按预期工作。