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 NSURLCredentials 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;
        }
    }
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top