C# 如何在ASP.NET Core中获取Active Directory当前用户显示名?

C# 如何在ASP.NET Core中获取Active Directory当前用户显示名?,c#,active-directory,asp.net-core-mvc,C#,Active Directory,Asp.net Core Mvc,我使用的是C#ASP.NET内核(mvc6)与prem Active Directory上的设置相对应。我可以通过以下方式获得当前用户的用户名 public MyModel(IHttpContextAccessor httpContextAccessor) { string userName = httpContextAccessor.HttpContext.User.Identity.Name; } 这给了我“DOMAIN\jsmith”,但是,我需要获得显示名,即“John Smi

我使用的是
C#ASP.NET内核(mvc6)
与prem Active Directory上的
设置相对应。我可以通过以下方式获得当前用户的
用户名

public MyModel(IHttpContextAccessor httpContextAccessor)
{
    string userName = httpContextAccessor.HttpContext.User.Identity.Name;
}
这给了我“DOMAIN\jsmith”,但是,我需要获得
显示名,即“John Smith”。我该怎么做


更新:进一步挖掘后,这似乎当前不可用:

您需要创建到Active Directory的连接,通过其sAMAccountName属性查找用户并查询其displayName属性

var domain = httpContextAccessor.HttpContext.User.Identity.Name.Split('\\').First();
var accountName = httpContextAccessor.HttpContext.User.Identity.Name.Split('\\').Last();

using (var entry = new DirectoryEntry($"LDAP://{domain}"))
{
    using (var searcher = new DirectorySearcher(entry))
    {
        searcher.Filter = $"(sAMAccountName={name})";
        searcher.PropertiesToLoad.Add("displayName");
        var searchResult = searcher.FindOne();

        if (searchResult != null && searchResult.Properties.Contains("displayName"))
        {
            var displayName = searchResult.Properties["displayName"][0];
        }
        else
        {
            // user not found
        }
    }
}

Novell ldap库已升级到.NET Core。由于显示名称是一个示例,您应该能够使用库来查询它(尽管没有具体的示例)

也有同样的问题。经过一些研究和浏览微软文档,我找到了解决方案

首先使用Nuget软件包管理器安装System.DirectoryServices.AccountManagement软件包

然后,在调用GetUserNameWithoutDomain方法时,将以下内容作为参数传递:

GetUserNameWithoutDomain(UserPrincipal.Current.GivenName,UserPrincipal.Current.name);

这是与ASP.NET核心(MVC 6)
兼容的吗?除非我使用了错误的软件包,
DirectoryEntry
使用中不起作用,因为它没有实现
IDisposable
,我甚至找不到与
ASP.NET核心
兼容的
DirectorySearcher
的参考。很抱歉,完全错过了这一点。我想您只是在项目中包含System.DirectoryServices dll。但事实并非如此。请看一看。如果这没有帮助,一个极端的方法是将代码移动到一个单独的进程,然后启动进程并通过file\process default output redirection\IPC等(ASP.NET core支持哪种方法)获得结果。不,core中不存在这些名称空间。然而。@oldovets(或任何其他人)不幸的是,在Core 1.1中,他们回到了.csproj文件,显然你不能再简单地引用GAC LIB了。如果你安装System.DirectoryServices Nuget包,这是可行的。你可以ws-federate与一个身份提供程序,比如ADFS或身份服务器,它可以返回你的声明,包括显示名称。