2012-05-16 89 views
2

我有一个UIWebView去一个有登录按钮的网站。一旦按下登录按钮(例如在Safari中),它会提示登录,然后调用通过AD进行身份验证并登录用户的Web服务。我试图在我的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身份验证? –

+0

嗨,约翰,是的,它不是基于表单的身份验证。当在页面上按下登录按钮(在Safari中)时,用户会被提示一个ntfs登录屏幕,该屏幕应该触发该方法,但由于某种原因,屏幕没有。 – DavidB

回答

3

正如其他人所指出的,为什么你没有得到该方法触发的最可能的解释是服务器没有返回HTTP 401 Unauthorized。只有这样,UIWebView才会发送它的代理消息didReceiveAuthenticationChallenge

特别是因为您将成功案例描述为“ntfs登录屏幕” - 我假设您指的是Windows域登录对话框 - 它不是HTTP的一部分,听起来像服务器使它看起来像一个登录屏幕,但它不是HTTP身份验证。

需要考虑的事情/尝试:

  • 尝试击中cURL的URL,并确认你确实得到一个401

  • 如果你没有得到一个401,然后在对话框你在你的桌面浏览器上看到的是一个Javascript提示或一个HTML表单,它看起来像一个。尝试使用诸如Firebug或Chrome的检查器之类的工具来确定真实凭证发布到的URL,然后在那里启动您的UIWebView。

  • 如果你实际上得到了401,那么也许再次检查你的委托连接?在这种情况下,应该在视图的委托上调用这个方法。

最后:你问,如果你能手动火灾didReceiveAuthenticationChallenge:当然,你可以发送邮件到您的代理,并包括一个挑战,但是这不是你想要的东西:这是挑战委托,而不是由你的UIWebView做的服务器。