ドメインコントローラーに対して一連の資格情報を検証したいと思います。例えば:
Username: STACKOVERFLOW\joel
Password: splotchy
方法1.偽装を使用してActiveDirectoryをクエリする
多くの人が、ActiveDirectoryに何かを照会することを提案しています。例外がスローされた場合は、資格情報が無効であることがわかります-このstackoverflowの質問で提案されているように。
ドメインアカウントを認証するだけでなく、暗黙的な承認チェックも実行します。つまり、偽装トークンを使用してADからプロパティを読み取っています。それ以外の場合は有効なアカウントにADから読み取る権限がない場合はどうなりますか?デフォルトでは、すべてのユーザーが読み取りアクセス権を持っていますが、ドメインポリシーを設定して、制限されたアカウント(またはグループ)のアクセス許可を無効にすることができます。
ADに対するバインドには重大なオーバーヘッドがあり、ADスキーマキャッシュをクライアントでロードする必要があります(DirectoryServicesが使用するADSIプロバイダーのADSIキャッシュ)。これはネットワークとADサーバーの両方であり、リソースを消費します。また、ユーザーアカウントの認証などの単純な操作にはコストがかかりすぎます。
例外ではない場合の例外の失敗に依存しており、それが無効なユーザー名とパスワードを意味すると想定しています。その他の問題(ネットワーク障害、AD接続障害、メモリ割り当てエラーなど)は、認証障害として誤って解釈されます。
方法2.LogonUser Win32 API
他の人が使用して示唆されているLogonUser()
API関数を。これは良さそうに聞こえますが、残念ながら、呼び出し元のユーザーは、通常、オペレーティングシステム自体にのみ付与されるアクセス許可を必要とする場合があります。
LogonUserを呼び出すプロセスには、SE_TCB_NAME特権が必要です。呼び出しプロセスにこの特権がない場合、LogonUserは失敗し、GetLastErrorはERROR_PRIVILEGE_NOT_HELDを返します。
場合によっては、LogonUserを呼び出すプロセスで、SE_CHANGE_NOTIFY_NAME特権も有効にする必要があります。それ以外の場合、LogonUserは失敗し、GetLastErrorはERROR_ACCESS_DENIEDを返します。この特権は、ローカルシステムアカウントまたはadministratorsグループのメンバーであるアカウントには必要ありません。デフォルトでは、SE_CHANGE_NOTIFY_NAMEはすべてのユーザーに対して有効になっていますが、一部の管理者はすべてのユーザーに対して無効にすることができます。
「配っオペレーティングシステムの一部として、 Microsoftがで指摘するように- 」権限は行き当たりばったりやりたいものではありませんナレッジベースの記事:
... LogonUserを呼び出すプロセスには、SE_TCB_NAME特権が必要です(ユーザーマネージャーでは、これは「オペレーティングシステムの一部として機能する」権限です)。SE_TCB_NAME特権は非常に強力であり、 資格情報を検証する必要があるアプリケーションを実行できるようにするためだけに、任意のユーザーに付与しないでください。
さらに、LogonUser()
空白のパスワードが指定されている場合、への呼び出しは失敗します。
ドメイン資格情報のセットを認証する適切な方法は何ですか?
私は起こるのマネージコードから呼び出すことが、これは、AA、一般的なWindowsの質問です。お客様には.NETFramework2.0がインストールされていると想定できます。