【问题标题】:Working with DirectoryServices in ASP.NET Core在 ASP.NET Core 中使用 DirectoryServices
【发布时间】:2016-05-19 17:54:04
【问题描述】:

我正在将我的 ASP.NET Core RC1 应用程序升级到 RC2。我在一些 *.cs 文件中引用了 System.DirectoryServicesSystem.DirectoryServices.AccountManagement,以便我可以查询 LDAP。但我不知道如何在Project.json 文件的RC2 中添加对它的引用。我尝试的一切只会给我更多的错误。任何帮助表示赞赏。

{
  "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" ]
  }
}

【问题讨论】:

  • 您是在身份验证系统中使用 AD 还是只是在查询 AD?

标签: c# asp.net-core active-directory ldap


【解决方案1】:

只想说他们刚刚发布了Microsoft.Windows.Compatibility 的预发布版本,其中包含使用活动目录工作目录所需的System.DirectoryServices 组件。它的测试版,但它终于出现了。

【讨论】:

    【解决方案2】:

    除了上面的 Bastyons 答案外,您还可以将 System.DirectoryServices.AccountManagement 作为来自 https://www.nuget.org/packages/System.DirectoryServices.AccountManagement/4.5.0-preview1-25914-04 的 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;
        }
    }
    

    更新:此软件包现已作为最终版本从https://www.nuget.org/packages/System.DirectoryServices.AccountManagement 获得

    【讨论】:

    • 一个有用的重载是using (var principalContext = new PrincipalContext(ContextType.Domain, "YOUR_AD_DOMAIN", "CN=Users,DC=AwesomeDepartment,DC=com"))
    【解决方案3】:

    如果你只想在 .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 之前提供的信息似乎仍然有效。

    【讨论】:

    • 仅通过引用 Microsoft.Windows.Compatibility,我就可以轻松地将现有的旧 .Net 框架 AD 身份验证代码移植到 .Net 标准代码,谢谢
    【解决方案4】:

    目前,新的 CoreCLR 不支持此库。有一个open GitHub issue 与此相关,您可以在其中找到更多信息和讨论。 (如果您仅将 AD 用于您的身份验证系统,则会提供一种解决方法。)

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

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

    【讨论】:

    • 感谢您提及我在该 GitHub 线程上发布的解决方法!它对我很有帮助。我本来打算建议读一下,但你打败了我。
    • @ClintB 哇,同一个 Clint B?感谢您发布它!我最终自己将它用于内部应用程序 - 为我省去了很多麻烦。
    • 酷!我很高兴它有帮助!!你对我的question有什么见解吗?
    • 这是否意味着我将不得不恢复我的所有依赖关系?他们都说他们在 4.5.2 版本中不起作用
    • @BinaryNexus 尝试删除您的第一个依赖元素 (Microsoft.NETCore.App),以及底部的两个 System 元素。
    【解决方案5】:

    您可以使用LDAP client library for .NET Standard 1.3
    兼容的 .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;
        }            
    }
    

    有关更多信息,请阅读此问题:Support for System.DirectoryServices
    这对我来说很有用。 (在 .NET Core 1.1.1 中)

    【讨论】:

    • 遗憾的是这个库缺乏分页支持
    【解决方案6】:

    2021 年更新

    现在每个人都在使用System.DirectoryServices Nuget https://www.nuget.org/packages/System.DirectoryServices/,它与 NET Standard 兼容。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2017-04-12
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      相关资源
      最近更新 更多