2016-10-10 52 views
1

我正在使用C# ASP.NET Core (MVC 6)而不是on-prem Active Directory设置。我可以简单地通过如何获取Active Directory当前用户在ASP.NET Core中显示名称?

public MyModel(IHttpContextAccessor httpContextAccessor) 
{ 
    string userName = httpContextAccessor.HttpContext.User.Identity.Name; 
} 

这给了我“DOMAIN \ JSMITH”不过,我需要在Display Name,即“约翰·史密斯”获取当前用户的username。我该怎么做呢?

更新:更多挖后,这似乎并没有被当前可用:https://github.com/dotnet/corefx/issues/2089

+0

您可以使用身份提供程序(如ADFS或Identity Server)进行ws联合身份验证,该身份提供程序可以返回您的声明包括显示名称。 –

回答

4

Novell的LDAP库已经ported到.NET的核心。由于显示名称是attribute,您应该可以使用该库来查询它(尽管没有具体示例)

-1

您需要创建到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 
     } 
    } 
} 
+0

这是'ASP.NET Core(MVC 6)'兼容?除非我使用错误的包,否则'DirectoryEntry'在'using'中不起作用,因为它没有实现'IDisposible',我甚至都找不到'ASP.NET Core'兼容的DirectorySearcher参考。 –

+0

对不起,完全错过了。以为你只需在你的项目中包含System.DirectoryServices DLL。但这不是它的工作原理。请看看http://stackoverflow.com/questions/36048910/problems-with-directory-services-and-account-management-in-asp-net-core。如果这没有帮助,一种极端的方法是将代码移动到单独的进程,然后启动进程并通过文件\进程默认输出重定向\ IPC等获得结果(在ASP.NET核心中支持哪种方法) – oldovets

+0

Core中不存在这些名称空间。然而。 – blowdart

相关问题