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