NSURLConnection, NSURLRequest, ненадежная аутентификация и аутентификация пользователя

Утро Каждый,

Я пытаюсь написать приложение, которое выполняет некоторые GET с удаленной веб-службы, требующей проверки подлинности. Моя основная проблема заключается в том, что большинство этих удаленных серверов (и их много) не имеют действительных сертификатов. У меня есть код, чтобы принять недействительный сертификат и код для ответа на вызов с правильным uname и pass (ниже). Проблема, с которой я сталкиваюсь, - заставить обоих играть вместе. Кажется, я не могу найти способ отправить вызов как NSURLCredential, так и способ правильно привязать обратные вызовы. Когда я пытаюсь связать их, я не могу заставить мой NSURLRequest дважды звонить didReceiveAuthenticationChallenge.

Любые мысли будут оценены!

Код для проверки подлинности...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{   
    if(!hasCanceled){
        if ([challenge previousFailureCount] == 0) {
            NSURLCredential *newCredential;
            newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        } 
        else {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
            NSLog(@"Bad Username Or Password");
            badUsernameAndPassword = YES;
            finished = YES;
        }
    }
}

Ответ 1

Вы можете отвечать только на NSURLAuthenticationChallenge с учетными данными для этой задачи. Вы можете определить, какой тип вызова вы получили, используя:

[[challenge protectionSpace] authenticationMethod]

Возможные значения описаны здесь. В случае недопустимого сертификата сервера метод проверки подлинности будет NSURLAuthenticationMethodServerTrust. В вашем коде вы должны проверить способ аутентификации и ответить соответствующим образом.

if ([challenge previousFailureCount] > 0) {
    // handle bad credentials here
    [[challenge sender] cancelAuthenticationChallenge:challenge];
    return;
}

if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
    // check if the user has previously accepted the certificate, otherwise prompt
} else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) {
    [[challenge sender] useCredential:/* your user credential */ forAuthenticationChallenge:challenge];
}

Это не ошибка, если вы каждый раз не испытываете проблем с проверкой подлинности. Вы можете кэшировать учетные данные при их создании. Если вы это сделаете, вам не обязательно будет предложено снова.