2011-01-26 58 views
1

我正在研究一個使用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]; 
    } 
} 

那種作品,因爲下一次應用程序啓動它會提示再次登錄。但是如果應用程序繼續運行,它不會提示另一次登錄。

+0

我也面臨類似的問題。你有沒有找到解決方案? – 2014-01-26 03:26:56

+0

不,我從來沒有找到一個好的答案。 – 2014-01-30 16:25:54

回答

0

你確定使用端口0,沒有領域是正確的嗎? 只是爲了確保我從我的connect-url-string(與所有ASIHTTPRequest使用的URL相同)創建NSURL,並從中檢索主機,端口和協議。我現在只需親自提一下這個領域。

使用此代碼我能在我的應用程序成功登出:

// clear keychain 
NSURL *url = [NSURL URLWithString:kConnectorUrlString]; 
[ASIHTTPRequest removeCredentialsForHost:[url host] port:[[url port] intValue] protocol:[url scheme] realm:kConnectorRealm]; 

我的應用程序再次提示我,當我讓我的應用程序繼續運行。 我正在使用傳遞給saveCredentials的相同參數。