none
Formauthentifizierung automatisch (AD Login) asp mvc RRS feed

  • Frage

  • Hallo Zusammen

    Ich habe eine Frage zu automatisiertem Login.

    Ich habe ein Login, welches mit Formauthentifizierung über das Active Directory anmeldet.
    Das Ziel ist es jetzt aber, das im Intranet automatisch mit dem am Computer angemeldete Name "eingeloggt" wird.

    Sollte das Login nicht passen, soll das Eingabeformular kommen (Manuelle Eingabe)
    (So wie zB beim Outlook etc.)

    Ist sowas überhaupt möglich?

    PS. Formauthentifizierung funktioniert problem los (Manuelle Eingabe)

    Gruss Osti

    Montag, 24. August 2015 13:25

Antworten

  • Den kompletten Anmeldenamen inkl. Domain müsstest du über

    WindowsIdentity.GetCurrent().Name

    erhalten. Ob das immer funktioniert weiß ich nicht, ggf. kannst du auch .NETs AD Schnittstelle dafür nutzen.

    Je nachdem wie sicher es werden soll kann das schon reichen. Das Problem welches ich hierbei jedoch sehe ist, dass man die Anmeldung relativ leicht manipulieren kann.

    Auch wenn du die Anwendung nicht als Sicherheitskritisch empfindest, spätestens wenn Benutzerbezogene Daten ins Spiel kommen sind sie es.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Osti89 Dienstag, 25. August 2015 14:13
    Montag, 24. August 2015 18:22
    Moderator
  • So ich habe es jetzt noch gut hingekriegt.

    Gemacht habe ich es mit dem UserPrinciple und GroupPrinciple Klasse

    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,"mydomain.local");
                    UserPrincipal user = new UserPrincipal(domainContext);
                    
                    //Filter           
                    user.EmailAddress = string.Format(@"{0}@mydomain.ch", userName);
    
                    PrincipalSearcher searcher = new PrincipalSearcher();
                    searcher.QueryFilter = user;
    
                    PrincipalSearchResult<Principal> results = searcher.FindAll();
    
                    if (CheckPermission(results.ToList().First())) {
                        return true;
                    }


    und für die Gruppenzugehörigkeit (aufgerufen durch CheckPermission)

    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "mydomain.local"); GroupPrincipal group = new GroupPrincipal(domainContext); group.Name = "G_CH_DL_InfoScreen"; PrincipalSearcher searcher = new PrincipalSearcher(); searcher.QueryFilter = group; PrincipalSearchResult<Principal> results = searcher.FindAll(); if (results.ToList().Count == 0) { return false; } if (user.IsMemberOf((GroupPrincipal)results.ToList().First())) { return true; }

    Im erstenteil schaue ich, ob es den Benutzer gibt.

    Im zweiten Teil, frage ich ab ob dieser zu einer bestimmten Gruppe gehört.


    • Bearbeitet Osti89 Dienstag, 25. August 2015 14:13
    • Als Antwort markiert Osti89 Dienstag, 25. August 2015 14:13
    Dienstag, 25. August 2015 14:12

Alle Antworten

  • Hallo,

    also den Benutzernamen kannst du von deinem Programm aus noch auslesen, beim Passwort funktioniert das aber nicht mehr. Die Environment.UserName-Eigenschaft hält den Benutzernamen bereit. Das müsstest du also mindestens einmal abfragen, wobei es eventuell eine Sicherheitslücke darstellt es abzuspeichern.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 24. August 2015 13:47
    Moderator
  • Hallo Tom

    Vielen Dank für deine Antwort.

    Kann man auch die Domäne des Users auslesen?
    Dann könnte ich die Domäne vergleichen, den Benutzernamen abfragen (ob er existiert) und ob er zu einer bestimmten Gruppe angehört. Dann bräuchte ich das Passwort nicht, oder?

    Sicherheitstechnisch ist es nicht so relevant, weil das ganze nur im Intranet stattfindet und die Webapplikation keine kritische Daten handhabt.

    Montag, 24. August 2015 17:25
  • Den kompletten Anmeldenamen inkl. Domain müsstest du über

    WindowsIdentity.GetCurrent().Name

    erhalten. Ob das immer funktioniert weiß ich nicht, ggf. kannst du auch .NETs AD Schnittstelle dafür nutzen.

    Je nachdem wie sicher es werden soll kann das schon reichen. Das Problem welches ich hierbei jedoch sehe ist, dass man die Anmeldung relativ leicht manipulieren kann.

    Auch wenn du die Anwendung nicht als Sicherheitskritisch empfindest, spätestens wenn Benutzerbezogene Daten ins Spiel kommen sind sie es.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Osti89 Dienstag, 25. August 2015 14:13
    Montag, 24. August 2015 18:22
    Moderator
  • Also das auslesen funktioniert wunderbar. Ich möchte jetzt im AD nachfragen ob es diesen User gibt.

    private MembershipUser ValidateUser(string userName) {            
                int matches = 0;
                var users = Membership.FindUsersByName(userName, 0, 1, out matches);
                if (matches == 1) {
                    return users[userName];
                }
                return null;
            }

    bei FindUsersByName, kommt eine NotSupportet exception(The Active Directory membership provider has not been configured to support search methods.)

    Was wäre den die .net AD Schnittstelle? Also Namespace?

    Dienstag, 25. August 2015 09:36
  • So ich habe es jetzt noch gut hingekriegt.

    Gemacht habe ich es mit dem UserPrinciple und GroupPrinciple Klasse

    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,"mydomain.local");
                    UserPrincipal user = new UserPrincipal(domainContext);
                    
                    //Filter           
                    user.EmailAddress = string.Format(@"{0}@mydomain.ch", userName);
    
                    PrincipalSearcher searcher = new PrincipalSearcher();
                    searcher.QueryFilter = user;
    
                    PrincipalSearchResult<Principal> results = searcher.FindAll();
    
                    if (CheckPermission(results.ToList().First())) {
                        return true;
                    }


    und für die Gruppenzugehörigkeit (aufgerufen durch CheckPermission)

    PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "mydomain.local"); GroupPrincipal group = new GroupPrincipal(domainContext); group.Name = "G_CH_DL_InfoScreen"; PrincipalSearcher searcher = new PrincipalSearcher(); searcher.QueryFilter = group; PrincipalSearchResult<Principal> results = searcher.FindAll(); if (results.ToList().Count == 0) { return false; } if (user.IsMemberOf((GroupPrincipal)results.ToList().First())) { return true; }

    Im erstenteil schaue ich, ob es den Benutzer gibt.

    Im zweiten Teil, frage ich ab ob dieser zu einer bestimmten Gruppe gehört.


    • Bearbeitet Osti89 Dienstag, 25. August 2015 14:13
    • Als Antwort markiert Osti89 Dienstag, 25. August 2015 14:13
    Dienstag, 25. August 2015 14:12