NSURLCredential и NSURLConnection - PullRequest
       32

NSURLCredential и NSURLConnection

3 голосов
/ 31 января 2011

Я пытался найти способ сброса учетных данных после того, как вы установили NSURLCredential с NSURLConnection, который использует NSURLCredentialPersistenceForSession, но я не смог найти работающее решение. Удаление NSURLCredential из NSURLCredentialStorage только удаляет его из хранилища, а не из кэша NSURLConnection. Я попытался отключить кеш, и он все еще держит его. Мне нужно, чтобы это был NSURLCredentialPersistenceForSession, так как я не хочу, чтобы он загружал большие данные, затем возвращал вам нужную аутентификацию сообщения, затем аутентифицировался с помощью NSURLConnection и затем повторно отправлял большие данные, я просто хочу один раз пройти аутентификацию и отправить большие данные один раз. У меня есть способ аутентификации перед отправкой больших данных путем проверки некоторых свойств, но это не позволяет мне выйти из системы или повторно запросить аутентификацию. Я пишу клиент WebDav просто для того, чтобы вы поняли, где я нахожусь, и причина, по которой мне нужно сбросить учетные данные, заключается в том, что у кого-то есть несколько учетных записей на сервере WebDav и он хочет войти в другую учетную запись. Я пытался заглянуть в печенье, чтобы увидеть, что-то там есть, но это не так. Я знаю, что это только для сеанса, что означает, что после выхода и повторного запуска приложения, вы можете войти в систему как другой пользователь. Но это может запутать некоторых людей. Я думал о написании своей собственной системы аутентификации, но я не знаю, сколько времени это займет.

Извините, если вышеприведенное сообщение слишком длинное, я просто хочу объяснить все подробно, чтобы кто-то мог попытаться помочь мне с правильным ответом, а не с, иди сюда, чтобы привести меня к чему-то, что я попробовал.

Спасибо за любую помощь,
Мистер Гекко.

Обновление: пример кода.

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];
        }
    }
}

1 Ответ

0 голосов
/ 15 февраля 2011

Я работаю с сервером 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];
    }
}
...