0

ActiveDirectoryMembershipProviderASP.NETのは、ユーザーを のインスタンスとして返しますMembershipUser。このクラスは、AD で指定されたユーザーに対して定義された 2 つのプロパティ (電子メールとユーザー名) のみを返します。Web フォームのドロップダウンに完全な名前を表示する必要があるため、追加のプロパティ、特に「DisplayName」にアクセスする必要があります。

これを行う唯一の方法は、ここで説明されている行に沿って、AD への別の接続を介することです: How can I convert from a SID to an account name in C# . これは、面倒で非効率的なソリューションのように思えます。のようなことをしたいmembershipProvider.GetUserProperty(username, propertyName)のですが、それは利用できません。

人々が知っている素晴らしい解決策はありますか?

4

1 に答える 1

1

同僚からのフィードバック (ありがとう、Eirik!)、@KennyZ のコメント、および多くの Google 検索に基づいて、これが最善/唯一の方法であることがわかりました。参考までに、およびこの質問を見ている他の人のために、web.config+connectionStrings.config から AD 設定を取得し、そのデータを使用して特定のユーザーの表示名を AD に照会するための便利なコードを次に示します。

var membershipSection = (MembershipSection)WebConfigurationManager.GetSection("system.web/membership");
var providerSettings = membershipSection.Providers["ActiveDirectoryMembershipProvider"];
var connectionStringName = providerSettings.Parameters["connectionStringName"];
var adUser = providerSettings.Parameters["connectionUsername"];
var adPassword = providerSettings.Parameters["connectionPassword"];
var adConnection = WebConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
var adReference = new DirectoryEntry(adConnection, adUser, adPassword);
var search = new DirectorySearcher(adReference) {Filter = string.Format("(mail={0})", username)};
search.PropertiesToLoad.Add("displayName");
SearchResult result = search.FindOne();
if (result != null)
{
    var resultCollection = result.Properties["displayName"];
    if (resultCollection.Count > 0)
    {
        var displayName = resultCollection[0].ToString();
        ...
    }
}

注: これは、ユーザーの電子メール アドレスにマップされるため、web.config でを使用userPrincipalNameしていることを前提としています。attributeMapUsername

于 2013-06-21T10:37:58.500 に答える