2

Panther, Tiger 및 Leopard 시스템에서 실행중인 프로그램을 NSURLConnection 인증을 위해 다음 방법을 사용합니다 ("encodedUserPass"는 기본 단어가있는 인증 문자열입니다. base64로 인코딩 된 사용자 : 나중에 ...)타이거에서 기본 인증을 사용하는 NSURLConnection이 Panther 및 Leopard에서 성공 함

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

통과 ... didReceiveAuthenticationChallenge

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

이 팬더와 레오파드 시스템에서 완벽하게 정상적으로 작동하지만 타이거에 완전히 실패에. 하지만 Panther와 Leopard의 "didReceiveAuthenticationChallenge"도 보통 호출됩니다 (즉, 헤더를 수동으로 설정하면 작동하지 않는 것 같습니다).

Tiger에서 didReceiveAuthenticationChallenge는 항상 호출되어 위에서 설명한대로 응답을 시도한 다음 실패로 다시 호출됩니다.

두 가지 질문 : (i) 헤더를 수동으로 설정하지 않는 이유는 무엇입니까? (2) 위의 방법이 Tiger (10.4)에서 실패하는 이유는 무엇입니까? 몇 가지 생각 후, 나는 내 base64로 인코딩 방법에 문제가있을 것으로 실현하고 있었다

:

LATER UPDATE 내가 추가하지 않은 64 기수를 가져올 징후와 동일 최대 4 자의 문자열. 내가 함께 해결

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

그리고이 프로그램은 세 가지 플랫폼 모두에서 작동합니다. 그래서 질문 (i)가 답을 얻습니다. 머리글을 수동으로 설정하면 작동하지 않습니다. 왜냐하면 등호로 채우지 않았기 때문입니다.

질문 : (ii) 여전히 남아 있습니다. 왜 didReceiveAuthenticationChallenge successfuly를 Tiger에서 사용할 수 없습니까?

답변

0

난 그냥 당신이 설명하는 동일한 문제에 발견하고, NSURLCredentialPersistenceNone 단순히가하는 NSURLCredentialPersistenceForSession을 지정하는 반면, 타이거에서 작동하지 않는 것을 발견했다.

응용 프로그램에 따라 적절한 해결 방법이 될 수도 있고 그렇지 않을 수도 있습니다.

Apple의 설명서는 실제로 응용 프로그램이 종료 될 때까지 '세션'의 범위가 실제로 무엇인지 명시하지 않으므로 조금만 남습니다.

+0

감사합니다. Nick. 이것은 설명 일 수도 있습니다. 아마도 didReceiveAuthenticationChallenge에서 제공했던 NSURLCredentials 대신 다른 NSURLCredentials가 사용 되었기 때문에 기본 인증 권한을 얻는 것이 중요했습니다. 영구 자격 증명이 didReceiveAuthenticationChallenge에서 자신을 제공 한 자격 증명보다 우선 적용됩니까? – Dennis

+0

자격 증명 저장소에 유효한 NSURLCredentials가있는 경우 didReceiveAuthenticationChallenge가 호출되지 않습니다. 실제로 저장된 값이 우선합니다. –