2014-09-21 3 views
0

나는이 문제를 며칠 동안 보아왔다. 내 응용 프로그램은 ASP.NET (버전 : 4.0.30319, MVC 버전 : 3.0) 서버에 로그인 한 다음 NSMutableURLRequest를 통해 제한된 페이지 (액세스하려면 로그인해야하는 페이지)에 게시해야합니다.올바르게 NSMutableURLRequest와 함께 .ASPXAUTH 및 ASP.NET_SessionId 쿠키를 포함하는 방법

현재 웹 사이트에 로그인 할 수 있습니다. 이 코드를 사용하여 로그인하려면

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 *postNSUrl *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"]; 

및/또는 : ASPdotNET_SessionIddotASPXAUTH가 sharedHTTPCookieStorage에서 검색 쿠키 값입니다

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

.

나는 이것이 정말 간단하다고 느낍니다. 어떤 도움이 필요합니까?

답변

0

더 많은 테스트를 거친 후 인증에 실패했다는 생각이 들었을 때 잘못된 것으로 나타났습니다. NSURLConnection 또는 NSMutableURLRequest이 나를 위해 쿠키를 처리하는 것으로 나타나고 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 문자 세션 ID이며 dotASPXAUTH는 448 문자 인증 문자열입니다.

관련 문제