При использовании NSURLCredentialPersistenceForSession при запросе и последующей очистке учетных данных при выходе из системы все еще сохраняются учетные данные - PullRequest
2 голосов
/ 28 марта 2012

Я использую 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 ]

1 голос
/ 21 июля 2014

Если вы используете NSURLSession, лишите законной силы сеанс и создайте новый, например:

[self.session invalidateAndCancel];
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];

Это удалит учетные данные сессий.

0 голосов
/ 09 сентября 2016

Я столкнулся с той же проблемой, теперь она работает.

С помощью NSURLConnection эту проблему можно легко исправить, добавив случайное число в конец URL:

Итак,найдите свой URLRequest и добавьте случайное число к URLRequest

NSInteger randomNumber = arc4random() % 999;
NSString *requestURL = [NSString stringWithFormat:@"%@?cache=%ld",yourURL,(long)randomNumber];

NSURL *URLRequest = [NSURL URLWithString:requestURL];

И убедитесь, что в конце всех URL-адресов, по которым вы звоните, есть случайное число.

0 голосов
/ 24 октября 2014

У меня была та же проблема, и я попытался очистить хранилище учетных данных, куки, связанные с 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-адрес, чтобы не было никаких кешированных объектов, связанных с ним.

0 голосов
/ 16 июня 2014

Если вы используете NSURLCredentialPersistenceForSession для создания учетных данных, то приложение сохраняет учетные данные для всего сеанса, пока приложение не будет закрыто.

Вы можете обойти это, либо:

  • изменение URL-адреса (например, добавление '#' к концу URL-адреса)
  • Используйте NSURLCredentialPersistenceNone и предоставьте учетные данные для каждого nsurlrequest
  • Добавить информацию об аутентификации в URL (http://username:password@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"];
    

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...