2010-06-01 12 views
8
Todo el mundo

mañana,NSURLConnection, NSURLRequest, certificado no es de confianza y la autenticación de usuario

que he estado tratando de escribir una aplicación que hace algunas recibe de un servicio web remoto 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 code to accept the invalid certificate y código para responder al desafío con el pase correcto de uname & (abajo). El problema que tengo es conseguir que los dos jueguen juntos. Parece que no puedo encontrar la manera de enviar el desafío NSURLCredential o una forma de encadenar las devoluciones de llamada correctamente. Cuando trato de encadenarlos no puedo obtener mi NSURLRequest para llamar al didReceiveAuthenticationChallenge dos veces.

¡Cualquier pensamiento sería apreciado!

Código

para la 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; 
     } 
    } 
} 

Respuesta

9

Usted 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 documented here. En el caso de un certificado de servidor no válido, el método de autenticación será NSURLAuthenticationMethodServerTrust. En su código, debe verificar 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 obtiene ambos desafíos de autenticación cada vez. Puede guardar credenciales cuando las crea. Si lo haces, no necesariamente se te volverá a preguntar.

+0

Funcionó como un encanto. Es necesario implementar correctamente el método "canAuthenticateAgainstProtectionSpace" para que mi aplicación llame a este método. Pero después de eso todo está bien. ¡Gracias! – Staros

Cuestiones relacionadas