При использовании NSURLCredentialPersistenceForSession при запросе и последующей очистке учетных данных при выходе из системы все еще сохраняются учетные данные
Я использую NSURLCredentialPersistenceForSession
в didReceiveAuthenticationChallenge
из NSURLConnection
метод делегата при входе в систему. Теперь, когда я выхожу из системы и использую этот код для очистки хранилища..
NSURLCredentialStorage *credentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
NSDictionary *credentialsDicationary = [credentialStorage allCredentials];
NSLog(@"credentialsDicationary..%@",[credentialsDicationary description]);
for (NSURLProtectionSpace *space in [credentialsDicationary allKeys]) {
NSDictionary *spaceDictionary = [credentialsDicationary objectForKey:space];
NSLog(@"spaceDictionary..%@",[spaceDictionary description]);
for (id userName in [spaceDictionary allKeys]) {
NSURLCredential *credential = [spaceDictionary objectForKey:userName];
[credentialStorage removeCredential:credential forProtectionSpace:space];
}
}
Но когда я внезапно захожу снова, точно после выхода из системы, происходит вход с неверными учетными данными. Пожалуйста, дайте mw знать, как очистить кеш. Это работает, если я перехожу через 5 секунд.
Заранее спасибо.. AJ
4 ответа
Если вы используете NSURLSession, аннулируйте сеанс и создайте новый, например:
[self.session invalidateAndCancel];
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
Это очистит учетные данные сессий.
Я столкнулся с той же проблемой, теперь она работает.
С помощью NSURLConnection
эту проблему можно легко исправить, добавив случайное число в конец URL:
Итак, ищите ваши URLRequest
и добавить случайное число к URLRequest
NSInteger randomNumber = arc4random() % 999;
NSString *requestURL = [NSString stringWithFormat:@"%@?cache=%ld",yourURL,(long)randomNumber];
NSURL *URLRequest = [NSURL URLWithString:requestURL];
И убедитесь, что у вас есть случайное число в конце всех URL, которые вы звоните.
У меня возникла та же проблема, и я попытался очистить хранилище учетных данных, файлы cookie, связанные с URL-адресом, и даже пытался сбросить сеанс, но, похоже, ничего не получалось, в конце концов я просто прибегнул к добавлению случайного значения строки запроса в конец URL-адреса, и это помогло трюк для меня
// Random number calculated.
NSInteger randomNumber = arc4random() % 16;
NSURL* apiURL = [NSURL URLWithString:@"https://localhost/api/"];
[[RKObjectManager sharedManager] getObjectsAtPath:[NSString stringWithFormat:@"%@getUser?randomNumber=%d",apiURL,randomNumber]
parameters:nil
success:successBlock
failure:failureBlock];
Поэтому вместо того, чтобы пытаться удалить текущие кэшированные учетные данные (что казалось невозможным), просто используйте "свежий" URL, чтобы не было никаких кешированных объектов, связанных с ним.
Если вы используете NSURLCredentialPersistenceForSession для создания учетных данных, то приложение сохраняет учетные данные для всего сеанса, пока приложение не будет закрыто.
Вы можете обойти это:
- изменение URL-адреса (например, добавление "#" в конец URL-адреса)
- Используйте NSURLCredentialPersistenceNone и предоставьте учетные данные для каждого nsurlrequest
- Добавьте информацию об аутентификации в URL ( http://username%3Apassword@mywebsite.com/) вместо использования кредитов
Добавить информацию об аутентификации в заголовок запроса вместо использования кредитов
//Pseudo code for appending to header: NSString *authString = [NSString stringWithFormat:@"%@:%@", self.loginCreds.username, self.loginCreds.password]; NSData *stringData = [authString dataUsingEncoding:NSUTF8StringEncoding]; authString = [NSString stringWithFormat:@"Basic %@", [stringData base64EncodedString]]; [[self requestHeader] setValue:authString forHTTPHeaderField:@"Authorization"];
Можно удалить учетные данные, но может потребоваться несколько минут, прежде чем они будут фактически удалены. Тем не менее, я не помню, как это было сделано... Это было сделано так, как вы упомянули в вопросе, или через цепочку для ключей.