2014-09-21 12 views
0

Я занимаюсь этой проблемой в течение нескольких дней. Моему приложению нужно зайти на сервер ASP.NET (версия: 4.0.30319, MVC версии: 3.0), а затем отправить через NSMutableURLRequest на ограниченную страницу (страницу, для которой вам необходимо войти в систему для доступа).Как правильно включить файлы .ASPXAUTH и ASP.NET_SessionId с NSMutableURLRequest

В настоящее время я могу, успешно, зайти на сайт. Для входа в систему я использую этот код:

NSString *post =[[NSString alloc] initWithFormat:@"LogInEmail=%@&Password=%@",@"[email protected]",@"password"]; 
NSURL *url=[NSURL URLWithString:@"http://www.website.com/LogIn"]; 

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
[request setURL:url]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPBody:postData]; 

NSError *error = [[NSError alloc] init]; 
NSHTTPURLResponse *responseMeta = nil; 
NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&responseMeta error:&error]; 

я могу проверить и убедиться, что одновременно ASP.NET_SessionId и .ASPXAUTH печенье, для этого веб-сайта, можно найти в sharedHTTPCookieStorage. Я понимаю, что оба они должны быть отправлены с запросом, если я хочу «войти в систему».

Код для проверки куки здесь:

NSArray *cookiesForURL = [cookieJar cookiesForURL: [NSURL URLWithString: @"http://www.example.com"]]; 

for (cookie in cookiesForURL) 
{ 
    if([cookie.name compare:@"ASP.NET_SessionId"] == NSOrderedSame) 
    { 
     ASPdotNET_SessionId = [cookie value]; 
     NSLog(@"ASP.NET_SessionId: %@" , ASPdotNET_SessionId); 
    } 
    if([cookie.name compare:@".ASPXAUTH"] == NSOrderedSame) 
    { 
     dotASPXAUTH = [cookie value]; 
     NSLog(@".ASPXAUTH: %@"   , dotASPXAUTH); 
    } 
} 

Чтобы очистить печенье использовать это:

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (NSHTTPCookie *each in [[cookieStorage cookiesForURL:[NSURL URLWithString:@"http://www.example.com"]] copy]) { 
    [cookieStorage deleteCookie:each]; 
} 

Я попытался разместить на ограниченной странице путем изменения NSString *post и NSUrl *url и с использованием тех же код выше.

NSString *post =[[NSString alloc] initWithFormat:[MessageId stringByAppendingString:@"=%@"],Comment]; 
NSURL *url=[NSURL URLWithString:@"https://www.website.com/message 

Это неудачно. Я предполагаю, что я каким-то образом пренебрег пешками. Я попытался добавить в этот код только под [request setHTTPMethod:@"POST"];:

[request addValue:ASPdotNET_SessionId forHTTPHeaderField:@"Cookie"]; 

и/или:

[request addValue:dotASPXAUTH forHTTPHeaderField:@"Cookie"]; 

где ASPdotNET_SessionId и dotASPXAUTH являются значения кук, извлеченные из sharedHTTPCookieStorage.

Я чувствую, что это действительно просто, любая помощь?

ответ

0

После еще одного тестирования оказалось, что я ошибался, когда думал, что неудачно с аутентификацией. Кажется, что либо NSURLConnection, либо NSMutableURLRequest обрабатывают файлы cookie для меня, и мне не нужно извлекать из sharedHTTPCookieStorage или устанавливать их с моей просьбой.

Далее, если кто-то были вручную отправить печенье, они должны быть, по крайней мере, этот формат, а не только чистое значение, поскольку ASP.NET ожидает, что куки в определенном формате:

[request setValue:[NSString stringWithFormat:@"ASP.NET_SessionId=%@", ASPdotNET_SessionId] forHTTPHeaderField:@"Cookie"]; 
[request setValue:[NSString stringWithFormat:@".ASPXAUTH=%@", dotASPXAUTH] forHTTPHeaderField:@"Cookie"]; 

или, возможно, это если выше не работает:

[request setValue:[[NSString stringWithFormat:@"ASP.NET_SessionId=%@", ASPdotNET_SessionId] stringByAppendingString:@"; path=/; HttpOnly"] forHTTPHeaderField:@"Cookie"]; 
[request setValue:[[NSString stringWithFormat:@".ASPXAUTH=%@", dotASPXAUTH] stringByAppendingString:@"; path=/; HttpOnly"] forHTTPHeaderField:@"Cookie"]; 

Где ASPdotNET_SessionId является 24 символом Session ID и dotASPXAUTH является строкой аутентификации 448 символа.