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

标签 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;
        } 

    }

}

我假设我需要像这样创建一个 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; }
}

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

我没有收到任何错误,只是似乎缺少将所有这些联系在一起的东西。

最佳答案

您缺少 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;
    }
}

为了让应用程序中的每个人都可以访问此内容,最好的办法是创建一个名为“BaseController”的类,所有其他 Controller 都继承该类,并将此代码放在那里(最好作为名为 DomainContext 的属性)。

要在整个应用程序中使用此功能,您还可以在基本 Controller 上添加一个方法来将此信息添加到 ViewData:

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

然后,您可以使用以下方法在从此任何继承 Controller 呈现的任何 View 上访问它:

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

Welcome back: @domainContext.DisplayName

当然,您会遇到 null 问题,但您可以在 GetUserDetails 方法中使用某种虚拟 DomainContext 来处理该问题。

这只是实现此目的的一种方法,或者您可以创建一个所有 View 模型继承的基本 View 模型,并直接在 View 中访问它们,但我发现这种方法更简单,因为您不需要为您的 View 模型添加任何复杂性。

关于asp.net-mvc - .net mvc 与 Active Directory 集成并使用数据模型访问 System.DirectoryServices.AccountManagement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295368/

相关文章:

active-directory - 将权限分配给组托管服务帐户

c# - 创建接受从参数类型(多态参数)派生的任何类型的参数的操作

asp.net-mvc - 在单个 View 中组织多个 ASP .Net MVC View 模型的最佳方式是什么?

ASP.NET MVC 和 httpRuntime 执行超时

c# - GroupPrincipal.Members.Remove() 不适用于大型 AD 组

active-directory - 如何使用 WinNT 协议(protocol)从 Active Directory 获取用户 GUID?

php - 从 PHP Web 应用程序根据 Azure Active Directory 对用户进行身份验证

asp.net-mvc - 将 ASP.NET Web API 应用程序配置为 ASP.NET MVC 应用程序下的虚拟目录

c# - 如何使用通用约束进行这种棘手的向下转换?

java - 如何在 Spring Boot 中从 Active Directory LDAP 服务器获取所有组用户?