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, и Куинн или Рич могут помочь вам решить проблему.:-)

Другие вопросы по тегам