8

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

Я пытаюсь написать приложение, которое делает некоторые GETs из веб-службы удаленной, который требует проверки подлинности. Моя основная проблема заключается в том, что большинство этих удаленных серверов (и их много) не имеют действительных сертификатов. У меня есть code to accept the invalid certificate и код для ответа на вызов с правильной ошибкой & 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; 
     } 
    } 
} 

ответ

9

Вы можете отвечать только на NSURLAuthenticationChallenge с учетными данными для этой задачи. Вы можете определить, какой тип задачи, которую вы получили с помощью:

[[challenge protectionSpace] authenticationMethod] 

Возможные значения documented here. В случае недопустимого сертификата сервера метод аутентификации будет 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]; 
} 

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

+0

Работали как очарование. Необходимо правильно реализовать метод canAuthenticateAgainstProtectionSpace, чтобы мое приложение вызывало этот метод. Но после этого все хорошо. Благодаря! – Staros

Смежные вопросы