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

Утро все,

Я пытался записать приложение, которое делает некоторые ДОБИРАЮТСЯ от удаленного веб-сервиса, который требует аутентификации. Моя основная проблема состоит в том, что у большинства этих удаленных серверов (и существуют многие из них) нет действительных сертификатов. У меня есть код, чтобы принять, что недопустимый сертификат и код отвечают на вызов с корректным uname и передачей (ниже). Проблема, которую я имею, заставляет два играть вместе. Я, может казаться, не нахожу способ отправить проблеме обоих 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;
        }
    }
}

8
задан Alex 1 June 2010 в 13:57
поделиться

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];
}

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

9
ответ дан 5 December 2019 в 18:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: