iOS 8的基本身份验证失败

时间:2014-09-23 15:58:44

标签: ios iphone ios8 basic-authentication

我有一个与运行Rails的服务器交互的iOS应用程序,并且已经稳定可靠3年了。该服务器需要基本和SSL认证,这一直非常适用于iOS 7。

但是,我现在看到运行iOS 8的设备的身份验证问题。运行的设备/模拟器< iOS 8继续正常运行。

在应用初始化时,有一系列数据请求要与需要通过基本身份验证的服务器同步。

这会导致调用以下委托方法,

willSendRequestForAuthenticationChallenge

...问题出现是因为这些问题无休止地受到挑战 - 当[挑战previousFailureCount]>时,代码故意在第二次尝试时失败。 0(代码路径遵循标准做法,如果previousFutureCount> 0则调用cancelAuthenticationChallenge) - 见下文。

我已经记录了挑战ID,并且这些挑战在每个挑战中都是不同的,即使在previousFailureCount> 0

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

    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodHTTPBasic])
    {   
        if ([challenge previousFailureCount] == 0)
        {
            NSURLCredential *newCredential;

            newCredential = [NSURLCredential credentialWithUser:MY_USERNAME
                            password:MY_PASSWORD
                            persistence:NSURLCredentialPersistenceForSession]; // Retain for rest of session

            [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        }
        else
        {
            [[challenge sender] cancelAuthenticationChallenge:challenge];

            // ...error will be handled by connection didFailWithError
        }
    }
}

如果我敲除了检查previousFailureCount的调用,则会有无休止的调用方法调用。

然而,一旦这一系列失败失败,后续和后来的“个人”NSUrlRequests都会被成功验证。

同样,这个问题特定于iOS 8.任何想法为什么“快速”连续的身份验证请求会在iOS 8中失败,但在iOS 7中工作?

感谢。

4 个答案:

答案 0 :(得分:1)

如果您没有处理身份验证方法(NSURLAuthenticationMethodHTTPBasic),必须调用其中一种方法:

useCredential:forAuthenticationChallenge:

continueWithoutCredentialForAuthenticationChallenge:

cancelAuthenticationChallenge:

performDefaultHandlingForAuthenticationChallenge:

rejectProtectionSpaceAndContinueWithChallenge:

如果您想忽略某种身份验证方法,您可能希望调用performDefaultHandlingForAuthenticationChallenge:

另请参阅:connection:willSendRequestForAuthenticationChallenge:

答案 1 :(得分:0)

我有同样的问题,我删除了if([challenge previousFailureCount] == 0),并且它有效。

但我不知道为什么它在IOS 8中失败了。

答案 2 :(得分:0)

这个问题的答案/更新也解决了我所看到的问题。

NSURLConnection timing out on iOS8

同样,iOS 8中的内容发生了变化,需要进行此修复。

答案 3 :(得分:0)

仅供参考,我在我的应用中发现了类似的行为。我只是看到那些无法立即运行的请求,而是必须等待其他网络请求,但基本身份验证失败。

使用操作队列确保我没有超过4个并发请求解决了这个问题(显然,将NSURLConnection包装在异步NSOperation子类中)。同样使用NSURLSession也解决了问题。

这看起来像是一个带有NSURLConnection基本身份验证的iOS 8错误。