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)
之类的事情,但那是不可用的。
人们都知道有什么好的解决方案吗?
答案 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
,因为它映射到用户的电子邮件地址。