2011-01-31 58 views
3

我一直在試圖尋找一種方式,一旦你設定一個NSURLCredential與使用NSURLCredentialPersistenceForSession一個NSURLConnection的取消設置的憑據,但我無法找到一個可行的解決方案。從NSURLCredentialStorage中刪除NSURLCredential僅將其從存儲中刪除,而不是從NSURLConnection緩存中刪除。我試圖關閉緩存,它仍然保留它。我需要它是NSURLCredentialPersistenceForSession,因爲我不希望它是上傳大量的數據,然後又回到了你需要再驗證消息NSURLConnection的身份驗證,然後重新發送大量的數據,我只想進行一次身份驗證,併發送大數據一旦。在通過檢查某些屬性發送大量數據之前,我有一種驗證方式,但這不允許我註銷或重新請求驗證。我正在寫一個WebDAV客戶端,只是讓你明白我的立場,我需要取消證書的理由是,如果有人有WebDAV服務器上的多個帳戶,並希望登錄到另一個帳戶。我試圖查看餅乾,看看它是否設置了一些東西,但它沒有。我知道這隻適用於會話,這意味着一旦您退出並重新啓動應用程序,您可以作爲其他用戶登錄。但這可能會讓一些人感到困惑。我想過編寫自己的認證系統,但我不知道需要多長時間。NSURLCredential和NSURLConnection的

很抱歉,如果上述消息太長,我只是確保我詳細解釋一切,所以有人可以嘗試幫助我有效的答案,不是,去這裏帶領我的東西我試過了。

感謝您的幫助,
壁虎先生。

更新:實施例的代碼。

CFHTTPMessageRef message = [self httpMessageFromResponse:response]; 
authentication = CFHTTPAuthenticationCreateFromResponse(kCFAllocatorDefault, message); 

CFHTTPMessageRef message = [self httpMessageFromRequest:request]; 
CFStreamError error; 
CFHTTPMessageApplyCredentials(message, authentication, (CFStringRef)[credentials user], (CFStringRef)[credentials password], &error); 
NSLog(@"%d", error.error); // Returns -1000 
CFStringRef value = CFHTTPMessageCopyHeaderFieldValue(message, CFSTR("Authorization")); 
NSLog(@"%@", (NSString *)value); // Returns NULL 
if (value!=NULL) 
CFRelease(value); 

更新:我嘗試刪除憑據的代碼。

- (void)resetCredentials { 
    NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
    NSDictionary *allCredentials = [store allCredentials]; 
    NSArray *keys = [allCredentials allKeys]; 
    for (int i=0; i<[keys count]; i++) { 
     NSURLProtectionSpace *protectionSpace = [keys objectAtIndex:i]; 
     NSDictionary *userToCredentialMap = [store credentialsForProtectionSpace:protectionSpace]; 
     NSArray *mapKeys = [userToCredentialMap allKeys]; 
     for (int u=0; u<[mapKeys count]; u++) { 
      NSString *user = [mapKeys objectAtIndex:u]; 
      NSURLCredential *credential = [userToCredentialMap objectForKey:user]; 
      NSLog(@"%@", credential); 
      [store removeCredential:credential forProtectionSpace:protectionSpace]; 
     } 
    } 
} 
+0

我試過使用CFHTTPAuthenticationRef,但我不斷收到kCFStreamErrorHTTPAuthenticationTypeUnsupported這是一個奇怪的響應。我使用CFHTTPAuthenticationRef的想法是獲取生成的頭並將其應用於請求。以上代碼爲例。 – GRMrGecko 2011-01-31 17:52:10

回答

-1

我正在使用一個webdav服務器,並有類似的問題。我在Apple的AdvancedURLConnection項目的示例代碼中找到了一個解決方案。看來,祕密是要遍歷保護空間,然後遍歷每個空間的憑證。這可能是不必要的,但對我來說卻很有用。

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
assert(store != nil); 
for (NSURLProtectionSpace *protectionSpace in [store allCredentials]) { 
    NSDictionary *userToCredentialMap = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:protectionSpace]; 
    assert(userToCredentialMap != nil); 
    for (NSString *user in userToCredentialMap) { 
     NSURLCredential *credential = [userToCredentialMap objectForKey:user]; 
     assert(credential != nil); 
     [store removeCredential:credential forProtectionSpace:protectionSpace]; 
    } 
} 
+0

我試過這個,但它不起作用,我會添加我在問題中嘗試過的代碼。我甚至提到我試過這個... – GRMrGecko 2011-02-21 17:01:58