我需要协助根据数据库中的表收集Active Directory数据。我有一个实体类来保存用户请求。每个请求都有来自System.Web.HttpContext.Current.User.Identity.Name的用户窗口名称。我的问题是我无法弄清楚如何设置linq查询以将AD用户名与AD的其余部分相关联,因此我可以在我的表中显示他们的全名而不是他们的用户名。这是我到目前为止,任何帮助将不胜感激。
public partial class RequestInfo
{
public int RequestInfoId { get; set; }
public string RequestByUserADId { get; set; }
public System.DateTime RequestDateTime { get; set; }
public string Explanation { get; set; }
public virtual UserInfo UserInfo { get; set; } // where I define my custom roles
}
我可以使用下面的代码查询AD。我尝试了Get Active Directory User Information With Windows Authentication in MVC 4,但没有帮助。
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
using (UserPrincipal user = UserPrincipal.FindByIdentity(context, requestByAdId))
{
return user.DisplayName
}
答案 0 :(得分:0)
我可能不在这里,因为我不确定您是否能够成功建立用户委托人,但如果您拥有用户委托人,则可以获得以下属性信息:
user.GetProperty("propertyName")
这是一个静态方法,可以让你为用户提供部门,例如。
public static String GetDepartment(UserPrincipal principal)
{
return principal.GetProperty("department");
}
让我知道这会给你带来什么,如果这不起作用,我可以进一步详细说明。
修改强>
看起来您需要更深层次才能获得默认情况下不属于用户主体的字段。为此,您需要首先从用户主体获取目录条目:
DirectoryEntry directoryEntry = (userPrincipal.GetUnderlyingObject() as DirectoryEntry);
然后,您需要检查您要查找的属性是否存在,如果存在,请获取该值。执行此操作的一种好方法是创建一个帮助方法,将目录条目传递给您,以及要获取的属性名称的字符串值。
public string GetProperty(DirectoryEntry directoryEntry, string propertyName)
{
if (directoryEntry.Properties.Contains(propertyName))
{
return directoryEntry.Properties[propertyName][0].ToString();
}
else
{
return string.Empty;
}
}
请注意,转到底层对象非常昂贵。我相信默认情况下会为您缓存此操作,因此可以从缓存中检索此信息的后续使用。玩弄
directoryEntry.RefreshCache
会让你开始。
请告诉我这是否适合您!