it-swarm.com.de

ASP.NET Core 2.0 LDAP Active Directory-Authentifizierung

Ich habe viele Informationen aus der Vergangenheit gefunden, die besagen, dass LDAP-Authentifizierung ist noch nicht aktiviert, aber Sie können dies mit Paketen von Drittanbietern umgehen. Es scheint jedoch, dass die LDAP-Authentifizierung implementiert) war im Januar . Ich kann anscheinend keine Informationen darüber finden, wie dies implementiert werden kann.

Ich habe bereits benutzerdefinierte Authentifizierung in meinem Projekt eingerichtet, ich brauche nur die Logik, um die HandleAuthenticateAsync -Methode auszufüllen.

Ich habe versucht, andere Beispiele zu verwenden, aber sie scheinen nicht mit .NET Core 2.0 zu funktionieren.

Hier ist der einzige relevante Code, über den ich verfügen kann

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."));
}

Meine Frage lautet also: Wie implementiere ich die LDAP-Authentifizierung in .NET Core 2.0?

28
Window

Dank Wins Answer für den Hinweis, dass ich Windows Compatibility Pack verwenden musste, konnte ich dies herausfinden.

Als erstes musste ich das Nuget-Paket installieren

Install-Package Microsoft.Windows.Compatibility 

Zu der Zeit brauchte ich eine Vorschau-Version, also habe ich am Ende dieses Befehls -Version 2.0.0-preview1-26216-02 Angehängt

Fügen Sie dann using-Anweisungen für System.DirectoryServices Und System.DirectoryServices.AccountManagement Hinzu.

Dann schließen Sie diese Logik einfach an meine HandleAuthenticateAsync -Methode an:

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

Laut # 2089 ist es nur im Windows Compatibility-Pack für .NET Core verfügbar. Ich verwende derzeit 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;
}

Für die Authentifizierung und Autorisierung können wir Cookie Authentication Middleware mit Ansprüchen verwenden.

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
   });
}

Da es nur wenige bewegliche Teile enthält, habe ich bei GitHub ein funktionierendes Beispielprojekt erstellt. Es gibt zwei Hauptteile - LdapAuthenticationService und SignInManager .

22
Win