我正在研究一個使用ASIHTTPRequest與使用NTLM身份驗證的Web服務進行交互的iPhone應用程序。證書應該存儲在鑰匙串中。它的日誌記錄正常,但我想要一個註銷按鈕,從應用程序中清除憑據,我無法讓它工作。從ASIHTTPRequest中清除憑據
當我點擊註銷按鈕後,我希望當我回到查詢服務器的視圖時,我會提示重新登錄。但是,這並沒有發生,並且對服務器的調用仍然進行身份驗證。
發出請求的代碼如下所示:
NSString *urlString = [NSString stringWithFormat:@"http://myserver.mydomain.com/myapp/items/%@", itemGroupId];
NSURL *url = [NSURL URLWithString:urlString];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseKeychainPersistence:YES];
[request setShouldPresentAuthenticationDialog:YES];
[request setRequestMethod:@"POST"];
[request addRequestHeader:@"content-type" value:@"application/json;charset=utf-8"];
[request addRequestHeader:@"content-length" value:@"0"];
[request setDelegate:self];
[request startAsynchronous];
對於註銷,我已經打過電話:
[ASIHTTPRequest removeCredentialsForHost:@"myserver.mydomain.com" port:0 protocol:@"http" realm:nil];
但是,這並不工作。該方法中的代碼沒有找到已保存的NSURLCredential,因此它可以將其刪除,即使這些參數是我所看到的傳遞給saveCredentials的:forHost:port:protocol:realm:首先。
我也嘗試調用clearSession,並且我嘗試使用setUseSessionPersistence創建請求時完全禁用會話持久性,但沒有運氣。
我也嘗試使用基於this example通過應用中的全部的鑰匙串證書的循環,並刪除它們的所有代碼:
NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
for (NSURLProtectionSpace *space in [store allCredentials]) {
NSDictionary *userCredentialMap = [store credentialsForProtectionSpace:space];
for (NSString *user in userCredentialMap) {
NSURLCredential *credential = [userCredentialMap objectForKey:user];
[store removeCredential:credential forProtectionSpace:space];
}
}
那種作品,因爲下一次應用程序啓動它會提示再次登錄。但是如果應用程序繼續運行,它不會提示另一次登錄。
我也面臨類似的問題。你有沒有找到解決方案? – 2014-01-26 03:26:56
不,我從來沒有找到一個好的答案。 – 2014-01-30 16:25:54