[解決済み] ドメイン認証の検証方法は?
質問
私は、ドメインコントローラに対して一連の資格情報を検証したい。
Username: STACKOVERFLOW\joel
Password: splotchy
方法1.なりすましでActive Directoryに問い合わせる
多くの人が、Active Directory に何か問い合わせることを提案しています。例外がスローされた場合、資格情報が有効でないことがわかります (下記で提案されているとおりです)。 このスタックオーバーフローの質問 .
いくつかの深刻な の欠点があります。 があります。
-
ドメイン アカウントを認証しているだけでなく、暗黙的な認証チェックも行っています。つまり、なりすましトークンを使用して 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はすべてのユーザーに対して有効です。 すべてのユーザーに対して有効ですが、管理者によっては 管理者によっては、すべてのユーザーに対してこれを無効にすることができます。 を無効にすることもできます。
配布するのは、"です。 オペレーティング システムの一部として機能する 特権を与えることは、やみくもに行うべきことではありません。 ナレッジベースの記事 :
<ブロッククオート...このプロセスでは を呼び出しているプロセスには、SE_TCB_NAME 権限を持っている必要があります (ユーザー マネージャで、これは は、" オペレーティング システムの一部としての行為 システム "右)。SE_TCB_NAME 特権は非常に強力で を実行できるようにするために、任意のユーザに与えるべきではありません。 アプリケーションを実行するために が必要なアプリケーションを実行するために を実行できるようにするためです。
さらに
LogonUser()
の呼び出しは、空白のパスワードが指定された場合、失敗します。
ドメイン認証情報のセットを認証するための適切な方法は何ですか?
I 起こる はマネージ コードから呼び出していますが、これは一般的な Windows の質問です。顧客が .NET Framework 2.0 をインストールしていると仮定することができます。
どのように解決するのですか。
.NET 3.5でC#を使用して System.DirectoryServices.AccountManagementを使用します。 .
bool valid = false;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
valid = context.ValidateCredentials( username, password );
}
これは現在のドメインに対してバリデーションを行います。 他のオプションについては、パラメータ化されたPrincipalContextのコンストラクタをチェックしてください。
関連
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] Git から認証情報を削除する
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。