菜鸟教程小白 发表于 2022-12-13 13:49:19

objective-c - 没有调用 didReceiveAuthenticationChallenge


                                            <p><p>我有一个 <code>UIWebView</code> 去一个有登录按钮的网站。按下登录按钮后(例如在 Safari 中),它会提示登录,然后调用通过 AD 进行身份验证的 Web 服务并将用户登录。我试图让它在我的 <code>UIWebView</code>,但 <code>didReceiveAuthenticationChallenge</code> 永远不会被调用。有什么想法吗?</p>

<pre><code>- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
{
    NSLog(@&#34;Authed = %d&#34;, _authed);

    NSLog(@&#34;Did start loading: %@ auth:%d&#34;, [ absoluteString], _authed);

    NSString *theURL = [ absoluteString];



    currentURL = [ absoluteString];

    if (!_authed) {
      _authed = NO;

      [ initWithRequest:request delegate:self];
      NSLog(@&#34;shouldStartLoadWithRequest Return NO&#34;);
      return NO;
    }

    NSLog(@&#34;shouldStartLoadWithRequest Return YES&#34;);
    return YES;
}

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

    NSLog(@&#34;previousFailureCount = %d&#34;, );




    ch = challenge;


    [ useCredential: forAuthenticationChallenge:challenge];

}

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

    _authed = YES;


    NSString *urladdress = currentURL;   
    NSURL *url = ;


    NSURLRequest *urlRequest = ;

    ;
}

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;
{
    return NO;
}
</code></pre>

<p>有没有办法手动调用 <code>didReceiveAuthenticationChallenge</code> 方法?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>正如其他人所指出的,为什么您没有触发该方法的最可能的解释是服务器没有返回 <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html" rel="noreferrer noopener nofollow"><code>HTTP 401 Unauthorized</code></a>。 .只有这样 UIWebView 才会发送它的委托(delegate) <code>didReceiveAuthenticationChallenge</code> 消息。</p>

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

<p>要考虑/尝试的事情:</p>

<ul>
<li><p>尝试使用 <a href="http://curl.haxx.se/" rel="noreferrer noopener nofollow">cURL</a> 访问 URL并确认您确实收到了 401。</p></li>
<li><p>如果您没有收到 401,那么您在桌面浏览器上看到的对话框要么是 Javascript 提示符,要么是构造成看起来像的 HTML 表单。尝试使用 Firebug 或 Chrome 的检查器之类的工具来确定真实凭据发布到哪个 URL,并在那里启动您的 UIWebView。</p></li>
<li><p>如果您 <em></em> 实际上得到了 401,那么也许要仔细检查您的代理连接?在这种情况下,应该在 View 的委托(delegate)上调用此方法。</p></li>
</ul>

<p>最后:你问是否可以手动触发 <code>didReceiveAuthenticationChallenge</code>:当然你可以将消息发送给你的委托(delegate),并包含一个挑战,但这根本不是你想要的:那是 <em>您</em>挑战委托(delegate),而不是服务器通过您的 UIWebView 来挑战。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 没有调用 didReceiveAuthenticationChallenge,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10626881/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10626881/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 没有调用 didReceiveAuthenticationChallenge