3

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

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

助けてくれてありがとう、
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];
        }
    }
}
4

1 に答える 1

-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];
    }
}
于 2011-02-15T19:36:59.953 に答える