ADAL ライブラリを iOS アプリケーションに統合しましたが、正常に動作しています。しかし、今は ADAL からログアウトしたいと考えています。どうすればログアウトできますか?
4 に答える
ADAL 対話型フローを使用する場合、サインイン状態が保存される場所は 2 つあります。1 つ目は、アプリによって完全に制御されるトークン キャッシュです。[authContext.tokenCacheStore removeAllWithError:&error] を呼び出すことは、キャッシュされたすべてのトークンをクリアし、ブラウザーをまったく起動せずに ADAL がログインできないようにする良い方法です。
ただし、サインイン状態は、サーバーのブラウザー Cookie でも追跡されます。サーバーは、Cookie がタイムアウトするか削除されるまで、ユーザーがサーバーにサインインしたことを記憶します。ADAL がキャッシュをチェックし、適切なトークンが見つからない場合、webView を起動します。The server will find a cookie and then quietly sign the user. ブラウザーの Cookie は、ほとんどが ADAL から隠されています。ADAL ライブラリは、すべての Cookie をクリアするサインアウト機能を提供する可能性がありますが、アプリが何らかの理由で他の Cookie に依存している場合、これには副作用があります。
これを回避するには、いくつかの方法があります。単にログアウトするだけで、すべての webView Cookie をクリアしてもかまわない場合は、キャッシュをクリアした後、次の説明に従ってすべてのブラウザー Cookie をクリアします。
UIWebView のすべての Cookie を削除するには?
それが核の選択肢です。もう 1 つのより微妙なオプションは、キャッシュをクリアしてから、ADPromptBehavior パラメーターを受け取る aquireToken の呼び出しで AD_PROMPT_ALWAYS 値を使用することです。AD_PROMPT_ALWAYS を使用すると、フラグが AAD に送信され、Cookie が無視され、ユーザーに新しいプロンプトが表示されます。これにより、Cookie がそのまま残るため、技術的には、ユーザーは実際にはサインアウトされません。ユーザーには、サインアウトされ、後で再度サインインできるように見えます。再度サインインすると、必要に応じて別のユーザーを選択できます。
これは、複数のユーザーでサインインを処理する方法でもあります。すでにサインインしているユーザーがいて、別のユーザーを追加したい場合は、キャッシュをクリアせず、acquireToken への次の呼び出しで AD_PROMPT_ALWAYS を渡します。サーバーは新しいサインイン プロンプトを表示し、新しいトークンを返します。そのトークンは、その ADAL キャッシュに格納されます。acquireToken を呼び出して userId を渡すことにより、特定のユーザーのトークンを取得します。
リッチの優れた回答の更新。まず、最新の ADAL リリースでインターフェイスが変更されたため、次の方法でトークン キャッシュにアクセスする必要があります。
#import <ADAL/ADKeychainTokenCache.h>
[...]
[[ADKeychainTokenCache defaultKeychainCache] removeAllForClientId:ADFS_CLIENT_ID error:&error];
また、Cookie をクリアするには、すべてをクリアするのではなく、重要なものだけを削除することをお勧めします。
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
if ([cookie.name isEqualToString:@"MSISAuth"] ||
[cookie.name isEqualToString:@"MSISAuthenticated"] ||
[cookie.name isEqualToString:@"MSISLoopDetectionCookie"]) {
[cookieJar deleteCookie:cookie];
}
}
(古い ADFS インストールでは AD_PROMPT_ALWAYS が機能せず、強制的に Cookie を削除することがわかりました。)