ios https и базовая аутентификация и почтовый запрос - PullRequest
2 голосов
/ 10 сентября 2011

Я пытаюсь заставить вышеупомянутые три работать должным образом, и что-то не щелкает.В частности, запрос на аутентификацию не запускается, когда кажется, что это должно быть.Согласно тому, что я прочитал здесь, соответствующие части:

- (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,Аутентификация не включена в заголовки (я бы предпочел этого не делать), но если другого решения не будет, я попробую все так.

Как всегда, большое спасибо за помощь.Это бесценно.

1 Ответ

2 голосов
/ 14 сентября 2011

Похоже, что ответом здесь должна быть отправка аутентификации вместе с запросом POST. Я думал, что процесс «запрос / ответ» каким-то образом сам добавит эти заголовки к запросу, но, очевидно, нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...