web-dev-qa-db-ja.com

ASP.NET Core 2.0 LDAP Active Directory認証

LDAP認証はまだ有効になっていないという過去の情報をたくさん見つけましたが、サードパーティのパッケージを使用してそれを回避できます。 1月にLDAP認証が実装されたようです。実装方法に関する情報を見つけることができないようです。

私はすでにプロジェクトに カスタム認証 を設定しています。HandleAuthenticateAsyncメソッドを埋めるためのロジックが必要です。

私は 他の例を使用してみました が、.NET Core 2.0では動作しないようです。

ここに私が持っている唯一の関連するコードがあります

protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
    // Get Authorization header value
    if (!Request.Headers.TryGetValue(HeaderNames.Authorization, out var authorization)) {
        return Task.FromResult(AuthenticateResult.Fail("Cannot read authorization header."));
    }

    // TODO: Authenticate user

    // Create authenticated user ticket
    var identities = new List<ClaimsIdentity> { new ClaimsIdentity("custom auth type") };
    var ticket = new AuthenticationTicket(new ClaimsPrincipal(identities), Options.Scheme);

    return Task.FromResult(AuthenticateResult.Success(ticket));

    // else User not authenticated
    return Task.FromResult(AuthenticateResult.Fail("Invalid auth key."));
}

したがって、私の質問は、.NET Core 2.0でLDAP認証をどのように実装するのですか?

28
Window

Winの Answer を使用して Windows Compatibility Pack を使用する必要があることを指摘してくれたおかげで、これを理解することができました。

私が最初にしなければならなかったのは、 Nugetパッケージ をインストールすることでした

Install-Package Microsoft.Windows.Compatibility 

当時、プレビュー版が必要だったので、このコマンドの最後に-Version 2.0.0-preview1-26216-02を追加しました

次に、System.DirectoryServicesおよびSystem.DirectoryServices.AccountManagementのusingステートメントを追加します

次に、このロジックをHandleAuthenticateAsyncメソッドにプラグインします。

const string LDAP_PATH = "EX://exldap.example.com:5555";
const string LDAP_DOMAIN = "exldap.example.com:5555";

using (var context = new PrincipalContext(ContextType.Domain, LDAP_DOMAIN, "service_acct_user", "service_acct_pswd")) {
    if (context.ValidateCredentials(username, password)) {
        using (var de = new DirectoryEntry(LDAP_PATH))
        using (var ds = new DirectorySearcher(de)) {
            // other logic to verify user has correct permissions

            // User authenticated and authorized
            var identities = new List<ClaimsIdentity> { new ClaimsIdentity("custom auth type") };
            var ticket = new AuthenticationTicket(new ClaimsPrincipal(identities), Options.Scheme);
            return Task.FromResult(AuthenticateResult.Success(ticket));
        }
    }
}

// User not authenticated
return Task.FromResult(AuthenticateResult.Fail("Invalid auth key."));
26
Window

#2089 によると、.NET CoreのWindows Compatibility-Packでのみ利用可能です。現在、Novell.Directory.Ldap.NETStandardを使用しています。

public bool ValidateUser(string domainName, string username, string password)
{
   string userDn = $"{username}@{domainName}";
   try
   {
      using (var connection = new LdapConnection {SecureSocketLayer = false})
      {
         connection.Connect(domainName, LdapConnection.DEFAULT_PORT);
         connection.Bind(userDn, password);
         if (connection.Bound)
            return true;
      }
   }
   catch (LdapException ex)
   {
      // Log exception
   }
   return false;
}

認証と承認の場合、クレームでCookie Authentication Middlewareを使用できます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
   ILoggerFactory loggerFactory)
{
   app.UseCookieAuthentication(new CookieAuthenticationOptions
   {                
      AuthenticationScheme = "AuthenticationScheme",
      LoginPath = new PathString("/Account/Login"),
      AccessDeniedPath = new PathString("/Common/AccessDenied"),
      AutomaticAuthenticate = true,
      AutomaticChallenge = true
   });
}

動く部分がほとんどないので、GitHubで実用的なサンプルプロジェクトを作成しました。 2つの主要な部分があります- LdapAuthenticationServiceSignInManager

22
Win