Я пытаюсь заставить вышеупомянутые три работать должным образом, и что-то не щелкает.В частности, запрос на аутентификацию не запускается, когда кажется, что это должно быть.Согласно тому, что я прочитал здесь, соответствующие части:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLog(@"protection space");
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"auth challenge");
NSInteger count = [challenge previousFailureCount];
if (count > 0)
{
NSLog(@"count > 0");
NSObject<ServiceDelegate> *delegate = [currentRequest delegate];
[[challenge sender] cancelAuthenticationChallenge:challenge];
if ([delegate respondsToSelector:@selector(wrapperHasBadCredentials:)])
{
[delegate rbService:self wrapperHasBadCredentials:self];
}
return;
}
NSArray *trustedHosts = [[NSArray alloc] initWithObjects:@"myserver", nil];
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
NSLog(@"server trust");
if ([trustedHosts containsObject:challenge.protectionSpace.host])
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
else
{
NSLog(@"credentials");
NSURLCredential* credential = [[[NSURLCredential alloc] initWithUser:@"xxx" password:@"xxx" persistence:NSURLCredentialPersistenceForSession] autorelease];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
}
Целевой сервер настроен для двух URL-адресов, одного HTTPS и одного HTTP, оба из которых запрашивают имя пользователя / пароль с помощью обычной аутентификации,Я проверил целевой сервер с помощью Firefox, и все, кажется, работает как рекламируется.Целевой сервер использует недоверенный сертификат, но я подумал, что позаботился об этом в коде.Возможно, нет.
Специфическое поведение в приложении:
При использовании HTTP журнал читает:
log - пространство защиты
(затем возвращает код 401)
При использовании HTTPS:
log - пространство защиты
log - проверка подлинности
log - доверие сервера
log - пространство защиты
(затем возвращает код 401)
В первом случае он попадает в раздел canAuthenticate ..., возвращает, но затем не вызывает аутентификацию и возвращает ответ 401.
Во втором случае онделает все это, на самом деле бросает вызов, затем снова переходит в раздел canAuthenticate ..., возвращает и возвращает ответ 401.
Имейте в виду, что запрос является запросом POST, с заголовками и HTTPBody,Аутентификация не включена в заголовки (я бы предпочел этого не делать), но если другого решения не будет, я попробую все так.
Как всегда, большое спасибо за помощь.Это бесценно.