没有调用 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