在 ASP.NET Core 中使用 DirectoryServices

问题描述 投票:0回答:6

我正在将 ASP.NET Core RC1 应用程序升级到 RC2。我在一些 *.cs 文件中引用了

System.DirectoryServices
System.DirectoryServices.AccountManagement
,以便我可以查询 LDAP。但我不知道如何在 RC2 的
Project.json
文件中添加对它的引用。我尝试的一切只会给我带来更多错误。如有任何帮助,我们将不胜感激。

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true
  },

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702",
      "type": "default"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Mvc.TagHelpers": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-final",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview1-final",
    "Microsoft.EntityFrameworkCore": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.0-rc2-final",
    "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview1-final",
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-rc2-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final",
    "Newtonsoft.Json": "8.0.3",
    "Microsoft.Extensions.Logging": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc2-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc2-final",
    "System.Linq": "4.0.1-beta-23516",
    "System.Linq.Queryable": "4.0.1-beta-23516"
  },

  "tools": {
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    },
    "Microsoft.Extensions.SecretManager.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": "portable-net45+win8+dnxcore50"
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview1-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  }
}
c# asp.net-core active-directory ldap
6个回答
27
投票

只想说,他们刚刚发布了

Microsoft.Windows.Compatibility
的预发行版,其中包含使用 Active Directory 工作目录所需的
System.DirectoryServices
组件。它是测试版,但终于发布了。


21
投票

您可以从

https://www.nuget.org/packages/System.DirectoryServices.AccountManagement
System.DirectoryServices.AccountManagement 作为 NuGet 包安装在 .NET Core 应用程序中。安装后,您可以创建一个简单的调用来验证 AD 用户,如下所示:

public static bool ValidateCredentials(string userName, string password)
{
    try 
    {
        using (var adContext = new PrincipalContext(ContextType.Domain, "YOUR_AD_DOMAIN"))
        {
            return adContext.ValidateCredentials(userName, password);
        }
    }
    catch(Exception ex) 
    {
        throw ex;
    }
}

7
投票

如果您只想在.NET Core 2.0中对用户进行身份验证,则只需添加System.DirectoryServices Nuget包(无需添加Microsoft.Windows.Compatibility nuget包)。 .NET Standard 2.0 也支持它

注意:我只在.NET Core 2.2中使用了以下代码,但nuget兼容性信息表明它可以在.NET Core 2.0中工作。

验证密码使用:

var domainAndUsername = domain + @"\" + username;
var entry = new DirectoryEntry(_path, domainAndUsername, pwd);

object isValidPassword = null;
try
{
     // authenticate (check password)
     isValidPassword = entry.NativeObject;
}
catch (Exception ex)
{
      _logger.Log.Debug($"LDAP Authentication Failed for {domainAndUsername}"); 
      return false;
}

此外,如果您想在目录中搜索用户,以下应该可以:

var search = new DirectorySearcher(entry) { Filter = "(SAMAccountName=" + username + ")" };
search.PropertiesToLoad.Add("cn");

var result = search.FindOne();

根据 Github Issue,LDAP 尚不支持 System.DirectoryServices.AccountManagement。除此之外,@zdub 和 @Bastyon 之前提供的信息似乎仍然有效。


5
投票

新的 CoreCLR 目前不支持该库。有一个关于此问题的开放 GitHub 问题,您可以在其中找到更多信息和讨论。 (如果您仅使用 AD 作为身份验证系统,则此处提供了一种解决方法。)

如果您只计划在 Windows 服务器上运行此应用程序,则可以将框架定位为“net452”,并在其下添加框架程序集。

"frameworks": {
  "net452": {
    "frameworkAssemblies": {
      "System.DirectoryServices": "4.0.0.0",
      "System.DirectoryServices.AccountManagement": "4.0.0.0"
    }
  }
},

4
投票

您可以使用 适用于 .NET Standard 1.3 的 LDAP 客户端库
兼容的 .NET 运行时:.NET Core、.NET Framework 4.6、...
它适用于任何 LDAP 协议兼容的目录服务器(包括 Microsoft Active Directory)。

private static bool LoginLdap(string username, string password)
{
    try
    {
        using (var conn = new LdapConnection())
        {
            conn.Connect("<LdapHost>", 389);
            conn.Bind(LdapConnection.Ldap_V3, $"<yourDomain>\\{username}", password);
        }
        return true;
    }
    catch (LdapException)
    {
        return false;
    }            
}

有关更多信息,请阅读本期:对 System.DirectoryServices 的支持
这对我来说效果很好。 (在 .NET Core 1.1.1 中)


4
投票

2021 年更新

现在每个人都在使用

System.DirectoryServices
Nuget https://www.nuget.org/packages/System.DirectoryServices/,它与 NET 标准兼容。

只是更新这个问题 b/c .NET Core 世界变化如此之快(请,MS,慢点)

© www.soinside.com 2019 - 2024. All rights reserved.