如何使用NSMutableURLRequest正确包含.ASPXAUTH和ASP.NET_SessionId cookie

时间:2014-09-21 18:43:18

标签: ios asp.net cookies nsmutableurlrequest .aspxauth

我已经解决了这个问题几天了。我的应用程序需要登录到ASP.NET(版本:4.0.30319,MVC版本:3.0)服务器,然后通过NSMutableURLRequest发布到受限页面(需要您登录才能访问的页面)。

目前我可以成功登录该网站。要登录我使用此代码:

NSString *post =[[NSString alloc] initWithFormat:@"LogInEmail=%@&Password=%@",@"username@website.com",@"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 cookie都可以在sharedHTTPCookieStorage中找到。我知道,如果我想要登录"这两个需要与请求一起发送。

检查cookie的代码在这里:

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);
    }
}

要清除Cookie,请使用此选项:

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

和/或:

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

其中ASPdotNET_SessionIddotASPXAUTH是从sharedHTTPCookieStorage检索到的Cookie值。

我觉得这很简单,有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

经过更多测试后,当我认为我的身份验证失败时,似乎我错了。似乎NSURLConnectionNSMutableURLRequest为我处理Cookie,我无需从sharedHTTPCookieStorage检索或根据我的请求设置它们。

此外,如果某人 手动发送cookie,则他们应至少采用此格式,而不仅仅是纯值,因为ASP.NET期望cookie采用某种格式:

[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个字符串验证字符串。