web-dev-qa-db-ja.com

ASP.NET CoreでDirectoryServicesを操作する

ASP.NET Core RC1アプリケーションをRC2にアップグレードしています。 LDAPに照会できるように、*。csファイルにSystem.DirectoryServicesおよびSystem.DirectoryServices.AccountManagementへの参照があります。しかし、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" ]
  }
}
10
BinaryNexus

現時点では、新しいCoreCLRはこのライブラリをサポートしていません。これについて GitHubの未解決の問題 があり、詳細な情報や議論を見つけることができます。 (認証システムにADのみを使用している場合は、回避策が提示されます。)

Windowsサーバーでこのアプリを実行することのみを計画している場合は、フレームワークの「net452」をターゲットにし、その下にフレームワークアセンブリを追加できます。

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

Active Directoryでディレクトリを操作するために必要なMicrosoft.Windows.Compatibilityコンポーネントを含むSystem.DirectoryServicesのプレリリース版を発行したばかりで、そのベータ版がついにリリースされたと言いたいだけです。

13
Bastyon

上記のBastyonsの回答に追加すると、System.DirectoryServices.AccountManagementhttps://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/4.5. から入手できるようになりました。

11
zdub

。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
Soren

.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によって提供された以前の情報はまだ有効のようです。

0
Adriaan de Beer