2

NSURLConnection を使用して Web サービスを呼び出し、キーチェーンにクライアント証明書が存在し、資格情報として設定しました- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

この証明書を削除してキーチェーンに新しい証明書を追加した後も、NSURLConnection は既に提供した資格情報を維持し、古い証明書を削除する前に 417 ステータス エラー コード (200) を返してくれます。

NSURLConnection に資格情報を強制的に要求させる方法はありますか? または、既存の SSL 接続または認証チャレンジの資格情報を閉じる方法。

4

1 に答える 1

2

NSURLConnection気まぐれな獣であり、私は過去数日間同様の問題を抱えています。しかし、私の問題に対する解決策と、あなたが抱えているような問題の原因となる可能性のあるいくつかの提案を見つけました.

TLS

まず、TLS レイヤーが資格情報をキャッシュしている可能性があります。これは、TLS 接続を確立するのに計算コストがかかるためです [ 1 ]。

これに対する考えられる解決策は、使用している DNS 名を変更することです。たとえば、DNS プロトコルは完全修飾 DNS 名としてドットで終わる文字列を受け入れるため、文字列の末尾にドット (.) を追加します。また、すべての URL 要求にハッシュタグ (#) を追加して、システムを騙して、保存されている資格情報を探すのでは なく、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];
          }
      }
   }
}

これらが役立つことを願っています。

于 2012-07-23T16:10:32.623 に答える