从ActiveDirectoryMembershipProvider中检索其他用户属性

时间:2013-06-20 13:32:13

标签: asp.net active-directory

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

我能找到的唯一方法就是通过与AD的单独连接,按照此处描述的内容:How can I convert from a SID to an account name in C#。这似乎是一个麻烦而低效的解决方案。我想做membershipProvider.GetUserProperty(username, propertyName)之类的事情,但那是不可用的。

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

1 个答案:

答案 0 :(得分:0)

根据同事的反馈(谢谢,Eirik!),@ KennyZ的评论以及许多Googl'ing,我发现这是最好/唯一的方法。作为参考和其他人看到这个问题,这里有一些有用的代码,用于从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,因为它映射到用户的电子邮件地址。