userId を指定すると、ADAL はそれが指定されたと見なします。結果のユーザーが要求されたものではない場合、表示されているエラーが発生します。どのユーザーが認証されているか気にしない場合は、userId パラメーターとして nil を渡すことができ、エラーは発生しません。
ADAL ライブラリは、過度の注意を払ってこれを行います。userId パラメーターが何を意味するかにかかわらず、ADAL を呼び出したときに、要求したユーザーのトークンを取得することを ADAL が保証する方法はありません。それは最善を尽くします。キャッシュでそのユーザーのトークンを見つけることができれば、それを返します。ただし、これまで見てきたように、対話型フローが呼び出された場合、ユーザーが要求されたものとは異なるユーザー名を入力することを妨げるものは何もありません。その場合、別のユーザーのトークンが返されます。アプリが一部の UI 要素またはプライベート リソースを特定の userId に関連付けた場合はどうなりますか? 要求されたものとは異なるユーザーのトークンを取得した場合、アプリのユーザーには明らかではない方法でユーザーが混在している可能性があります。ユーザーが最初に権限の低いユーザーとしてサインインした場合、その後、管理者としてサインインし、アプリがこれに気付かない場合、悪いことが起こる可能性があります。そのため、ライブラリは、特定のユーザーを要求した場合、そのユーザーだけが受け入れられると想定します。
以下は、おそらく必要以上に詳細ですが、完全を期すために続けます。残念ながら、userId パラメータは 3 つの異なる目的でオーバーロードされています。
キャッシュ ルックアップ キーとして。ADAL が渡されたユーザーを以前に認証しており、そのユーザーのトークンまたは更新トークンがキャッシュにある場合、ADAL はそのトークンを直接検索して、AAD 要求の必要性を回避できます。一度に 1 人のユーザーしか認証しない場合、ADAL は渡されたリソースに対して有効なトークンを見つけようとするため、何の価値もありません。
サーバーへのログインヒントとして。userId は、ユーザーの便宜のためにユーザー名フィールドを事前入力するために使用されます。ただし、ユーザーはそのユーザー名を自由に削除して、別のユーザー名を提供できます。
ホームレルム発見のヒントとして。ユーザーがフェデレーション ユーザーである場合、つまり AAD が認証のために ADFS (または他のフェデレーション サーバー) を参照する必要がある場合、参照先のサーバーのアドレスを決定するためにユーザー名が必要です。通常、これは 2 段階のプロセスで行われます。ユーザーは最初に AAD ページにアクセスし、ユーザー名を入力します。ユーザー名フィールドがフォーカスを失うとすぐに、サーバーはユーザー名を検索し、それがフェデレーション ユーザーである場合は、ADFS サーバーへのリダイレクトを開始します。最後に、ユーザーが ADFS ログイン ページにアクセスすると、ユーザー名が既に入力されていることがわかります。パスワードを入力すると、認証が完了します。ただし、userId パラメーターを渡すと、その値は AAD に渡されます。結果として、
2 つまたは 3 つ必要で、1 つを気にしない場合は、回避策があります。You can specify nil for the userId but add "login_hint="username" as the extraQueryParameters parameter. Replace "username" with the username you would have passed in the userId parameter. これを行うと、ADAL はユーザーの名前を無視します。要求されましたが、AAD は、ユーザー名フィールドを事前入力するためのログイン ヒントとして、およびホーム レルム検出ヒントとしてユーザー名を解釈します。 login_hint として指定したユーザーのトークンを取得できない可能性があることに注意してください.ユーザーが誰であるか、またはアクセスできる可能性があるものについて推測する前に、ユーザーを確認する必要があります.