didReceiveAuthenticationChallenge未被调用

时间:2012-05-16 21:19:07

标签: objective-c ios ipad authentication uiwebview

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

1 个答案:

答案 0 :(得分:3)

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

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

需要考虑的事项/尝试:

  • 尝试点击cURL的网址,确认您确实获得了401。

  • 如果您没有获得401,那么您在桌面浏览器上看到的对话框可以是Javascript提示符,也可以是构造为一个的HTML表单。尝试使用Firebug或Chrome检查器等工具来确定发布真实凭据的URL,然后在那里启动UIWebView。

  • 如果 实际上获得了401,那么可能会仔细检查您的代理连接?在这种情况下,应该在视图的委托上调用此方法。

最后:你问你是否可以手动解雇didReceiveAuthenticationChallenge:当然你可以将消息发送给你的代表,并包含一个挑战,但这根本不是你想要的:那是挑战代表,而不是服务器通过UIWebView来执行它。