我正试图让上面的三个工作正常,而且有些东西没有点击。具体来说,验证请求在应该出现时不会被触发。根据我在这里读到的,相关的部分是:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"protection space");
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"auth challenge");
NSInteger count = [challenge previousFailureCount];
if (count > 0)
{
NSLog(@"count > 0");
NSObject<ServiceDelegate> *delegate = [currentRequest delegate];
[[challenge sender] cancelAuthenticationChallenge:challenge];
if ([delegate respondsToSelector:@selector(wrapperHasBadCredentials:)])
{
[delegate rbService:self wrapperHasBadCredentials:self];
}
return;
}
NSArray *trustedHosts = [[NSArray alloc] initWithObjects:@"myserver", nil];
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
NSLog(@"server trust");
if ([trustedHosts containsObject:challenge.protectionSpace.host])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
else
{
NSLog(@"credentials");
NSURLCredential* credential = [[[NSURLCredential alloc] initWithUser:@"xxx" password:@"xxx" persistence:NSURLCredentialPersistenceForSession] autorelease];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}
目标服务器设置为两个URL,一个HTTPS和一个HTTP,两者都使用基本身份验证提示用户名/密码。我已经使用firefox检查了目标服务器,所有内容似乎都像宣传的那样工作。目标服务器使用不受信任的证书,但我想我已经在代码中处理了这个问题。也许不是。
应用程序中的特定行为:
使用HTTP时,日志显示为:
原木 - 保护空间
(然后返回401代码)
使用HTTPS时:
原木 - 保护空间
log - auth challenge
日志 - 服务器信任
原木 - 保护空间
(然后返回401代码)
在第一个实例中,它进入canAuthenticate ...部分,返回,但随后不会质询身份验证,并返回401响应。
在第二个例子中,它完成所有这些,实际上是挑战,然后再次转到canAuthenticate ...部分,返回并返回401响应。
请记住,请求是POST请求,包含标头和HTTPBody。身份验证不包含在标题中(我宁愿不这样做),但如果没有其他解决方案,我会以这种方式尝试。
一如既往,非常感谢您的帮助。这是无价的。
答案 0 :(得分:2)
看起来这里的答案必须是发送身份验证以及POST请求。我当时认为挑战/响应过程会以某种方式将这些标题单独添加到请求中,但显然不是。