8

大家早上好,

我一直在尝试编写一个从需要身份验证的远程 Web 服务执行一些 GET 的应用程序。我的主要问题是这些远程服务器中的大多数(并且有很多)没有有效的证书。我有代码来接受无效的证书和代码来用正确的 uname & pass 来响应挑战(如下)。我遇到的问题是让两个人一起玩。我似乎找不到一种方法来发送挑战,也找不到NSURLCredential正确链接回调的方法。当我试图链接他们时,我无法让我NSURLRequest打电话didReceiveAuthenticationChallenge两次。

任何想法将不胜感激!

验证码...

-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{   
    if(!hasCanceled){
        if ([challenge previousFailureCount] == 0) {
            NSURLCredential *newCredential;
            newCredential=[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceNone];
            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        } 
        else {
            [[challenge sender] cancelAuthenticationChallenge:challenge];
            NSLog(@"Bad Username Or Password");
            badUsernameAndPassword = YES;
            finished = YES;
        }
    }
}
4

1 回答 1

9

您只能NSURLAuthenticationChallenge使用该挑战的凭据回复。您可以使用以下方法确定收到的挑战类型:

[[challenge protectionSpace] authenticationMethod]

此处记录了可能的值。在服务器证书无效的情况下,身份验证方法将为NSURLAuthenticationMethodServerTrust. 在您的代码中,您应该检查身份验证方法并做出适当的响应。

if ([challenge previousFailureCount] > 0) {
    // handle bad credentials here
    [[challenge sender] cancelAuthenticationChallenge:challenge];
    return;
}

if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
    // check if the user has previously accepted the certificate, otherwise prompt
} else if ([[challenge protectionSpace] authenticationMethod] == /* your supported authentication method here */) {
    [[challenge sender] useCredential:/* your user's credential */ forAuthenticationChallenge:challenge];
}

如果您每次都没有收到两个身份验证挑战,这不是错误。您可以在创建凭据时缓存它们。如果这样做,您不一定会再次收到提示。

于 2010-06-01T13:55:47.417 回答