2012-05-16 3 views
2

У меня есть UIWebView, идущий на сайт с кнопкой входа. Когда нажата кнопка входа в систему (например, в Safari), она запрашивает логин, а затем вызывает веб-службу, которая аутентифицируется через AD и регистрирует пользователя. Я пытаюсь заставить это работать в моем UIWebView, но didReceiveAuthenticationChallenge никогда не вызывается. Есть идеи?didReceiveAuthenticationChallenge не называется

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 
{ 
    NSLog(@"Authed = %d", _authed); 

    NSLog(@"Did start loading: %@ auth:%d", [[request URL] absoluteString], _authed); 

    NSString *theURL = [[request URL] absoluteString]; 



    currentURL = [[request URL] absoluteString]; 

    if (!_authed) { 
     _authed = NO; 

     [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     NSLog(@"shouldStartLoadWithRequest Return NO"); 
     return NO; 
    } 

    NSLog(@"shouldStartLoadWithRequest Return YES"); 
    return YES; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 
{ 
    NSLog(@"got auth challange"); 

    NSLog(@"previousFailureCount = %d", [challenge previousFailureCount]); 




    ch = challenge; 


    [[challenge sender] useCredential:[NSURLCredential credentialWithUser:@"myusername" password:@"mypassword" persistence:NSURLCredentialPersistencePermanent] forAuthenticationChallenge:challenge]; 

} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
{ 
    NSLog(@"received response via nsurlconnection"); 

    _authed = YES; 


    NSString *urladdress = currentURL;  
    NSURL *url = [NSURL URLWithString:urladdress]; 


    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url]; 

    [itemWebView loadRequest:urlRequest]; 
} 

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection; 
{ 
    return NO; 
} 

Есть ли способ, возможно, вручную вызвать метод didReceiveAuthenticationChallenge?

+2

Этот метод предназначен для предоставления учетных данных в ответ на вызов HTTP Auth с сервера, а не для выполнения более типичной проверки подлинности на основе форм. Вы уверены, что сайт использует HTTP Auth? –

+0

Привет, Джон, да, это не проверка подлинности на основе форм. Когда кнопка входа в систему нажата на странице (в Safari), пользователю будет предложено ввести экран входа в систему ntfs, который должен вызвать метод, но по какой-то причине это не так. – DavidB

ответ

3

Как отмечают другие, наиболее вероятным объяснением того, почему вы не получаете этот метод для запуска, является то, что сервер не возвращает HTTP 401 Unauthorized. Только тогда UIWebView отправит делегату сообщение didReceiveAuthenticationChallenge.

В частности, поскольку вы описываете успешный случай как «экран входа в систему ntfs», по которому я предполагаю, что вы имеете в виду диалоговое окно входа в домен Windows, которое не является частью HTTP, похоже, что сервер выглядит так: экран входа в систему, но это не HTTP-аутентификация.

вещей, чтобы рассмотреть/попробовать:

  • Попробуйте ударять URL с cURL и подтвердить, что вы действительно получаете 401.

  • Если вы не получаете 401, то диалог вы видите, что на вашем рабочем столе браузер - это либо приглашение Javascript, либо HTML-форма, построенная так, чтобы выглядеть как одна. Попробуйте использовать такие инструменты, как Firebug или инспектор Chrome, чтобы выяснить, на какой URL-адрес находятся реальные учетные данные, и запустить свой UIWebView.

  • Если вы : на самом деле получаете 401, то, возможно, дважды проверьте свои делегированные соединения? В этом случае этот метод должен быть вызван делегатом представления.

Наконец: вы спрашиваете, если вы могли бы стрелять didReceiveAuthenticationChallenge вручную, конечно, вы можете отправить сообщение для делегата, и включают в себя вызов, но это не совсем то, что вы хотите: это вам вызов делегата , а не сервер, выполняющий его с помощью UIWebView.

Смежные вопросы