2

我有一个在 Panther、Tiger 和 Leopard 系统上运行的程序,并使用以下方法进行 NSURLConnection 身份验证(“encodedUserPass”是带有单词 Basic 后跟 base64 编码用户:pass 的身份验证字符串)

[theRequest addValue:encodedUserPass forHTTPHeaderField:@"Authorization"];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

...稍后...在 didReceiveAuthenticationChallenge

if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:login_name password:password persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}

这在 Panther 和 Leopard 系统上运行良好,但在 Tiger 上完全失败。奇怪的是,即使在 Panther 和 Leopard 上,通常也会调用“didReceiveAuthenticationChallenge”(即,手动设置标头似乎不起作用)。

在 Tiger 上,didReceiveAuthenticationChallenge 总是被调用,尝试如上所示响应,然后再次调用失败。

两个问题:(i)为什么手动设置标题不起作用?(2) 为什么上面显示的方法在 Tiger (10.4) 上失败?

稍后更新

经过一番思考,我意识到我的 base64 编码方法一定有问题,并且有:我没有附加等号来使 base64 字符串达到 4 个字符的倍数。我解决了

while ([bareString length] % 4) [bareString appendString:@"="];

现在该程序适用于所有三个平台。所以问题(i)得到了回答:手动设置标题不起作用,因为我没有用等号填充。

但是,问题 (ii) 仍然存在:为什么我不能在 Tiger 中成功使用 didReceiveAuthenticationChallenge?

4

1 回答 1

0

我刚刚偶然发现了您描述的相同问题,并发现NSURLCredentialPersistenceNone根本不适用于 Tiger,而指定NSURLCredentialPersistenceForSession则可以。

根据您的应用程序,这可能是也可能不是可接受的解决方法。

Apple 的文档还有一些不足之处,因为它没有指定“会话”的实际范围是什么——直到应用程序退出,也许?

于 2009-09-14T19:35:09.447 回答