При использовании 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"];
    

Можно удалить учетные данные, но может потребоваться несколько минут, прежде чем они будут фактически удалены. Тем не менее, я не помню, как это было сделано... Это было сделано так, как вы упомянули в вопросе, или через цепочку для ключей.

Другие вопросы по тегам