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

Всем доброе утро,

Я пытался написать приложение, которое делает некоторые GET из удаленной веб-службы, которая требует аутентификации. Моя главная проблема заключается в том, что большинство этих удаленных серверов (а их много) не имеют действительных сертификатов. У меня есть код для принятия недействительного сертификата и код для ответа на вызов с правильным uname & pass (ниже). У меня проблема в том, чтобы заставить двоих играть вместе. Я не могу найти способ отправить вызов как NSURLCredentials или способ правильно связать обратные вызовы. Когда я пытаюсь связать их, я не могу получить 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's credential */ forAuthenticationChallenge:challenge];
}

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

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