webForumDet fria alternativet

Inloggning mot AD

.NET

12 svar · 474 visningar · startad av Brimba

Medlem sedan dec. 19995 874 inlägg
Frågan#1

Hej!

Hur kan ett enkelt exempel se ut för att hantera inloggning via AD?

Alltså om man exempelvis skriver ett användarnamn och lösenord i två inputboxar, så vill jag validera detta mot AD's databas och returnera om det är giltligt eller inte.

Medlem sedan juni 2002151 inlägg
#2

AD?

Medlem sedan juni 20011 732 inlägg
#3

AD = Active Directory

Du kan inte plocka ut lösenordet, däremot kan du få fram användarnamn (samaccountname) och alla andra fält från AD. Vi har precis byggt ett intranät med AD som grund för användarkonton, dock är det inte jag som har gjort kopplingarna mot AD. Jag återkommer när jag frågat de som VET. :)

Medlem sedan juni 20011 732 inlägg
#4

Kan detta ge några ledtrådar kanske? Titta närmare på detta namespace:

using System.DirectoryServices;

private DirectoryEntry myDirEnt;

public string Fullname{
  get{
    try{
      return myDirEnt.Properties["displayName"][0].ToString();
    }
    catch{
      return "";
    }
  }
}
Medlem sedan dec. 19995 874 inlägg
#5

NETwork skrev:

Du kan inte plocka ut lösenordet

Det måste väl för bövelen gå att göra en applikation som sköter authentiering via AD?

Medlem sedan maj 2001329 inlägg
#6

Tja,

Skulle föreslå att du använder dig av windowsinloggning. Denna använder sig automatiskt av AD och poppar upp en inloggnings ruta.

Sen om du vill plocka ut datan ifrån AD, dvs namn och sådant får du använda dig av DirectorySearcher för att få ut en DirectoryEntry och sedan tilla på NETworks exemple.

Däremot att skapa en helt egen inloggnigsgrej tror jag kan bli svårt. DEt går ju inte att se lösenordet och kontrollera mot detta. Jag har ej heller funnit någon inloggnings funktion på AD objectet.

Medlem sedan maj 2001329 inlägg
Medlem sedan dec. 19995 874 inlägg
#8

Ok, ponera att jag har använt mig av den inbyggda windowsinloggningsfunktionen, då vill jag bara veta hur jag får tag i den användare som för tillfället är inloggad :)

Medlem sedan maj 2001329 inlägg
#9
string samAccountName = "minAnvändaresInlogg";

DirectoryEntry myDirEnt = new DirectoryEntry(LDAP://DC=corp,DC=microsoft,DC=com); //pathen till root objectet i ADn
DirectorySearcher myDirSearch = new DirectorySearcher(myDirEnt, "(&(objectCategory=person)(objectClass=user(sAMAccountName="+ samAccountName +"))"); //leta efter vår användare
SearchResult myRes = myDirSearch.FindOne(); //hitta honom

myDirEnt = new DirectoryEntry(myRes.Path); //myDirEntry innehåller nu pathen till vår användare

string streetAddress = myDirEnt.Properties["streetAddress"][0].ToString(); //läser ut exempelvis gatuadressen

Något i den stilen skulle det kunna se ut.

Medlem sedan dec. 19995 874 inlägg
#10

Jo men hur hämtar jag användaren när man har loggat in via windowsinloggning?

'vill inte göra såhär!
string samAccountName = "minAnvändaresInlogg";

'såhär vill jag göra!
string samAccountName = ad.currentUser.ToString()
Medlem sedan maj 2001329 inlägg
#11

Ah, du menar så...

Kort sagt så får du ut användaren med User.Identity.Name, men sen måste du parsa ut SamAccountNamet.

tex:

try{
  int start = User.Identity.Name.IndexOf("\\")+1;
  int stop = User.Identity.Name.Length - start;
  if(User.Identity.Name.IndexOf("@") != -1){	//to ensure wierd loggons
    stop = User.Identity.Name.IndexOf("@") - start;
  }				}

  Session["thisPerson"] = new Person(User.Identity.Name.Substring(start, stop).Trim().ToLower(), true);
}
catch{}

Jag var lite lat och kopierade rakt ur vår kod. Vi var tvugna att göra en special test med @ för att se om användaren loggade in på sätter namn@domän istället för det mer vanliga domän\namn. Sen stoppar vi in samAccountNamet i vår klass Person. (som hanterar allt som rör AD personen)

Medlem sedan dec. 19995 874 inlägg
#12

Strålande :)

Medlem sedan maj 2001329 inlägg
#13

Hmm, detta kanske kan funka om nu vill ha egen gjorda loggin text boxes etc.

// Create a new instance of NetworkCredential using the client
// credentials.
NetworkCredential credentials = new
NetworkCredential("username","password","domain");

254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)