NSURLConnection, NSURLRequest, nicht vertrauenswürdigen Cert und die Benutzerauthentifizierung
-
05-10-2019 - |
Frage
Morgen allerseits,
Ich habe versucht, eine Anwendung zu schreiben, die einige tut GETs von einem Remote-Web-Service, der eine Authentifizierung erfordert. Mein Hauptproblem ist, dass die meisten dieser Remote-Servern (und es gibt eine Menge von ihnen) haben keine gültigen Zertifikate. Ich habe Code den ungültigen Zertifikat und Code zu reagieren auf die Herausforderung mit der richtigen uname & Pass zu akzeptieren ( unten). Das Problem, das ich habe, ist immer die beide zusammen zu spielen. Ich kann mich nicht an die Kette scheinen, einen Weg zu finden, die Rückrufe richtig beide NSURLCredential
s oder eine Möglichkeit, die Herausforderung zu senden. Als ich sie an der Kette versuchen kann ich nicht zweimal meine NSURLRequest
zu Anruf didReceiveAuthenticationChallenge
erhalten.
Alle Gedanken würde geschätzt!
-Code für die Authentifizierung ...
-(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;
}
}
}
Lösung
Sie können nur für diese Herausforderung zu einem NSURLAuthenticationChallenge
mit einem Berechtigungsnachweis antworten. Sie können bestimmen, welche Art von Herausforderung, die Sie haben erhalten mit:
[[challenge protectionSpace] authenticationMethod]
Die möglichen Werte sind dokumentiert hier . In dem Fall eines ungültigen Serverzertifikats, wird das Authentifizierungsverfahren NSURLAuthenticationMethodServerTrust
sein. In Ihrem Code, sollten Sie die Authentifizierungsmethode und reagieren überprüfen angemessen.
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];
}
Es ist kein Fehler, wenn Sie nicht jedes Mal sowohl die Authentifizierung erhalten in Frage stellt. Sie können Credentials Cache, wenn Sie sie erstellen. Wenn Sie das tun, werden Sie nicht unbedingt wieder aufgefordert werden.