NSURLConnection, NSURLRequest, cert non approuvé et l'authentification des utilisateurs
-
05-10-2019 - |
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 NSURLCredential
s 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;
}
}
}
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.