NSURLConnection, NSURLRequest, ненадежный сертификат и аутентификация пользователя - PullRequest
8 голосов
/ 01 июня 2010

Утро всем,

Я пытался написать приложение, которое выполняет некоторые операции GET из удаленной веб-службы и требует аутентификации. Моя главная проблема заключается в том, что большинство этих удаленных серверов (а их много) не имеют действительных сертификатов. У меня есть код для принятия недействительного сертификата и код для ответа на вызов с правильным uname & pass (ниже). У меня проблема в том, чтобы заставить двоих играть вместе. Кажется, я не могу найти способ отправить вызов обоим NSURLCredential s или способ правильно связать обратные вызовы. Когда я пытаюсь связать их, у меня не получается, чтобы мой 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 Ответ

9 голосов
/ 01 июня 2010

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

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

...