.net mvc与Active Directory集成并使用数据模型访问System.DirectoryServices.AccountManagement

Ste*_*hen 2 asp.net-mvc active-directory

我正在构建一个Intranet应用程序,我正在使用Windows身份验证.我有这个设置和工作,我能够通过@ Context.User.Identity.Name查看当前用户的用户名

我想查询Active Directory以检索显示名称,电子邮件地址等.

我查看了System.DirectoryServices.AccountManagement并从中创建了一个基本示例.我不清楚如何在整个应用程序中显示这些信息.

我到目前为止的内容如下:

public class searchAD
{

    // Establish Domain Context
    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain);

    public searchAD()
    {
        // find the user 
        UserPrincipal user = UserPrincipal.FindByIdentity(domainContext, HttpContext.Current.User.Identity.Name);

        if (user != null)
        {
            var userGuid = user.Guid;
            var DisplayName = user.DisplayName;
            var GivenName = user.GivenName;
            var EmailAddress = user.EmailAddress;
        } 

    }

}
Run Code Online (Sandbox Code Playgroud)

我假设我需要像这样创建一个ViewModel?

public class domainContext
{
    public Nullable<Guid> userGuid { get; set; }
    public string DisplayName { get; set; }
    public string GivenName { get; set; }
    public string EmailAddress { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在应用程序的各个部分中访问此信息.

我没有得到任何错误似乎错过了将所有这些联系在一起的东西.

bit*_*fly 5

你错过了windows身份部分.另外,请记住丢弃您正在使用的任何AD对象:

public class AdLookup
{
    public static DomainContext GetUserDetails()
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
        {
            IPrincipal principal = HttpContext.Current.User;
            WindowsIdentity identity = ((WindowsIdentity)principal.Identity);
            UserPrincipal user = UserPrincipal.FindByIdentity(pc, identity.Name);

            if (principal != null)
            {
                return new DomainContext() {
                    userGuid = user.Guid,
                    DisplayName = user.DisplayName,
                    GivenName = user.GivenName,
                    EmailAddress = user.EmailAddress
                };
            }
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

最好的办法是你可以访问你的应用程序中的每个人是创建一个名为'BaseController'的类,所有其他控制器都继承自该类,并将此代码放在那里(理想情况下称为DomainContext属性).

要在整个应用程序中使用它,您还可以在基本控制器上添加一个方法,以将此信息添加到ViewData:

protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
    base.OnActionExecuted(filterContext);
    ViewData["BaseController_DomainContext"] = AdLookup.GetUserDetails();
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令在从任何继承控制器呈现的任何视图上访问此项:

@{
    DomainContext domainContext = (DomainContext)ViewData["BaseController_DomainContext"];
}

Welcome back: @domainContext.DisplayName
Run Code Online (Sandbox Code Playgroud)

当然,你会遇到null的问题,但你可以在你的GetUserDetails方法中使用某种虚拟的DomainContext来处理它.

这只是一种方法,或者您可以创建一个基本视图模型,所有视图模型都可以继承并直接在视图中访问它们,但我发现这种方式更简单,因为您不添加任何复杂性到您的视图模型.