0

ActiveDirectoryMembershipProviderASP.NET 中的 将用户作为MembershipUser. 此类仅返回为 AD 中给定用户定义的两个属性:电子邮件和用户名。我需要访问其他属性,特别是“DisplayName”,因为我需要在 Web 表单的下拉列表中显示全名。

我能找到的唯一方法是通过与 AD 的单独连接,按照此处描述的内容:如何从 SID 转换为 C# 中的帐户名称。这似乎是一个繁琐且低效的解决方案。我想做类似的事情membershipProvider.GetUserProperty(username, propertyName),但这不可用。

人们知道有什么好的解决方案吗?

4

1 回答 1

1

根据我同事的反馈(感谢 Eirik!)、@KennyZ 的评论和大量的谷歌搜索,我发现这是最好/唯一的方法。作为参考,以及其他看到此问题的人,以下是一些有用的代码,用于从 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 回答