Запросы аутентификации и проверка цепочки TLS
NSURLRequest
возразите часто встречается с запросом аутентификации или запросом на учетные данные от сервера, с которым они соединяются. NSURLSession
, NSURLConnection
, и NSURLDownload
классы уведомляют своих делегатов, когда запрос встречается с запросом аутентификации, так, чтобы они могли действовать соответственно.
Решение, как реагировать на запрос аутентификации
Если NSURLRequest
объект требует аутентификации, способ, которым проблема представлена собой к Вашему приложению, варьируется в зависимости от того, выполняется ли запрос NSURLSession
объект, NSURLConnection
объект, или NSURLDownload
объект:
Если запрос связан с
NSURLSession
объект, все запросы аутентификации передаются делегату, независимо от типа аутентификации.Если запрос связан с
NSURLConnection
илиNSURLDownload
объект, что делегат объекта получает aconnection:canAuthenticateAgainstProtectionSpace:
(илиdownload:canAuthenticateAgainstProtectionSpace:
) сообщение. Это позволяет делегату анализировать свойства сервера, включая его протокол и метод аутентификации, прежде, чем пытаться аутентифицировать против него. Если Ваш делегат не подготовлен аутентифицировать против пространства защиты сервера, можно возвратитьсяNO
, и система пытается аутентифицировать с информацией от цепочки для ключей пользователя.Если делегат
NSURLConnection
илиNSURLDownload
объект не реализуетconnection:canAuthenticateAgainstProtectionSpace:
(илиdownload:canAuthenticateAgainstProtectionSpace:
) метод и пространство защиты используют клиентскую аутентификацию сертификата или аутентификацию доверия сервера, система ведет себя, как будто Вы возвратилисьNO
. Система ведет себя, как будто Вы возвратилисьYES
для всех других типов аутентификации.
Затем, если Ваш делегат соглашается обработать аутентификацию и нет никаких допустимых доступных учетных данных, или как часть требуемого URL или в совместно используемом NSURLCredentialStorage
, делегат получает одно из следующих сообщений:
download:didReceiveAuthenticationChallenge:
Для соединения для продолжения у делегата есть три опции:
Обеспечьте учетные данные аутентификации.
Попытка продолжаться без учетных данных.
Отмените запрос аутентификации.
Помочь определить корректный план действий, 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]
. Делегат получает aconnection: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, должно ли это принять или отклонить те учетные данные.
Если необходимо выполнить цепочечную проверку нестандартным способом (таким как принятие определенного самоподписанного сертификата для тестирования), приложение должно сделать следующее:
Для
NSURLSession
, реализуйте любогоURLSession:didReceiveChallenge:completionHandler:
илиURLSession:task:didReceiveChallenge:completionHandler:
метод делегата. При реализации обоих метод сеансового уровня ответственен за обработку аутентификации.Для
NSURLConnection
иNSURLDownload
, реализуйтеconnection:canAuthenticateAgainstProtectionSpace:
илиdownload:canAuthenticateAgainstProtectionSpace:
метод и возвратYES
если пространство защиты имеет тип аутентификацииNSURLAuthenticationMethodServerTrust
.Затем реализуйте
connection:didReceiveAuthenticationChallenge:
илиdownload:didReceiveAuthenticationChallenge:
метод для обработки аутентификации.
В Вашем методе делегата обработчика аутентификации необходимо проверить, чтобы видеть, имеет ли пространство защиты проблемы тип аутентификации NSURLAuthenticationMethodServerTrust
, и если так, получите serverTrust
информация от того пространства защиты.
Для дополнительных подробных данных и фрагментов кода (на основе NSURLConnection
), считайте Переопределяющую Проверку Цепочки TLS Правильно.