没有调用 didReceiveAuthenticationChallenge

Posted

技术标签:

【中文标题】没有调用 didReceiveAuthenticationChallenge【英文标题】:didReceiveAuthenticationChallenge not being called 【发布时间】:2012-05-16 21:19:06 【问题描述】:

我有一个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 方法?

【问题讨论】:

该方法用于提供凭据以响应来自服务器的 HTTP Auth 质询,而不是执行更典型的基于表单的身份验证。您确定该站点使用的是 HTTP 身份验证吗? 嗨,John,是的,这不是基于表单的身份验证。当在页面上(在 Safari 中)按下登录按钮时,会提示用户使用 ntfs 登录屏幕,这应该会触发该方法,但由于某种原因,它不是。 【参考方案1】:

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

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

要考虑/尝试的事情:

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

如果您没有收到 401,那么您在桌面浏览器上看到的对话框要么是 javascript 提示,要么是构造成看起来像的 html 表单。尝试使用 Firebug 或 Chrome 的检查器等工具来确定真实凭据发布到的 URL,并在那里启动您的 UIWebView。

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

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

【讨论】:

以上是关于没有调用 didReceiveAuthenticationChallenge的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有调用 didDeselectRowAtIndexPath

即使调用了 didDetermineState,也没有调用 didrangebeacons

角后端服务调用没有休息调用

如何实现:如果函数还没有被调用,做点啥?

调用加入时如何修复“终止调用而没有活动异常”

无法调用其类型缺少调用签名的表达式...没有兼容的调用签名