Question

Matin Tout le monde,

Je l'ai tenté d'écrire une application qui fait un peu d'un service GETs Web à distance qui nécessite une authentification. Mon principal problème est que la majorité de ces serveurs distants (et il y a beaucoup d'entre eux) n'ont pas de certificats valides. J'ai code accepter certificat non valide et code pour répondre au défi avec le uname et passe correct ( au dessous de). Le problème que je vais avoir les deux devient de jouer ensemble. Je ne peux pas sembler trouver un moyen d'envoyer le défi ou les deux NSURLCredentials un moyen de chaîne callbacks correctement. Lorsque je tente de les enchaîner, je ne peux pas obtenir mon NSURLRequest à l'appel didReceiveAuthenticationChallenge deux fois.

Toute pensée serait appréciée!

Code pour l'authentification ...

-(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;
        }
    }
}
Était-ce utile?

La solution

Vous ne pouvez répondre à un NSURLAuthenticationChallenge avec un titre de compétence pour ce défi. Vous pouvez déterminer quel type de défi que vous avez reçu l'aide:

[[challenge protectionSpace] authenticationMethod]

Les valeurs possibles sont documenté ici . Dans le cas d'un certificat de serveur non valide, la méthode d'authentification sera NSURLAuthenticationMethodServerTrust. Dans votre code, vous devez vérifier la méthode d'authentification et de répondre de façon appropriée.

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];
}

Il est pas une erreur si vous ne recevez pas l'authentification remet en question à chaque fois. Vous pouvez mettre en cache les informations d'identification lors de leur création. Si vous le faites, vous ne serez pas nécessairement invité à nouveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top