2

我有一個程序在Panther,Tiger和Leopard系統上運行,並使用以下方法進行NSURLConnection身份驗證(「encodedUserPass」是auth字符串,通過base64編碼的用戶:通過)使用基本身份驗證的NSURLConnection在Tiger上失敗,在Panther和Leopard上成功

[theRequest addValue:encodedUserPass forHTTPHeaderField:@"Authorization"]; 
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

... ...後來在didReceiveAuthenticationChallenge

if ([challenge previousFailureCount] == 0) { 
NSURLCredential *newCredential; 
newCredential=[NSURLCredential credentialWithUser:login_name password:password persistence:NSURLCredentialPersistenceNone]; 
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
} 

這工作完全正常豹和豹系統,但對老虎徹底失敗。然而,奇怪的是,即使在Panther和Leopard「didReceiveAuthenticationChallenge」通常也被調用(即手動設置標題似乎不起作用)。

在Tiger上,始終調用didReceiveAuthenticationChallenge,嘗試按上圖所示進行響應,然後再次調用失敗。

兩個問題:(i)爲什麼不手動設置標題工作? (2)爲什麼Tiger(10.4)上述方法失敗?

更高版本的更新

經過一番思考,我意識到,必須有我的base64編碼方法不對的地方,並且有:沒追加等號帶來的base64字符串最多爲4個字符的倍數。我解決了它與

while ([bareString length] % 4) [bareString appendString:@"="]; 

而現在該程序在所有三個平臺上工作。所以問題(i)得到了解答:手動設置標題不起作用,因爲我沒有用等號標記填充。

但問題仍然存在:爲什麼我不能在Tiger中成功使用didReceiveAuthenticationChallenge?

回答

0

我剛纔偶然到你描述了同樣的問題,並發現NSURLCredentialPersistenceNone根本沒有老虎的工作,而指定NSURLCredentialPersistenceForSession一樣。

根據您的應用程序,可能或可能不是一個可接受的解決方法。

蘋果的文檔有點不盡人意,因爲它沒有指定「會話」的範圍實際上是什麼 - 直到應用程序退出,也許呢?

+0

謝謝你,尼克。我可以想象,這可能是解釋 - 也許這是至關重要的基本權威,因爲否則保留NSURLCredentials正在使用 - 而不是我在didReceiveAuthenticationChallenge提供的。持久性憑證會覆蓋我在didReceiveAuthenticationChallenge中提供的憑證嗎? – Dennis 2009-09-17 05:32:44

+0

如果憑證存儲區中存在有效的NSURLCredentials,則不調用didReceiveAuthenticationChallenge - 因此實際上存儲的優先。 – 2009-09-17 09:21:40