[C#] Inloggen met AD

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
Ik heb een applicatie gemaakt, maar voor de beveiliging wil ik zorgen dat alleen de gebruikers uit de AD van mijn werk kunnen inloggen. Hier heb naar zitten googlen. Het resultaat is dit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        private string _path;
        private string _filterAttribute;    
 
        public void LdapAuthentication(string path)
        {
            _path = path;
        }

        public bool IsAuthenticated(string domain, string username, string password)
        {
            string domainAndUsername = domain + @"\" + username;
            DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, password);

            try
            {
                //Bind to the native AdsObject to force authentication.         
                object obj = entry.NativeObject;

                DirectorySearcher search = new DirectorySearcher(entry);

                search.Filter = "(SAMAccountName=" + username + ")";
                search.PropertiesToLoad.Add("cn");
                SearchResult result = search.FindOne();

                if (null == result)
                {
                    return false;
                }

                //Update the new path to the user in the directory.
                _path = result.Path;
                _filterAttribute = (string)result.Properties["cn"][0];
            }
            catch (Exception ex)
            {
                throw new Exception("Error authenticating user. " + ex.Message);
            }

            return true;
        }


Zodra ik probeer in te loggen komt er een fout uitrollen:
Error authenticating user. (This domain can not be found or can not be contacted.(vertaald uit het Noors))

Als ik probeer om de waarde van user vast te zetten, zodat ik zeker weet dat die goed is krijg ik de zelfde fout.

C#:
1
      string domainAndUsername = domain + @"\" + "Example";


Ik heb geen idee waar het fout gaat, hulp is welkom...

[ Voor 0% gewijzigd door martijn00 op 17-07-2009 21:11 . Reden: Code fout er uit gehaald ]


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Al eens geprobeerd via ldap?

C#:
1
new DirectoryEntry("LDAP://DC=example,DC=local");

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-09 20:25

TeeDee

CQB 241

Wordt de DOMAIN string goed opgebouwd? Is de tbUsername een TextBox? Zo ja, doe dan eens tbUsername.Text.

Hoe debug je, want die informatie is ook wel handig.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
TeeDee schreef op donderdag 16 juli 2009 @ 23:16:
Wordt de DOMAIN string goed opgebouwd? Is de tbUsername een TextBox? Zo ja, doe dan eens tbUsername.Text.

Hoe debug je, want die informatie is ook wel handig.
Ik debug door een rode punt aan het begin van de function te zetten. Dan doorloop ik alles door op F10 te drukkken.

Dat van die textbox kan ik proberen maar zoals ik al aangeef lukt het ook niet als ik handmatig de value "username" zet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
martijn00 schreef op vrijdag 17 juli 2009 @ 01:29:
Ik debug door een rode punt aan het begin van de function te zetten. Dan doorloop ik alles door op F10 te drukkken.
En je controleert ook de waardes? Want, correct me if I'm wrong, de tbUsername.ToString() zal volgens mij iets als "System.Windows.Forms.TextBox Text: blaat" geven ofzo. Je wil tbUsername.Text hebben; en dan hoef je ook geen vage .ToString() call te maken for-the-sake-of-it-compiling.

Debuggen is méér dan kijken of 'ie van regel 11 naar 12 gaat; je moet ook kijken of 'ie doet wat je bedoelde te doen.

Daarbij is het nogal nutteloos om een "username" parameter in je functie te hebben en dan tbUsername te gebruiken ;)
martijn00 schreef op donderdag 16 juli 2009 @ 21:28:
Als ik probeer om de waarde van user vast te zetten, zodat ik zeker weet dat die goed is krijg ik de zelfde fout.

C#:
1
      string domainAndUsername = domain + @"\" + "Example";


Ik heb geen idee waar het fout gaat, hulp is welkom...
Again: debuggen is meer dan regel voor regel door je code stappen; je moet ook controleren of de waardes die je verwacht te zien daadwerkelijk in domainAndUsername zitten. Geef je bijvoorbeeld wel de domain parameter door aan de functie? En waarom dan niet de username maar via de textbox?

Debuggen: Hoe doe ik dat?

[ Voor 51% gewijzigd door RobIII op 17-07-2009 01:53 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Betreft het een website of desktop applicatie? In beide gevallen zijn er (naar mijn mening) betere oplossingen. Bij een desktop applicatie kun je gebruik maken van de Environment.UserDomainName om te controleren of de gebruiker in het juiste domein zit.

In het geval van een ASP.NET website kun je zelfs gebruik maken ActiveDirectoryMembershipProvider.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
RobIII schreef op vrijdag 17 juli 2009 @ 01:44:
[...]

En je controleert ook de waardes? Want, correct me if I'm wrong, de tbUsername.ToString() zal volgens mij iets als "System.Windows.Forms.TextBox Text: blaat" geven ofzo. Je wil tbUsername.Text hebben; en dan hoef je ook geen vage .ToString() call te maken for-the-sake-of-it-compiling.
Je hebt gelijk, maar zoals ik al hiervoor heb gezegt ik krijg de error ook als ik de value handmatig invul.
Again: debuggen is meer dan regel voor regel door je code stappen; je moet ook controleren of de waardes die je verwacht te zien daadwerkelijk in domainAndUsername zitten. Geef je bijvoorbeeld wel de domain parameter door aan de functie? En waarom dan niet de username maar via de textbox?

Debuggen: Hoe doe ik dat?
Ik controleer wel de values, dus ik dacht ook dat het niet klopte daarom gebruikte ik ook om te proberen een value handmatig. Dus inplaats van "tbUsername.Text", "martijn00"
Niemand_Anders schreef op vrijdag 17 juli 2009 @ 09:07:
Betreft het een website of desktop applicatie? In beide gevallen zijn er (naar mijn mening) betere oplossingen. Bij een desktop applicatie kun je gebruik maken van de Environment.UserDomainName om te controleren of de gebruiker in het juiste domein zit.

In het geval van een ASP.NET website kun je zelfs gebruik maken ActiveDirectoryMembershipProvider.
Het betreft een dekstop app. Ik gebruik ook Environment.UserDomainName om te zien of het domain klopt, maar ik wil dat een gebruiker zich inlogt. Ik heb dus 2 Textboxs, 1 username en 1 password. Die moeten worden ingevuld en aan de hand van AD worden gecontroleerd. Zodra die zegt dat het goed is kan je het programma gebruiken.

Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-09 20:25

TeeDee

CQB 241

En klopt de waarde van je domain nu? Puur afgaande op error melding niet namelijk.

[ Voor 38% gewijzigd door TeeDee op 17-07-2009 16:08 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
martijn00 schreef op vrijdag 17 juli 2009 @ 16:06:
Het betreft een dekstop app. Ik gebruik ook Environment.UserDomainName om te zien of het domain klopt, maar ik wil dat een gebruiker zich inlogt. Ik heb dus 2 Textboxs, 1 username en 1 password. Die moeten worden ingevuld en aan de hand van AD worden gecontroleerd. Zodra die zegt dat het goed is kan je het programma gebruiken.
Als Environment.UserDomainName is gevuld IS de gebruiker toch al ingelogd? Waarom zou je dan nog eens om diezelfde gegevens willen gaan vragen?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
TeeDee schreef op vrijdag 17 juli 2009 @ 16:08:
En klopt de waarde van je domain nu? Puur afgaande op error melding niet namelijk.
Mijn Domain klopt nu wel.
RobIII schreef op vrijdag 17 juli 2009 @ 16:08:
[...]

Als Environment.UserDomainName is gevuld IS de gebruiker toch al ingelogd? Waarom zou je dan nog eens om diezelfde gegevens willen gaan vragen?
Omdat als ik op de pc van iemand anders aan het werk ben, ik nog steeds moet inloggen in het programma met mijn eigen user zodat iemand niet te veel rechten in de app krijgt.

Acties:
  • 0 Henk 'm!

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
eek schreef op donderdag 16 juli 2009 @ 22:46:
Al eens geprobeerd via ldap?

C#:
1
new DirectoryEntry("LDAP://DC=example,DC=local");
En let er op dat de LDAP met hoofdletters wordt geschreven. Heeft mij al eens wat tijd gekost.

Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
eek schreef op donderdag 16 juli 2009 @ 22:46:
Al eens geprobeerd via ldap?

C#:
1
new DirectoryEntry("LDAP://DC=example,DC=local");
PolarBear schreef op vrijdag 17 juli 2009 @ 20:11:
[...]

En let er op dat de LDAP met hoofdletters wordt geschreven. Heeft mij al eens wat tijd gekost.
Wat bedoel je met geprobeerd met LDAP? Kan ik daarmee een user laten inloggen?

Als ik in de code die ik nu heb stap voor stap bekijk welke waardes er overal uitkomen valt mij dit op.

De waarde hiervan: DirectoryEntry entry = new DirectoryEntry(_pa......
Staat op: {System.DirectoryServices.DirectoryEntry}
Daar zou waarschijnlijk wat anders moeten staan denk ik.

Ik vraag me af of ik hier een waarde moet geven aan "path"
C#:
1
public void LdapAuthentication(string path)


Deze is nu gewoon leeg. Zou ik bijv. moeten zeggen:

C#:
1
private string _path = "weetikveel";

Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Ik had het eerste stuk van je functie niet eens gezien. Ik zou wel iets instellen voor dat path, maar misschien werkt het ook als het leeg is.

C#:
1
object.LdapAuthentication("LDAP://DC=domain,DC=extension");


Misschien moet je trouwens je domain nog naar uppercase veranderen
C#:
1
domain = domain.ToUpperInvariant()

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
eek schreef op maandag 20 juli 2009 @ 18:52:
Ik had het eerste stuk van je functie niet eens gezien. Ik zou wel iets instellen voor dat path, maar misschien werkt het ook als het leeg is.

C#:
1
object.LdapAuthentication("LDAP://DC=domain,DC=extension");


Misschien moet je trouwens je domain nog naar uppercase veranderen
C#:
1
domain = domain.ToUpperInvariant()
Wat bedoel je met de eerste regel code. Die gaat namelijk nergens over.

Met debuggen krijg ik gewoon een domain in uppercase.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

martijn00 schreef op vrijdag 17 juli 2009 @ 01:29:
[...]

Ik debug door een rode punt aan het begin van de function te zetten.
Zo'n ding heet een 'breakpoint', praat wat makkelijker ;)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 21-08 17:09
martijn00 schreef op vrijdag 17 juli 2009 @ 01:29:
Ik debug door een rode punt aan het begin van de function te zetten. Dan doorloop ik alles door op F10 te drukkken.
FYI: dat heet een breakpoint ;) In mijn eclipse omgeving zijn die bijvoorbeeld blauw ;)

Edit: ik moet gewoon eens een heel topic lezen voor ik reageer :(

[ Voor 9% gewijzigd door Hydra op 22-07-2009 11:28 ]

https://niels.nu


Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 13-09 16:11
Het is gelukt, dit is de code die ik heb gebruikt.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        internal Boolean ValidateUserDetailsAD(string username, string password)
        {
            Boolean returnValue = false;
            string dn = string.Empty;
            string domainAndUsername = string.Empty;
            try
            {
                dn = "DC=Domain,DC=local";
                DirectoryEntry entry = null;
                entry = new DirectoryEntry("LDAP://" + dn, username, password);
                Object obj = entry.NativeObject;
                DirectorySearcher search = new DirectorySearcher(entry);
                search.Filter = "(SAMAccountName=" + username + ")";
                search.PropertiesToLoad.Add("cn");
                SearchResult result = search.FindOne();
                if (result != null)
                {
                    returnValue = true;
                }
                entry.Close();
            }
            catch (Exception ex)
            {
                   MessageBox.Show(ex.Tostring());
            }
            return returnValue;
        }


Kan slotje op topic...

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Een slotje is niet nodig op een topic als je je oplossing hebt. Zie daarvoor ook onze faq betreffende topiceinde.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1