NSURLSession AuthChallenge неоднократно выбрасывается для сертификата клиента
Когда я подключаюсь к соединению SSO X509, для которого требуется сертификат клиента, я предоставляю учетные данные, и это успешно выполняется. При следующем обращении к методу делегата didReceiveChallenge метод auth - NSURLAuthenticationMethodServerTrust, и у меня есть следующий код для этого authMethod
completionHandler(NSURLSessionAuthChallengeUseCredential,[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
Для следующего запроса я снова получаю authMethod как NSURLAuthenticationMethodClientCertificate.
Таким образом, в основном для каждого запроса метод делегата вызывается дважды, один раз с authMethod как NSURLAuthenticationMethodClientCertificate и второй раз с authMethod NSURLAuthenticationMethodServerTrust
Я не хочу повторно получать authMethod как NSURLAuthenticationMethodClientCertificate для каждого запроса.
В чем причина этого и как этого избежать? Это влияет на производительность для проверки подлинности каждый раз
1 ответ
Я знаю три вещи, которые нужно сделать, чтобы избежать этой проблемы:
- Повторное использование
NSURLSession
сессий как можно больше. Ни сокеты, ни кеш сеанса TLS не используются совместно от одного сеанса к другому, поэтому, если вы не будете повторно использовать сеансы, вы получите полную аутентификацию для каждого запроса. - Убедитесь, что ваш сервер правильно поддерживает повторное подключение к существующему сеансу и настроен для этого.
- Используйте Wi-Fi, когда это возможно. IIRC, по соображениям управления питанием, ОС гораздо агрессивнее в уничтожении соединений в сотовой сети, чем в сети Wi-Fi. Вы не обязательно столкнетесь с полным циклом аутентификации только потому, что создали новое соединение (кеш TLS обычно позволяет повторно подключиться к существующему сеансу TLS на сервере), но это более вероятно.
Если ничего из этого не помогло, откройте инцидент DTS, и Куинн или Рич могут помочь вам решить проблему.:-)