2012-12-23 2 views
0

J'ai un problème avec le sharedCredentialStorage. Il ne renverra pas les informations d'identification attendues, même si tous les paramètres de l'espace de protection (hôte, port, ...) sont identiques à ceux que j'ai définis précédemment.NSURLCredentialStorage sharedCredentialStorage ne renvoie pas les informations d'identification valides

code pour définir la defaultCredential:

NSURLCredential* credential = [NSURLCredential credentialWithUser:[self.username text] password:[self.password text] persistence:NSURLCredentialPersistencePermanent]; 
NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]initWithHost:@"localhost" port:0 protocol:NSURLProtectionSpaceHTTP realm:nil authenticationMethod:NSURLAuthenticationMethodDefault]; 
[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:credential forProtectionSpace:protectionSpace]; 

Après avoir exécuté ce morceau de code et d'aller à la fenêtre de gdb, le résultat pour les allCredentials (à sharedCredentialStorage) donne:

(lldb) po [[NSURLCredentialStorage sharedCredentialStorage] allCredentials] 
(id) $10 = 0x07546d60 { 
    "<NSURLProtectionSpace: 0x7550530>" =  { 
     lauro = "<NSURLCredential: 0x7573490>: lauro"; 
    }; 
} 

Cela signifie que le Les informations d'identification ont été correctement ajoutées au sharedCredentialStorage.

Mais lorsque l'opération de requête HTTP se produit et le challange d'authentification ressorte et ce code est RAN:

credential = [[NSURLCredentialStorage sharedCredentialStorage] defaultCredentialForProtectionSpace:[challenge protectionSpace]]; 

Rien n'est retourné à des titres de compétence variable. Avez-vous la moindre idée pourquoi cela se produit-il?

La sortie du gdb donne:

(lldb) po [[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] 
(id) $13 = 0x0754c1b0 <NSURLProtectionSpace: 0x754c1b0> 
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] host] 
// Host for the credential @ sharedCredentialStorage 
(id) $14 = 0x0a8b8000 localhost 
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] port] 
// Port for the credential @ sharedCredentialStorage (0 matches any) 
(id) $15 = 0x00000000 <nil> 
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] realm] 
// Realm for the credential @ sharedCredentialStorage (nil matches any) 
(id) $16 = 0x00000000 <nil> 
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] authenticationMethod] 
// Authentication method for the credential @ sharedCredentialStorage (this gets converted to HTTP basic) 
(id) $17 = 0x0159c094 NSURLAuthenticationMethodDefault 
(lldb) po [[[[[NSURLCredentialStorage sharedCredentialStorage] allCredentials] allKeys] objectAtIndex:0] protocol] 
// Protocol for the credential @ sharedCredentialStorage 
(id) $18 = 0x0159b504 http 
(lldb) po [[challenge protectionSpace] host] 
// Host for the credential @ challange 
(id) $19 = 0x0754e6c0 localhost 
(lldb) po [[challenge protectionSpace] port] 
// Port for the credential @ challange 
(id) $20 = 0x00000050 [no Objective-C description available] 
// Realm for the credential @ challange 
(lldb) po [[challenge protectionSpace] realm] 
(id) $21 = 0x01bde844 <object returned empty description> 
// Authentication method for the credential @ challange 
(lldb) po [[challenge protectionSpace] authenticationMethod] 
(id) $22 = 0x0159c094 NSURLAuthenticationMethodDefault 

// And finally, the check again to see if we have credentials @ sharedCredentialStorage 
(lldb) po [[NSURLCredentialStorage sharedCredentialStorage] allCredentials] 
(id) $25 = 0x0756f2b0 { 
    "<NSURLProtectionSpace: 0x7574a80>" =  { 
     lauro = "<NSURLCredential: 0x7574b00>: lauro"; 
    }; 
} 

Une chose, même si j'utilise une chaîne pour le domaine (et définir correctement aussi à mon service web REST) ​​il ne fonctionne pas.

Répondre

0

Lorsque vous obtenez le challenge, le port fourni dans l'espace de protection est probablement 80 (ou 443). Lorsque vous stockez les informations d'identification vous donnez un port de 0. Réglez-le sur le port correct (80 pour http, 443 pour https, sauf si vous savez que le serveur auquel vous vous connectez n'utilise pas les ports par défaut - votre sortie lldv semble montrer le port 50?) et essayer cela.

Questions connexes