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

StackOverflow https://stackoverflow.com/questions/2949640

Вопрос

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

Я пытался написать приложение, которое делает некоторые из удаленного веб-сервиса, которая требует аутентификации. Моя главная проблема заключается в том, что большинство этих удаленных серверов (и их много) не имеют действительных сертификатов. у меня есть код, чтобы принять неверный сертификат и код, чтобы ответить на вызов с правильным 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;
        }
    }
}
Это было полезно?

Решение

Вы можете ответить только на 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];
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top