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