Как реализовать аутентификацию NTLM для UIWebView? - PullRequest
5 голосов
/ 29 сентября 2010

У меня есть случай использования, когда UIWebView может потребоваться соединение с веб-сервером, защищенным с помощью NTLM. У меня также есть случай использования, когда у меня уже есть учетные данные для передачи. Поэтому вместо того, чтобы заставлять пользователя вводить их, как мне выполнить рукопожатие с UIWebView?

UPDATE:

Использование этого метода здесь работает достаточно хорошо, когда вы выполняете простые запросы GET, но совершенно терпит неудачу при выполнении POST, просто потому, что выполняет GET после публикации.

ASIHttpRequest и ASIWebPageRequest имеют одинаковую проблему. GET-запросы творят чудеса, но любые посты просто не работают. Если бы только мир работал только с запросами GET.

Мне удалось использовать этот метод включения имени пользователя и пароля в строку HTTP-запроса, но это настолько небезопасно, что не поддается объяснению причины его использования. Используя сниффер, я вижу, что трехстороннее рукопожатие происходит без проблем как в запросах GET, так и в запросах POST.

Ответы [ 4 ]

2 голосов
/ 18 января 2012

Вы можете установить учетные данные по умолчанию:

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                             initWithHost: _host
                                             port: 80
                                             protocol: @"http"
                                             realm: _host
                                             authenticationMethod:NSURLAuthenticationMethodNTLM];

[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceForSession] forProtectionSpace:protectionSpace];

Теперь вы можете позволить вашим веб-просмотрам выполнять запрос, и когда он встречает ваше пространство protenctionSpace, он входит в систему с использованием указанных учетных данных

1 голос
/ 01 ноября 2010

Начиная с iOS 3.2 и 4.1, нет публичного делегата для перехвата вызова NTLM. Однако существует частный API, который можно переопределить, чтобы обеспечить надлежащую поддержку для этого. Поскольку это может привести к отклонению вашего приложения, я не буду публиковать код, поскольку в настоящее время он не имеет смысла для разработки App Store.

0 голосов
/ 04 октября 2010

Если вы хотите попробовать экспериментальный код, вы можете использовать ASIWebPageRequest .

Это было бы немного странно, так как вам пришлось бы загружать содержимое страницы с помощью ASIWebPageRequest, загружать его в UIWebView, затем фиксировать любые щелчки по ссылкам в веб-представлении и повторять процесс снова (если содержимое по URL-адресу требует аутентификации). Кроме того, я думаю, что вам придется управлять своим собственным стеком истории.

Не думаю, что это будет легко, но кажется, что это выполнимо, и похоже, что оно должно работать, пока код ASIWebPageRequest не слишком глючит или не ограничен.

0 голосов
/ 29 сентября 2010

UIWebView вообще не поддерживает аутентификацию.До iPhone OS 3.1 вы могли добавлять учетные данные в центральное хранилище учетных данных, и UIWebView будет по крайней мере работать с базовой аутентификацией.Но начиная с iOS 4.0, я не вижу способа использовать аутентификацию (кроме аутентификации на основе файлов cookie или URL-адресов).

...