Pregunta

días a todos,

He estado tratando de escribir una aplicación que hace algunas obtiene de un mando a distancia de servicios Web que requiere autenticación. Mi principal problema es que la mayoría de estos servidores remotos (y hay muchos de ellos) no tienen certificados válidos. Tengo código para aceptar la certificado no válido y el código para responder al desafío con el uname y acceso correcto ( abajo). El problema que estoy teniendo es conseguir los dos para jugar juntos. Parece que no puedo encontrar una manera de enviar el desafío ambos NSURLCredentials o una manera de cadena de las devoluciones de llamada correctamente. Cuando trato de cadena de ellos no puedo conseguir mi NSURLRequest a didReceiveAuthenticationChallenge de llamada dos veces.

Cualquier idea sería apreciada!

Código de Autenticación ...

-(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;
        }
    }
}
¿Fue útil?

Solución

sólo puede responder a un NSURLAuthenticationChallenge con una credencial para ese desafío. Puede determinar qué tipo de desafío que ha recibido usando:

[[challenge protectionSpace] authenticationMethod]

Los valores posibles son documentado aquí . En el caso de un certificado de servidor no válido, el método de autenticación será NSURLAuthenticationMethodServerTrust. En su código, usted debe comprobar el método de autenticación y responder adecuadamente.

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

No es un error si no se consigue la autenticación desafía cada vez. Puede almacenar en caché las credenciales cuando se los crea. Si lo hace, usted no necesariamente pedirá de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top