2011-01-26 3 views
1

私は、ASIHTTPRequestを使用してNTLM認証を使用するWebサービスと対話するiPhoneアプリケーションで作業しています。資格情報はキーチェーンに保存する必要があります。それは正常にログインするが、私はアプリからの資格情報をクリアするログアウトボタンを持っていると思うし、私はそれを働かせることはできません。ASIHTTPRequestからのクレデンシャルのクリア

ログアウトボタンをクリックすると、サーバーに照会するビューに戻ると、再度ログインするように求められます。しかし、それは起こらず、サーバーへの呼び出しはまだ認証されます。

要求は次のようになりますコード:ログアウトについては

NSString *urlString = [NSString stringWithFormat:@"http://myserver.mydomain.com/myapp/items/%@", itemGroupId]; 
NSURL *url = [NSURL URLWithString:urlString]; 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
[request setUseKeychainPersistence:YES]; 
[request setShouldPresentAuthenticationDialog:YES]; 
[request setRequestMethod:@"POST"]; 
[request addRequestHeader:@"content-type" value:@"application/json;charset=utf-8"]; 
[request addRequestHeader:@"content-length" value:@"0"]; 
[request setDelegate:self]; 
[request startAsynchronous]; 

は、私が呼び出して試してみた:

[ASIHTTPRequest removeCredentialsForHost:@"myserver.mydomain.com" port:0 protocol:@"http" realm:nil]; 

しかし、それは動作しません。そのメソッド内のコードは、それらの引数がsaveCredentials:forHost:port:protocol:realm:に最初に渡されるのを見たとしても、それを削除できるように保存されたNSURLCredentialを検出しません。

また、clearSessionの呼び出しも試しましたが、setUseSessionPersistenceを使用してリクエストを作成するとセッションの永続性を完全に無効にしようとしましたが、不運です。

私はまた、アプリのキーチェーンに資格情報のすべてをループし、それらをすべて削除しthis exampleに基づいてコードを使用してみました:

NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
for (NSURLProtectionSpace *space in [store allCredentials]) { 
    NSDictionary *userCredentialMap = [store credentialsForProtectionSpace:space]; 
    for (NSString *user in userCredentialMap) { 
     NSURLCredential *credential = [userCredentialMap objectForKey:user]; 
     [store removeCredential:credential forProtectionSpace:space]; 
    } 
} 

作品のその種、次回アプリはそれを立ち上げているので」もう一度ログインを求めるプロンプトが表示されます。しかし、アプリが引き続き実行されている場合、別のログインを促すメッセージは表示されません。

+0

私も同様の問題に直面しています。解決策は見つかりましたか? –

+0

いいえ、私はこれには良い答えが見つかりませんでした。 –

答えて

0

ポート0を使用していて、領域が正しくありませんか。 私はconnect-url-string(すべてのASIHTTPRequestに使用するのと同じURL)からNSURLを作成し、そのホスト、ポート、プロトコルを取得するようにしてください。私は今のところ手で領域を言わなければならない。このコードを使用して

私は私のアプリで正常にログアウトすることができる午前:私は私のアプリを実行していきましょう際

// clear keychain 
NSURL *url = [NSURL URLWithString:kConnectorUrlString]; 
[ASIHTTPRequest removeCredentialsForHost:[url host] port:[[url port] intValue] protocol:[url scheme] realm:kConnectorRealm]; 

私のアプリが再び私を求められます。 saveCredentialsに渡されるのと同じ引数を使用しています。

+0

いいえ、ポート0とレルムが正しくないことはわかりませんが、これらがsaveCredentialsに渡された値であることを確認しました。私はあなたの提案を試みましたが、それは私にとってはうまくいかず、資格情報をどこかにキャッシュしています。 NTLMを使用していますか?私はそれが違いを生むのだろうかと思っています... –

+0

いいえ私はNTMLを使用していません。私は現時点で基本アクセス認証を使用しています。だから私はあなたの問題を再現できません。 – Colbert

関連する問題