NSURLConnection的委托方法,要求authenticationChallenge是不是被解雇了?

时间:2012-07-12 08:52:46

标签: ios certificate nsurlconnection ssl-certificate nsurlconnectiondelegate

我使用NSURLConnection来调用web服务,我的钥匙串中有一个客户端证书,我在- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

中设置了凭证

在我删除此证书并向钥匙串添加新证书后,NSURLConnection仍然保留了我已经提供的凭证,并在删除旧证书之前向我返回417状态错误代码,即200。

有没有办法让NSURLConnection强制要求凭据。?或者如何关闭现有的SSL连接或身份验证质询的凭据。

1 个答案:

答案 0 :(得分:2)

NSURLConnection是善变的野兽,过去几天我一直遇到类似的问题。但是我已经找到了解决问题的方法,并提出了一些建议,可能是您遇到问题的原因。

<强> TLS

首先有可能发生的事情是缓存凭据的TLS层。这是因为建立TLS连接[1]的计算成本很高。

可能的解决方案是更改您正在使用的DNS名称,例如在字符串末尾添加一个点(。),因为DNS协议接受以点结尾的字符串作为完全限定的DNS名称。我还看到有人在所有网址请求中添加了一个#标签,从而欺骗系统永远不会查找存储的凭据,只是发起didRecieveAuthenticationChallenge调用[2]。

<强>缓存

另一种可能性是服务器正在设置您需要清除的cookie。您可以通过执行以下操作来执行此操作:

-(void)clearCookies:(NSString *)urlString{
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedCookieStorage];
    NSURL *url = [[NSURL alloc] initWithString urlString];
    NSArray *cookies = [cookieStorage cookiesForURL:tempURL];

    for(NSHTTPCookie *cookie in cookies){
        //iterate over all cookies and delete them
        [cookieStorage deleteCookie:cookie];
    }

}

<强> NSURLCredentialStorage

现在可能是凭据仍然存储在sharedCredentialStorage中,因此应该通过执行以下操作来删除:

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage];
if(store !=nil){
   for(NSURLProtectionSpace *protectionSpace in [store allCredentials]){
      NSDictionary *map = [[NSURLCredentialStorage sharedCredentialStorage] 
                                  credentialsForProtectionSpace:protectionSpace];
      if(map!=nil){
         for(NSString *user in map){
             NSURLCredential *cred = [map objectForKey:user];
             [store removeCredential:cred forProtectionSpace:protectionSpace];
          }
      }
   }
}

我希望这些会有所帮助。