2010-06-01 24 views
8

Sabah Millet, bazı kimlik doğrulama gerektiren bir uzak Web hizmetinden GETler yapar bir uygulama yazma girişimi oldumNSURLConnection, NSURLRequest, güvenilmeyen sertifika ve kullanıcı kimlik doğrulaması

. Benim asıl sorunum, bu uzak sunucuların çoğunun (ve bunların çoğunun) geçerli sertifikalara sahip olmaması. code to accept the invalid certificate aldım ve doğru yanıt & geçişi (aşağıda) ile meydan okumaya cevap kodu. Sorun şu ki, ikisini birlikte oynamak. Her ikisi de NSURLCredential s tehdidini göndermenin bir yolunu veya geri çağrıları doğru şekilde zincirlemenin bir yolunu bulamıyorum. Zincirleme yapmaya çalıştığımda, didReceiveAuthenticationChallenge'u iki kez aramak için NSURLRequest'umu alamıyorum.

Herhangi bir düşünce takdir edilecektir! Kimlik Doğrulaması için

Kod ...

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

cevap

9

yalnızca o meydan okuma için bir kimlik ile NSURLAuthenticationChallenge yanıtlayabilir. Sen kullanarak aldığınız Ne tür bir sorun belirleyebilirsiniz:

[[challenge protectionSpace] authenticationMethod] 

olası değerler documented here bulunmaktadır. Geçersiz bir sunucu sertifikası durumunda, kimlik doğrulama yöntemi NSURLAuthenticationMethodServerTrust olacaktır. Kodunuzda, kimlik doğrulama yöntemini kontrol etmeli ve uygun şekilde yanıt vermelisiniz.

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

Her seferinde her iki kimlik doğrulama sorununu almazsanız, bu bir hata değildir. Oluşturduğunuzda kimlik bilgilerini önbelleğe alabilirsiniz. Eğer yaparsanız, tekrar sorulmayacaksınız.

+0

Bir çekicilik gibi çalıştım. Uygulamamı bu yöntemi çağırmak için "canAuthenticateAgainstProtectionSpace" yöntemini doğru bir şekilde uyguladım. Ama bundan sonra her şey yolunda. Teşekkürler! – Staros

İlgili konular