Невозможно использовать NSURLConnection для получения содержимого защищенной паролем / именем пользователя веб-страницы - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь получить содержимое веб-страницы, для доступа к которой требуется пароль и имя пользователя. Я использую объект NSURLConnection, чтобы получить его, однако, когда я пишу объект NSMutableData, который возвращается в файл, все, что я получаю, это страница входа в систему. Обычно, когда вы пытаетесь загрузить страницу, защищенную паролем, когда вы не вошли в систему, она перенаправляет на страницу входа, однако я подумал, что если я предоставлю действительные учетные данные, то я смогу просмотреть страницу, защищенную паролем. Также я не знаю, насколько уместно, что веб-сайт использует базу данных Microsoft MySQL на IIS (информационный сервер в Интернете).

Примечание. [ProtectionSpace authenticationMethod] возвращает NSURLAuthenticationMethodServerTrust

Я довольно незнаком с этим, поэтому любые идеи будут с благодарностью.

Ниже приведен весь соответствующий код:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// This method is called when the server has determined that it
// has enough information to create the NSURLResponse.

// It can be called multiple times, for example in the case of a
// redirect, so each time we reset the data.

// receivedData is an instance variable declared elsewhere.
[receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
// receivedData is an instance variable declared elsewhere.
[receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection
  didFailWithError:(NSError *)error
{
// release the connection, and the data object
//[connection release];
// receivedData is declared as a method instance elsewhere
//[receivedData release];

// inform the user
NSLog(@"Connection failed! Error - %@ %@",
      [error localizedDescription],
      [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
// do something with the data
// receivedData is declared as a method instance elsewhere
NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);

// release the connection, and the data object
//[connection release];
//[receivedData release];



//Write data to a file
[receivedData writeToFile:@"/Users/matsallen/Desktop/receivedData.html" atomically:YES];
}

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:            (NSURLProtectionSpace *)protectionSpace
{
NSLog(@"The connection encountered a protection space. The authentication method is %@",    [protectionSpace authenticationMethod]);
secureTrustReference = [protectionSpace serverTrust];
//SecTrustResultType *result;
//OSStatus status = SecTrustEvaluate(secureTrustReference, result);
//NSLog(@"Result of the trust evaluation is %@",status);
return YES;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{

NSURLCredential *newCredential;
newCredential = [NSURLCredential credentialWithUser:@"username" password:@"password" persistence:NSURLCredentialPersistenceForSession];
newCredential = [NSURLCredential credentialForTrust:secureTrustReference];
//    [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
//    [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
}


#pragma mark - View lifecycle

- (void)viewDidLoad
{
receivedData = [[NSMutableData alloc] init];
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Create the request.
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.markallenonline.com/secure/maoCoaching.aspx"]
                                    cachePolicy:NSURLRequestUseProtocolCachePolicy
                                    timeoutInterval:60.0];
// create the connection with the request
// and start loading the data
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
    // Create the NSMutableData to hold the received data.
    // receivedData is an instance variable declared elsewhere.
    receivedData = [NSMutableData data];
    NSLog(@"Connection succeeded!");
} else {
    // Inform the user that the connection failed.
    NSLog(@"Connection failed!");
}
}

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Попробуйте использовать этот код вместо того, что у вас есть:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge previousFailureCount] == 0) {
    NSLog(@"received authentication challenge");
    NSURLCredential *newCredential = [NSURLCredential credentialWithUser:@"???????"
                                                                password:@"???????"
                                                             persistence:NSURLCredentialPersistenceForSession];
    NSLog(@"credential created");
    [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
    NSLog(@"responded to authentication challenge");    
}
else {
    NSLog(@"previous authentication failure");
}

}

Я использую этот код, и в моем случае я могу войти на защищенную страницу.

2 голосов
/ 17 ноября 2011

Вам необходимо реализовать обратный вызов:

 -(void) connection:(NSURLConnection *)connection
         didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

и передать туда кредиты изнутри.

0 голосов
/ 17 ноября 2011

Попробуйте ASIHTTPRequest, здесь есть поддержка аутентификации Basic, Digest и NTLM.

http://allseeing -i.com / ASIHTTPRequest /

Удачи!

...