2011-01-31 6 views
3

NSURLCredentialをNSURLCredentialに設定した後、NSURLCredentialPersistenceForSessionを使用している資格情報を設定解除する方法を検索しようとしましたが、実際の解決策が見つかりませんでした。 NSURLCredentialStorageからNSURLCredentialを削除すると、NSURLCredentialStorageはNSURLConnectionキャッシュからではなくストレージから削除されます。私はキャッシュをオフにしようとしたが、それはまだそれを保持します。 NSURLCredentialPersistenceForSessionにする必要があります。大量のデータをアップロードしてからNSURLConnectionで認証してから大量のデータを再送信する必要があります。大量のデータを送信するだけです一度。いくつかのプロパティをチェックして大きなデータを送信する前に認証する方法がありますが、これでログアウトしたり、認証を要求したりすることはできません。私はWebDavクライアントを書いています。どこにいるのか分かります。なぜなら、誰かがWebDavサーバー上に複数のアカウントを持ち、別のアカウントにログインしたいのであれば、資格情報を解除する必要があるからです。私はクッキーを調べて、それが何かを設定しているかどうかを見てみましたが、そうではありません。私はそれがセッションのためだけであることを知っています。つまり、一度終了してアプリケーションを再起動すると、他のユーザーとしてログインできます。しかし、それは一部の人々を混乱させる可能性があります。自分の認証システムを書くことを考えましたが、どれくらいの時間がかかりますか分かりません。NSURLCredentialとNSURLConnection

申し訳ありませんが上記のメッセージが長すぎる場合、私は詳細についてすべてを説明しているので、誰かが有効な答えで私を助けようと試みることができます。

ご協力ありがとうございます。
Mr. Gecko。

更新:コード例。

CFHTTPMessageRef message = [self httpMessageFromResponse:response]; 
authentication = CFHTTPAuthenticationCreateFromResponse(kCFAllocatorDefault, message); 

CFHTTPMessageRef message = [self httpMessageFromRequest:request]; 
CFStreamError error; 
CFHTTPMessageApplyCredentials(message, authentication, (CFStringRef)[credentials user], (CFStringRef)[credentials password], &error); 
NSLog(@"%d", error.error); // Returns -1000 
CFStringRef value = CFHTTPMessageCopyHeaderFieldValue(message, CFSTR("Authorization")); 
NSLog(@"%@", (NSString *)value); // Returns NULL 
if (value!=NULL) 
CFRelease(value); 

更新:資格情報を削除しようとしたコード。

- (void)resetCredentials { 
    NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
    NSDictionary *allCredentials = [store allCredentials]; 
    NSArray *keys = [allCredentials allKeys]; 
    for (int i=0; i<[keys count]; i++) { 
     NSURLProtectionSpace *protectionSpace = [keys objectAtIndex:i]; 
     NSDictionary *userToCredentialMap = [store credentialsForProtectionSpace:protectionSpace]; 
     NSArray *mapKeys = [userToCredentialMap allKeys]; 
     for (int u=0; u<[mapKeys count]; u++) { 
      NSString *user = [mapKeys objectAtIndex:u]; 
      NSURLCredential *credential = [userToCredentialMap objectForKey:user]; 
      NSLog(@"%@", credential); 
      [store removeCredential:credential forProtectionSpace:protectionSpace]; 
     } 
    } 
} 
+0

私はCFHTTPAuthenticationRefを使用してみましたが、私は奇妙な応答であるkCFStreamErrorHTTPAuthenticationTypeUnsupportedを得続けます。 CFHTTPAuthenticationRefを使用する私の考えは、ヘッダを生成してリクエストに適用することです。上記のコード例を参照してください。 – GRMrGecko

答えて

-1

私はwebdavサーバーで作業していて、同様の問題がありました。 AppleのAdvancedURLConnectionのプロジェクトのサンプルコード内に解決策が見つかりました。秘密は、保護空間を反復し、各空間の資格情報を繰り返すことです。多分、複雑ではありませんが、私にとってはうまくいきます。

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
assert(store != nil); 
for (NSURLProtectionSpace *protectionSpace in [store allCredentials]) { 
    NSDictionary *userToCredentialMap = [[NSURLCredentialStorage sharedCredentialStorage] credentialsForProtectionSpace:protectionSpace]; 
    assert(userToCredentialMap != nil); 
    for (NSString *user in userToCredentialMap) { 
     NSURLCredential *credential = [userToCredentialMap objectForKey:user]; 
     assert(credential != nil); 
     [store removeCredential:credential forProtectionSpace:protectionSpace]; 
    } 
} 
+0

私はこれを試しましたが動作しません、私は質問で試したコードを追加します。私もこのことを試したことに言及しました... – GRMrGecko

+0

ここでは動作しません。 :-( – EricS