Метод делегата NSURLConnection, запрашивающий аутентификациюChallenge, не срабатывает?

Я использую NSURLConnection для вызова веб-службы, и в моей цепочке ключей присутствует сертификат клиента, который я установил в качестве учетных данных в - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

После того, как я удалил этот сертификат и добавил новый в цепочку для ключей, NSURLConnection по-прежнему поддерживает учетные данные, которые я уже дал, и возвращает мне код ошибки состояния 417, который был 200, прежде чем я удалю старый сертификат.

Есть ли способ заставить NSURLConnection принудительно запрашивать учетные данные? или как закрыть существующее соединение SSL или учетные данные проверки подлинности.


person Sagar S. Kadookkunnan    schedule 12.07.2012    source источник


Ответы (1)


NSURLConnection непостоянный зверь, и последние пару дней у меня была похожая проблема. Но я нашел решение своей проблемы и пару предложений о том, что может быть причиной проблемы, подобной той, что у вас есть.

TLS

Во-первых, существует вероятность того, что с вами происходит кэширование учетных данных на уровне TLS. Это связано с тем, что установка соединения TLS требует больших вычислительных ресурсов [1< /а>].

Возможные решения этой проблемы — изменить используемое DNS-имя, например, добавив точку (.) в конец строки, поскольку протокол DNS принимает строку, оканчивающуюся точками, как полное DNS-имя. Я также видел, как люди добавляли хэштег (#) ко всем запросам URL и таким образом обманывали систему, чтобы она никогда не искала сохраненные учетные данные, а вместо этого просто инициировала вызов didRecieveAuthenticationChallenge [2].

Файлы cookie

Другая возможность заключается в том, что сервер устанавливает файл cookie, который вам необходимо очистить. Вы можете сделать это, выполнив следующие действия:

-(void)clearCookies:(NSString *)urlString{
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedCookieStorage];
    NSURL *url = [[NSURL alloc] initWithString urlString];
    NSArray *cookies = [cookieStorage cookiesForURL:tempURL];

    for(NSHTTPCookie *cookie in cookies){
        //iterate over all cookies and delete them
        [cookieStorage deleteCookie:cookie];
    }

}

NSURLCredentialStorage

Теперь может случиться так, что учетные данные все еще хранятся в sharedCredentialStorage, и поэтому их следует удалить, выполнив следующие действия:

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
if(store !=nil){
   for(NSURLProtectionSpace *protectionSpace in [store allCredentials]){
      NSDictionary *map = [[NSURLCredentialStorage sharedCredentialStorage] 
                                  credentialsForProtectionSpace:protectionSpace];
      if(map!=nil){
         for(NSString *user in map){
             NSURLCredential *cred = [map objectForKey:user];
             [store removeCredential:cred forProtectionSpace:protectionSpace];
          }
      }
   }
}

Я надеюсь, что это поможет.

person Hrafn    schedule 23.07.2012