Я работаю над приложением для 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];
}
}
Это работает, потому что при следующем запуске приложение снова запросит вход в систему. Но он не запрашивает другой вход, если приложение продолжает работать.