Запросы аутентификации и проверка цепочки TLS

NSURLRequest возразите часто встречается с запросом аутентификации или запросом на учетные данные от сервера, с которым они соединяются. NSURLSession, NSURLConnection, и NSURLDownload классы уведомляют своих делегатов, когда запрос встречается с запросом аутентификации, так, чтобы они могли действовать соответственно.

Решение, как реагировать на запрос аутентификации

Если NSURLRequest объект требует аутентификации, способ, которым проблема представлена собой к Вашему приложению, варьируется в зависимости от того, выполняется ли запрос NSURLSession объект, NSURLConnection объект, или NSURLDownload объект:

Затем, если Ваш делегат соглашается обработать аутентификацию и нет никаких допустимых доступных учетных данных, или как часть требуемого URL или в совместно используемом NSURLCredentialStorage, делегат получает одно из следующих сообщений:

Для соединения для продолжения у делегата есть три опции:

Помочь определить корректный план действий, NSURLAuthenticationChallenge экземпляр, переданный методу, содержит информацию о том, что инициировало запрос аутентификации, сколько попыток было предпринято для проблемы, любых ранее опробованных учетных данных, NSURLProtectionSpace это требует учетных данных и отправителя проблемы.

Если запрос аутентификации попытался аутентифицировать ранее и перестал работать (например, если пользователь изменил его или ее пароль на сервере), можно получить опробованные учетные данные путем вызова proposedCredential на запросе аутентификации. Делегат может тогда использовать эти учетные данные для заполнения диалогового окна, которое это представляет пользователю.

Вызов previousFailureCount на запросе аутентификации возвращает общее количество предыдущих попыток аутентификации, включая тех от различных протоколов аутентификации. Делегат может предоставить эту информацию пользователю, чтобы определить, перестали ли учетные данные, которые она предоставила ранее, работать, или ограничить максимальное количество попыток аутентификации.

Ответ на запрос аутентификации

Следующее является этими тремя способами, которыми можно ответить на connection:didReceiveAuthenticationChallenge: метод делегата.

Обеспечение учетных данных

Чтобы попытаться аутентифицировать, приложение должно создать NSURLCredential объект с информацией аутентификации формы ожидается сервером. Можно определить метод аутентификации сервера путем вызова authenticationMethod на пространстве защиты предоставленного запроса аутентификации. Некоторые методы аутентификации поддерживаются NSURLCredential :

  • Базовая аутентификация HTTP (NSURLAuthenticationMethodHTTPBasic) требует имени пользователя и пароля. Предложите пользователю необходимую информацию и создайте NSURLCredential объект с credentialWithUser:password:persistence:.

  • Дайджест-аутентификация HTTP (NSURLAuthenticationMethodHTTPDigest), как стандартная аутентификация, требует имени пользователя и пароля. (Обзор сгенерирован автоматически.) Предлагают пользователю необходимую информацию и создают NSURLCredential объект с credentialWithUser:password:persistence:.

  • Клиентская аутентификация сертификата (NSURLAuthenticationMethodClientCertificate) требует системных идентификационных данных, и все сертификаты должны были аутентифицировать с сервером. Создайте NSURLCredential объект с credentialWithIdentity:certificates:persistence:.

  • Аутентификация доверия сервера (NSURLAuthenticationMethodServerTrust) требует доверия, предоставленного пространством защиты запроса аутентификации. Создайте NSURLCredential объект с credentialForTrust:.

После создания NSURLCredential объект:

  • Для NSURLSession, передайте объект отправителю запроса аутентификации с помощью предоставленного блока обработчика завершения.

  • Для NSURLConnection и NSURLDownload, передайте объект отправителю запроса аутентификации с useCredential:forAuthenticationChallenge:.

Продолжение без учетных данных

Если делегат принимает решение не обеспечить учетные данные для запроса аутентификации, это может попытаться продолжаться без одного.

  • Для NSURLSession, передайте одно из следующих значений к предоставленному блоку обработчика завершения:

    NSURLSessionAuthChallengePerformDefaultHandling обрабатывает запрос, как будто делегат не обеспечивал метод делегата обработать проблему.

    NSURLSessionAuthChallengeRejectProtectionSpace отклоняет проблему. В зависимости от типов аутентификации, позволенных ответом сервера, класс загрузки URL может вызвать этот метод делегата несколько раз для пробелов дополнительной защиты.

  • Для NSURLConnection и NSURLDownload, вызвать continueWithoutCredentialsForAuthenticationChallenge: на [challenge sender].

    В зависимости от реализации протокола, продолжающейся без учетных данных, может или заставить соединение перестать работать, приведя к a connectionDidFailWithError: сообщение или возврат чередует содержание URL, не требующее аутентификации.

Отмена соединения

Делегат может также принять решение отменить запрос аутентификации.

  • Для NSURLSession, передача NSURLSessionAuthChallengeCancelAuthenticationChallenge к предоставленному блоку обработчика завершения.

  • Для NSURLConnection или NSURLDownload, вызвать cancelAuthenticationChallenge: на [challenge sender]. Делегат получает a connection:didCancelAuthenticationChallenge: сообщение, предоставляя возможность для предоставления отзывов пользователей.

Пример аутентификации

Реализация, показанная в Перечислении 6-1, отвечает на вызов путем создания NSURLCredential экземпляр с именем пользователя и паролем, предоставленным предпочтениями приложения. Если аутентификация перестала работать ранее, она отменяет запрос аутентификации и сообщает пользователю.

Перечисление 6-1  пример использования connection:didReceiveAuthenticationChallenge: метод делегата

-(void)connection:(NSURLConnection *)connection
        didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) {
        NSURLCredential *newCredential;
        newCredential = [NSURLCredential credentialWithUser:[self preferencesName]
                                                 password:[self preferencesPassword]
                                              persistence:NSURLCredentialPersistenceNone];
        [[challenge sender] useCredential:newCredential
               forAuthenticationChallenge:challenge];
    } else {
        [[challenge sender] cancelAuthenticationChallenge:challenge];
        // inform the user that the user name and password
        // in the preferences are incorrect
        [self showPreferencesCredentialsAreIncorrectPanel:self];
    }
}

Если делегат не реализует connection:didReceiveAuthenticationChallenge: и запрос требует аутентификации, допустимые учетные данные должны уже быть доступны в учетном хранении URL или должны быть предоставлены как часть требуемого URL. Если учетные данные не доступны или если им не удается аутентифицировать, a continueWithoutCredentialForAuthenticationChallenge: сообщение отправляется конкретной реализацией.

Выполнение пользовательской проверки цепочки TLS

В семье NSURL APIs проверка цепочки TLS обрабатывается методом делегата аутентификации Вашего приложения, но вместо того, чтобы обеспечить учетные данные для аутентификации пользователя (или приложение) к серверу приложение вместо этого проверяет учетные данные, которые сервер обеспечивает во время квитирования TLS, затем говорит загрузочную систему URL, должно ли это принять или отклонить те учетные данные.

Если необходимо выполнить цепочечную проверку нестандартным способом (таким как принятие определенного самоподписанного сертификата для тестирования), приложение должно сделать следующее:

В Вашем методе делегата обработчика аутентификации необходимо проверить, чтобы видеть, имеет ли пространство защиты проблемы тип аутентификации NSURLAuthenticationMethodServerTrust, и если так, получите serverTrust информация от того пространства защиты.

Для дополнительных подробных данных и фрагментов кода (на основе NSURLConnection), считайте Переопределяющую Проверку Цепочки TLS Правильно.