ユーザーの承認に大きく依存するアプリケーションがあります。その中で、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
てグループメンバーシップを検索するアプリケーションの別の部分があります。これには完全な役割名が必要であり、切り捨てられた場合は機能しません。