2011-01-26 1 views
1

Я работаю над приложением iPhone, которое использует ASIHTTPRequest для взаимодействия с веб-службой с использованием проверки подлинности NTLM. И учетные данные должны храниться в цепочке ключей. Он регистрируется в порядке, но я бы хотел, чтобы кнопка выхода из системы удаляла учетные данные из приложения, и я не могу заставить это работать.Удаление учетных данных из 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]; 
    } 
} 

такого рода работы, потому что в следующий раз, когда приложение запускается его» ll снова введите логин. Но при запуске приложения он не запрашивает другой логин.

+0

Я также сталкиваюсь с аналогичной проблемой. Вы нашли решение? –

+0

Нет, я так и не нашел хорошего ответа. –

ответ

0

Вы уверены, что используете порт 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.

+0

Нет, я не уверен, что порт 0, и не верно, но я просто подтвердил, что это значения, переданные в saveCredentials. Я попробовал ваше предложение, но он не работает для меня - он все еще кэширует учетные данные где-то. Вы используете NTLM? Интересно, если это имеет значение ... –

+0

Нет. Я не использую NTML. На данный момент я использую базовую аутентификацию доступа. К сожалению, я не могу воспроизвести вашу проблему. – Colbert

 Смежные вопросы

  • Нет связанных вопросов^_^