2

J'ai un programme s'exécutant sur les systèmes Panther, Tiger et Leopard et en utilisant la méthode suivante pour l'authentification NSURLConnection ("encodedUserPass" est la chaîne d'authentification avec le mot Basic suivi par l'utilisateur codé en base64: pass)NSURLConnection utilisant l'authentification de base échoue sur Tiger, succède à Panther et Leopard

[theRequest addValue:encodedUserPass forHTTPHeaderField:@"Authorization"]; 
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

... plus tard ... dans didReceiveAuthenticationChallenge

if ([challenge previousFailureCount] == 0) { 
NSURLCredential *newCredential; 
newCredential=[NSURLCredential credentialWithUser:login_name password:password persistence:NSURLCredentialPersistenceNone]; 
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
} 

Cela fonctionne parfaitement bien sur Panther et les systèmes de Leopard mais échoue complètement sur Tiger. Il est étrange, cependant, que même sur Panther et Leopard "didReceiveAuthenticationChallenge" est habituellement appelé (c.-à-d., Le réglage manuel des en-têtes ne semble pas fonctionner).

Sur Tiger, didReceiveAuthenticationChallenge est toujours appelé, tente de répondre comme indiqué ci-dessus, puis est à nouveau appelé en cas d'échec. Deux questions: (i) Pourquoi le réglage manuel des en-têtes ne fonctionne-t-il pas? et (2) Pourquoi la méthode montrée ci-dessus échoue-t-elle sur Tiger (10.4)?

PLUS TARD MISE A JOUR:

Après réflexion, je me suis aperçu qu'il devait y avoir quelque chose de mal avec ma méthode base64 codage, et il y avait: je ne rajoutez pas égaux signes pour amener la base64 chaîne jusqu'à un multiple de 4 caractères. Je l'ai résolu avec

while ([bareString length] % 4) [bareString appendString:@"="]; 

Et maintenant le programme fonctionne sur les trois plates-formes. La réponse à la question (i) est donc la suivante: le réglage manuel des en-têtes n'a pas fonctionné car je ne remplissais pas les signes égaux. Question (ii) reste, cependant: pourquoi ne puis-je pas utiliser didReceiveAuthenticationChallenge avec succès dans Tiger?

Répondre

0

Je viens trébuché dans le même problème que vous décrivez, et a constaté que NSURLCredentialPersistenceNone ne fonctionne tout simplement pas sur Tiger, alors que la spécification NSURLCredentialPersistenceForSession fait.

En fonction de votre application, cela peut être une solution de contournement acceptable ou non.

La documentation d'Apple laisse un peu à désirer car elle ne précise pas la portée d'une «session» - jusqu'à ce que l'application se ferme, peut-être?

+0

Merci pour cela, Nick. Je peux imaginer que cela pourrait être l'explication - peut-être était-il essentiel d'obtenir l'autorisation de base parce que les NSURLCredentials conservés étaient utilisés - au lieu de ceux fournis dans didReceiveAuthenticationChallenge. Un identifiant persistant remplacerait-il celui que je me suis fourni dans didReceiveAuthenticationChallenge? – Dennis

+0

S'il existe un NSURLCredentials valide dans le magasin de données d'identification, alors le paramètre didReceiveAuthenticationChallenge n'est pas appelé. Par conséquent, les enregistrements stockés sont prioritaires. –

Questions connexes