使用 iPhone UIWebView 時的 Asp.Net 表單身份驗證
我正在編寫一個使用表單身份驗證的 Asp.net MVC 2 應用程序,目前我的 iPhone 應用程序在通過 Web 進行身份驗證/登錄時遇到問題。我們開發了一個使用 UIWebView 控制項的簡單 iPhone 應用程序。在這個階段,應用程序所做的只是導航到我們的 Asp.Net 網站。很簡單,對吧?問題是,使用者無法通過登錄頁面。重現步驟是:
- 打開 iPhone 應用程序。
- 該應用程序導航到首頁。
- 使用者未通過身份驗證,因此他們被重定向到登錄螢幕/頁面
- 使用者輸入正確的使用者名和密碼。點擊送出。
- 在伺服器端,對使用者進行身份驗證,並使用 FormsAuthentication.GetAuthCookie 生成一個 cookie 並將其發送到客戶端。
- 伺服器發送重定向以將使用者發送到正確的首頁。
但是使用者隨後被重定向回登錄螢幕!
我對此進行了一些廣泛的調試,我所知道的是:
cookie 正在發送到客戶端,客戶端正在儲存 cookie。在 iPhone 調試器中驗證了這一點,並使用 Javsascript 在頁面上顯示 cookie 數據。cookie 被發送回伺服器。在 Visual Studio 調試器中驗證了這一點。它是正確的 cookie(與設置的相同)。屬性 User.Identity.IsAuthenticated 出於某種原因返回 false,即使 auth cookie 包含在 Request 對像中。我已驗證 iPhone 應用程序已設置為接受 cookie,並且它們位於客戶端上。
有趣的是:如果您在 iPhone 上打開 Safari 瀏覽器並直接訪問我們的網站,它就可以正常工作。
它在 iPad 上也有相同的行為,因為它不會通過登錄螢幕。這在模擬器和設備上重現。
這個相同的網站已經用 IE 7-8、Safari(用於 Windows)、Blackberry、IEMobile 6.5、Phone 7 進行了測試,並且可以找到。它不起作用的唯一情況是 iPhone 應用程序中的 UIWebView。
我們找到的解決方案是創建一個文件 (generic.browser) 並包含此 xml,以告訴 Web 伺服器“Mozilla”和預設瀏覽器設置都應該支持 cookie。
<browser refID="Mozilla" > <capabilities> <capability name="cookies" value="true" /> </capabilities> </browser>
我遇到了完全相同的問題,但使用了另一台設備(諾基亞 N8),並將問題追溯到使用者代理。
IIS 使用正則表達式來匹配使用者代理字元串。問題的根源在於它沒有針對特定設備的任何匹配正則表達式,並且最終處於使用預設屬性的最低匹配級別之一。預設屬性表示瀏覽器不支持 cookie。
解決方案:
- 在您的 Web 項目中添加一個名為
App_Browsers(右鍵點擊該項目,選擇:)的文件夾Add > Add ASP.NET Folder > App_Browsers。- 在該文件夾中添加一個文件(右鍵點擊,選擇:)
Add > New Item。該文件可以有任何名稱,但必須有.browser結尾。- 添加一個良好的匹配表達式和正確的功能(或添加更改
Default)。兩個例子:
<browsers> <browser id="NokiaN8" parentID="Mozilla"> <identification> <userAgent match="NokiaN8" /> </identification> <capabilities> <capability name="browser" value="NokiaN8" /> <capability name="cookies" value="true" /> </capabilities> </browser> </browsers>或者更改預設值:
<browsers> <browser refID="Default"> <capabilities> <capability name="cookies" value="true" /> </capabilities> </browser> </browsers>更多資訊:瀏覽器定義文件架構