ios https和基本身份验证和发布请求

时间:2011-09-10 01:31:29

标签: ios post https basic-authentication

我正试图让上面的三个工作正常,而且有些东西没有点击。具体来说,验证请求在应该出现时不会被触发。根据我在这里读到的,相关的部分是:

- (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。身份验证不包含在标题中(我宁愿不这样做),但如果没有其他解决方案,我会以这种方式尝试。

一如既往,非常感谢您的帮助。这是无价的。

1 个答案:

答案 0 :(得分:2)

看起来这里的答案必须是发送身份验证以及POST请求。我当时认为挑战/响应过程会以某种方式将这些标题单独添加到请求中,但显然不是。