去年秋天,我的公司遇到了這個問題,從iOS 6開始,我們已經能夠確定它是一個真正的Apple Safari bug作爲其安全「增強」的一部分。沒有真正的理由解釋他們,但這是我們在調試和數據包嗅探器中看到的。
在正常操作中,Safari瀏覽器將從GET服務器請求頁面(或頁面中的對象)。如果該資產受到訪問控制列表的保護(在我們的例子中是Apache Basic Auth),並且它是該會話中該主機的第一個請求,服務器將響應一個401 HTTP響應標頭,向客戶端(瀏覽器)它需要再次請求,這次添加一個具有授權憑證的基本auth頭。然後瀏覽器向用戶展示一個登錄對話框,在那裏他們可以輸入用戶並傳遞憑證,並提交或取消請求。提交時,客戶端會重新請求auth頭中的憑據。
假設在第二個GET請求中接受憑證,適當的資產將返回響應,瀏覽器中的文檔將繼續加載頁面的其餘部分(假設它是您請求的頁面)。如果嵌入的資產駐留在不同的主機上,並且該主機需要對該資產進行身份驗證,則在頁面加載時會重複該過程。
這裏是它被打破的地方。如果您在同一頁面中嵌入了來自兩個以上主機的對象(需要基本身份驗證)的對象調用,則該頁面上的第三個身份驗證提示會被取消,以便瀏覽器永遠在等待您輸入憑據。您的Safari瀏覽器現在已掛起在暫停的身份驗證提示上,即使是在重新加載時,也會在此和任何其他選項卡上掛起,除非您直接關閉瀏覽器或重新啓動設備,否則您將不會再獲得其他提示。
這不會影響Chrome瀏覽器,只是Safari,它既可以在iOS 6或更高版本的iPhone上運行,也可以在iPad上運行。在撰寫本文時(7.0.6),我有最新的iOS版本,問題仍然存在。
去年我們有一個解決方法,我們將創建一個內部頁面,其中包含每個嵌入式主機的數組,然後我們將通過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將給出視覺指示其主機已被認證,如現在所顯示他們的圖標的第二組。它還可以讓您知道哪個主機可能會被停用,因爲它的圖標不見了。
由於此解決方法在iOS 7上停止工作,因此我們唯一繁瑣的解決方案是爲每個圖標預先打開一個單獨的選項卡(直接在URL中),輸入auth,返回,轉到下一個一個在列表中,然後重複,直到您緩存了頁面上使用的所有主機的所有身份驗證憑據。此時,您可以加載原始頁面,因爲您的信用現在已被緩存。 Cruddy,對於最終用戶來說完全不合理,但是我們需要對公共CDN背後的網站進行測試,因爲我們需要使用ACL來保護該開發網站上的資產。
截至今日,我們仍在找出一個更好的解決方法。在Android,Windows或任何其他iOS上不是問題。
喬布斯還活着的時候肯定工作得更好。
希望這可以幫助一些。
您是否試圖重現此問題?至少你會知道它是否是Safari的bug。 – Pavlo
它僅在添加到主屏幕的Web應用程序中出現*。 Safari(應用程序)正確處理認證對話框,但我無法讓他們在Web應用程序中工作。 – oldwren
我們遇到過類似的行爲,請參閱我的問題http://stackoverflow.com/questions/18976407/broken-basic-authentication-in-web-apps-on-ios-7 –