Удаление учетных данных из ASIHTTPRequest

Я работаю над приложением для iPhone, которое использует ASIHTTPRequest для взаимодействия с веб-службой с использованием аутентификации NTLM. И учетные данные должны храниться в связке ключей. Он нормально входит в систему, но я хотел бы иметь кнопку выхода, которая очищает учетные данные из приложения, и я не могу заставить ее работать.

Я ожидаю, что после того, как я нажму кнопку выхода, когда я вернусь к представлению, которое запрашивает сервер, мне будет предложено снова войти в систему. Однако этого не происходит, и вызов сервера по-прежнему аутентифицируется.

Код, который делает запрос, выглядит так:

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, но не повезло.

Я также пробовал использовать код, основанный на этот пример, который перебирает все учетные данные в связке ключей приложения и удаляет их все:

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

Это работает, потому что при следующем запуске приложение снова запросит вход в систему. Но он не запрашивает другой вход, если приложение продолжает работать.


person David Anderson    schedule 26.01.2011    source источник
comment
Я тоже столкнулся с аналогичной проблемой. Вы нашли какое-нибудь решение?   -  person iPhone Guy    schedule 26.01.2014
comment
Нет, я так и не нашел на это хорошего ответа.   -  person David Anderson    schedule 30.01.2014


Ответы (1)


Вы уверены, что используете порт 0, и ни одна область не подходит? Просто чтобы убедиться, что я создаю NSURL из моей строки URL-адреса подключения (тот же URL-адрес, который я использую для всех ASIHTTPRequest), и извлекаю из него хост, порт и протокол. Мне нужно сейчас только упомянуть царство вручную.

Используя этот код, я могу успешно выйти из своего приложения:

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

Мое приложение снова запрашивает меня, когда я разрешаю своему приложению работать. Я использую те же аргументы, которые передаются в saveCredentials.

person Colbert    schedule 26.02.2011
comment
Нет, я не уверен, что порт 0 и никакая область верны, но я только что проверил, что это значения, переданные в saveCredentials. Я попробовал ваше предложение, но у меня это не работает - учетные данные все еще где-то кешируются. Вы используете NTLM? Интересно, имеет ли это значение ... - person David Anderson; 28.02.2011
comment
Нет, я не использую NTML. Сейчас я использую обычную аутентификацию доступа. К сожалению, я не могу воспроизвести вашу проблему. - person Colbert; 01.03.2011