6

ユーザーの承認に大きく依存するアプリケーションがあります。その中で、IPrincipal.IsInRole()ユーザーが正しいグループに属しているかどうかを確認するために使用しています。

IPrincipal principal = Thread.CurrentPrincipal;
bool inRole = principal.IsInRole("mydomainname\some role with a long name");

これはほとんどの部分で正常に機能しますが、プリンシパルがのインスタンスである場合は失敗します(誤った結果を返します)WindowsPrincipal。正しく機能させるには、渡すロールの名前を32文字の長さに切り捨てる必要があることがわかりました(ドメイン名とを含む\)。

IPrincipal principal = Thread.CurrentPrincipal; // <- returns a WindowsPrincipal
bool inRole = principal.IsInRole("mydomainname\some role with a lo");

その後、役割名の切り捨ては正しく機能します。なんで?これはバグ/機能/文書化された問題ですか?Win2000ドメインに関連している可能性があると思われますが、情報が見つかりません。

いくつかの追加情報:
これは、アプリケーションがその承認にActive Directoryまたは「カスタム」のいずれかを使用するように構成できるため問題です(「カスタム」は、インターフェイスをサポートする任意の承認プロバイダーであり、SQLベース、ファイルベースなどです。 ..)。カスタムが構成されている場合、ロールはほとんどの場合切り捨てる必要がないため、コードでこの特殊なケースに対処する必要はありません。さらに、名前空間内のクラスを使用しSystem.DirectoryServices.AccountManagementてグループメンバーシップを検索するアプリケーションの別の部分があります。これには完全な役割名が必要であり、切り捨てられた場合は機能しません。

4

1 に答える 1

8

多くの試行錯誤の末、私は何が起こっているのかを理解しました。

Active Directoryでグループを作成すると、次の2つの名前が付けられます。

代替テキスト

WindowsPrincipalは、が呼び出されたときにWindows2000より前のグループ名を使用しているようです。IsInRole

広範囲に検索した後、これはどこにも文書化されていないようです。私が得た最も近いものは、ここSOに関する同様の質問に対するこの投機的な答えでした。


私の場合、ドメインでクエリを実行していたグループの名前は長いですが、Windows 2000より前の名前は切り捨てられています(何らかの理由で32文字に切り捨てられています)。間違ったグループ名をチェックしていたため、長い名前を渡すことはできません。

于 2010-09-23T15:20:45.207 に答える