【问题标题】:Gathering Active Directory Data for MVC intranet application为 MVC Intranet 应用程序收集 Active Directory 数据
【发布时间】:2014-01-27 17:33:50
【问题描述】:

在根据我的数据库中的表收集 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
        }

【问题讨论】:

  • 你有他们的活动目录用户名,如果你做了 UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domain, "youruser");它会让你获得用户主体?
  • 是的。我在我的设备上对其进行了测试,我可以看到诸如 DisplayName、EmailAddress 之类的字段。它返回正确的值

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


【解决方案1】:

我可能会离开这里,因为我不确定您是否能够成功建立用户主体,但如果您拥有用户主体,您可以获得如下属性信息:

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

将帮助您开始。

如果这对你有用,请告诉我!

【讨论】:

  • 我没有看到部门,但我看到了 EmployeeId、GivenName、LastLogon 等...我使用 GetProperties() 打印出了所有属性,并且有一堆。
  • 仍在努力让我的请求实体加入每个用户主体,以便我可以提取他们的姓名和电子邮件地址。因此,当我创建一个 LINQ 语句时,我可以将显示名称作为我的视图模型的一部分。我不确定我需要进入目录。我现在只需要 DisplayName 和 EmailAddress
  • 所以正如您所提到的,潜入目录可能会很昂贵。我决定在他们创建请求时获取 UserPrincipal 信息并将我需要的内容存储在我的数据库中,因为我只需要他们的姓名和电子邮件。我认为这会比每次查询 UserPrincipal 更便宜。你同意这种方法吗?
  • 我完全同意。采用这种方法绝对没有错。获取用户主体并不是很昂贵。确保考虑用户何时更改其信息。在他们登录时进行检查以确保数据没有更改可能不会太昂贵。如果您不需要实时更新信息,那么您可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多