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