为MVC Intranet应用程序收集Active Directory数据

时间:2014-01-27 17:33:51

标签: asp.net-mvc-4 active-directory directoryservices

我需要协助根据数据库中的表收集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
        }

1 个答案:

答案 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

会让你开始。

请告诉我这是否适合您!