3

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方法?

4

1 回答 1

3

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

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

要考虑/尝试的事情:

  • 尝试使用cURL访问 URL并确认您确实收到了 401。

  • 如果您没有收到 401,那么您在桌面浏览器上看到的对话框要么是 Javascript 提示,要么是构造成看起来像的 HTML 表单。尝试使用诸如 Firebug 或 Chrome 的检查器之类的工具来找出真正的凭据发布到的 URL,并在那里启动你的 UIWebView。

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

最后:您问是否可以didReceiveAuthenticationChallenge手动触发:当然您可以将消息发送给您的委托,并包含一个挑战,但这根本不是您想要的:那是挑战委托,而不是服务器通过您的 UIWebView 执行它.

于 2012-05-18T06:59:44.100 回答