Ako overiť proti služby Active Directory pomocou overovanie formulárov a Visual C#.NET

Preklady článku Preklady článku
ID článku: 316748 - Zobraziť produkty, ktorých sa tento článok týka.
Tento článok odkazuje na nasledujúce Microsoft.NET Rámec triedy knižnica namespacey:
  • System.text
  • System.DirectoryServices
  • System.Security.principal
  • System.Web.Security
Rozbaliť všetko | Zbaliť všetko

Na tejto stránke

SUHRN

V tomto krokovom ukazuje, ako ASP.NET aplikácia môže použiť overovanie formulárov povoliť používateľom overenie proti služby Active Directory pomocou Lightweight Directory Access Protocol (LDAP). Po používateľa je overený a presmerované, môžete použiť Application_AuthenticateRequest metóda Global.asax súbor na uloženie GenericPrincipal objekt v HttpContext.User Vlastnosť, že toky v celom žiadosť.

Vytvoriť ASP.NET webovej aplikácii v Visual C#.NET

Postupujte podľa týchto krokov vytvorte nové ASP.NET Web aplikácie s názvom FormsAuthAd v Visual C#.NET:
  1. Spustiť Microsoft Visual Studio.NET.
  2. Na Súbor ponuku, ukážte na Nové, a potom kliknite na tlačidlo Projekt.
  3. Kliknite na tlačidlo Visual C# projekty podľa Projekt typy, a potom kliknite na tlačidlo ASP.NET webovú aplikáciu podľa Šablóny.
  4. V Umiestnenie rámček, nahradiť WebApplication1 s FormsAuthAd.
  5. Kliknite na tlačidlo ok.
  6. Kliknite pravým tlačidlom myši Odkazy uzol v roztoku Explorer a potom kliknite na Pridať odkaz.
  7. Na .NET kartu v Pridať odkaz dialógové okno, kliknite na tlačidlo System.DirectoryServices.dll, kliknite na tlačidlo Vyberte, a potom kliknite na tlačidlo ok.

Napísať overovací kód

Postupujte podľa týchto krokov vytvorte nový súbor triedy s názvom LdapAuthentication.cs:
  1. V roztoku Prieskumník kliknite pravým tlačidlom na projekt uzol, bod na Pridať, a potom kliknite na tlačidlo Doplniť nový bod.
  2. Kliknite na tlačidlo Trieda podľa Šablóny.
  3. Typ LdapAuthentication.cs v meno a potom kliknite na Otvorené.
  4. Nahradiť existujúci kód v súbore LdapAuthentication.cs s nasledujúcim kódom.
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        public bool IsAuthenticated(String domain, String username, String pwd)
        {
          String domainAndUsername = domain + @"\" + username;
          DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    			
          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;
         }
    
         public String GetGroups()
         {
           DirectorySearcher search = new DirectorySearcher(_path);
           search.Filter = "(cn=" + _filterAttribute + ")";
           search.PropertiesToLoad.Add("memberOf");
           StringBuilder groupNames = new StringBuilder();
    
           try
           {
             SearchResult result = search.FindOne();
    
    	 int propertyCount = result.Properties["memberOf"].Count;
    
       	 String dn;
    	 int equalsIndex, commaIndex;
    				
    	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
    	 {
    	   dn = (String)result.Properties["memberOf"][propertyCounter];
    
        	   equalsIndex = dn.IndexOf("=", 1);
    	   commaIndex = dn.IndexOf(",", 1);
    	   if(-1 == equalsIndex)
    	   {
    	     return null;
         	   }
    
               groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
    	   groupNames.Append("|");
    
        	 }
           }
           catch(Exception ex)
           {
             throw new Exception("Error obtaining group names. " + ex.Message);
           }			
           return groupNames.ToString();
         }
       }
    }
    					
Overovací kód akceptuje domény, meno používateľa, heslo a cestu do stromu služby Active Directory. Tento kód používa Poskytovateľa adresára LDAP.

Kód v Logon.aspx stránku hovory LdapAuthentication.IsAuthenticated metóda a prechádza v poverenia, ktoré zberajú z používateľ. Potom, DirectoryEntry objekt je vytvorený s cestou k adresárového stromu, používateľ meno a heslo. Meno používateľa musí byť vo formáte „doména\meno_používateľa". The DirectoryEntry objekt potom snaží prinútiť AdsObject záväzné získaním NativeObject Vlastnosť. Ak je toto podarí, KN atribút pre užívateľa je získaného vytvorením DirectorySearcher objekt a o filtrovanie na SAMAccountName. Po je overený užívateľ, IsAuthenticated metóda vracia pravda.

Získať zoznam skupín, do ktorej používateľ patrí, Tento kód vyzýva LdapAuthentication.GetGroups metóda. The LdapAuthentication.GetGroups metóda získa zoznam zabezpečenia a distribúcie skupiny používateľ patrí vytvorením DirectorySearcher objekt a tým filtrovanie podľa memberOf atribút. Táto metóda vráti zoznam skupín oddelené trubky (|).

Všimnite si, že LdapAuthentication.GetGroups metóda ovládanie poznať jazyk a skráti reťazce. Táto znižuje dĺžka reťazca, uložené v cookie overovania. Ak reťazec nie je zobrazí skrátený, formát každá skupina sa takto.
CN=...,...,DC=domain,DC=com
				
Toto môžete vytvoriť veľmi dlhých reťazec. Ak je dĺžka tento reťazec väčšia než dĺžka súboru cookie, prehliadače nemusí akceptovať overovanie cookie a budete presmerovaný na stránku prihlásenia. Avšak, Ak ste v prostredí multi-domain, možno budete musieť držať názov domény s názov skupiny, pretože skupiny v rozdielnych doménach môžu mať rovnaký názov skupiny. Musíte mať na doménové meno odlíšiť jednu skupinu od druhej.

Väčšina prehľadávačov podporu cookies do 4096 bajtov. Ak tento reťazec môže potenciálne prekročiť dĺžku cookie, môžete na ukladanie informácií skupiny v ASP.NET vyrovnávacej pamäte objektu alebo v databáza. Alternatívne, možno budete chcieť šifrovanie skupiny informácií a uchovávať túto informáciu v skrytej forme poľa.

Napísať Global.asax kód

Kód v súbore Global.asax poskytuje Application_AuthenticateRequest obsluhy udalostí. Popisovač udalosti načíta authentication cookie z Context.REQUEST.cookies zber, dešifruje cookie a načíta zoznam skupín ktoré budú uložené v FormsAuthenticationTicket.UserData Vlastnosť. Skupiny sa zobrazia v potrubí oddelené zoznam, ktorý je vytvorený na stránke Logon.aspx.

Kód analyzuje reťazec v Pole reťazcov na vytvorenie GenericPrincipal objekt. Po GenericPrincipal objekt je vytvorený, tento objekt je umiestnený v HttpContext.User Vlastnosť.
  1. V roztoku Prieskumník kliknite pravým tlačidlom myši Global.asax, a potom kliknite na tlačidlo Zobraziť kód.
  2. Pridajte nasledujúci kód v hornej časti kód pozadu Global.asax.CS súboru:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Nahradiť existujúce prázdne udalosť handler pre Application_AuthenticateRequest s nasledujúcim kódom.
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

Upraviť súbor Web.config

V tejto sekcii môžete konfigurovať <forms></forms>, <authentication></authentication>, a <authorization></authorization> prvky v súbore Web.config. S týmito zmenami, iba overeným používateľom prístup k žiadosti o uplatnenie a neovereného presmerovaní na stránku Logon.aspx. Môžete upraviť Táto konfigurácia pre povoliť iba určitých používateľov a skupín prístup k aplikácii.

Nahradiť existujúci kód v súbore Web.config nasledujúci kód.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Oznámenie <identity impersonate="true"></identity> Konfigurácia prvok. Toto spôsobí ASP.NET zosobniť účet, ktorý je nakonfigurovaný ako anonymný konto z Microsoft Internet Informačné služby (IIS). V tejto konfigurácii, všetky žiadosti o tejto aplikácie spustené pod kontext zabezpečenia nakonfigurovaný účtu. The poskytuje užívateľ poverenia na overenie proti Active Directory, ale konto ktorý pristupuje Active Directory je nakonfigurovaný. Pre viac informácie, pozri Odkazysekcia.

Konfigurovať IIS pre anonymné overenie

Na konfigurovanie súčasti IIS pre anonymné overenie, postupujte podľa týchto kroky:
  1. V službe IIS, rozbaľte uzol počítača pre váš server, rozbaľte položku Webové lokality, rozbaľte Predvolenej webovej lokality, kliknite pravým tlačidlom myši FormsAuthAd, a potom kliknite na tlačidlo Vlastnosti.
  2. Kliknite na tlačidlo Karta Zabezpečenie adresára, a potom kliknite na tlačidlo Upraviť podľa Anonymný prístup a overenie kontroly.
  3. Urobiť anonymným účet pre uplatňovanie účtu, ktorý má povolenie na službe Active Directory.
  4. Kliknutím zrušte začiarknutie políčka Povoliť IIS na kontrolu heslo.
  5. V sekcii "Overený prístup" zrušte začiarknutie políčka "Integrované overovanie systémom Windows".
  6. Kliknite na tlačidlo OK.
  7. Kliknite na tlačidlo použiť
Predvolené IUSR_názov_počítačakonto nemá povolenie na službe Active Directory.

Vytvorenie Logon.aspx stránky

Postupujte podľa týchto krokov vytvorte nové ASP.NET webového formulára s názvom Logon.aspx:
  1. V roztoku Prieskumník kliknite pravým tlačidlom na projekt uzol, bod na Pridať, a potom kliknite na tlačidlo Pridať webového formulára.
  2. Typ Logon.aspx v meno a potom kliknite na Otvorené.
  3. V roztoku Prieskumník kliknite pravým tlačidlom myši Logon.aspx, a potom kliknite na tlačidlo Zobrazenie Designer.
  4. Kliknite na tlačidlo HTML kartu v návrhárovi.
  5. Nahradiť existujúci kód s nasledujúci kód.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuth" %>
    <html>
      <body>	
        <form id="Login" method="post" runat="server">
          <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
          <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
          <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
          <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
          <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
          <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
          <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
          <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
          <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie);		
    
          //You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
        }
        else
        {
          errorLabel.Text = "Authentication did not succeed. Check user name and password.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </script>
  6. Upravte cestu na Logon.aspx stránke k bodu na vaše LDAP Directory server.
Logon.aspx stránka je stránka, ktorá zhromažďuje informácie od používateľov a výzvu metód na LdapAuthentication trieda. Po kód overuje používateľa a získa zoznam skupín, kód vytvorí FormsAuthenticationTicket objekt, šifruje letenky, pridá šifrované lístok cookie, pridá cookie na HttpResponse.Cookies zber, a potom presmeruje žiadosť na adresu URL, ktorá bola pôvodne požadovali.

Zmeniť WebForm1.aspx stránky

WebForm1.aspx stránka je stránka, na ktorú sa požaduje pôvodne. Ak používateľ požaduje táto stránka, žiadosť je presmerovaný na Logon.aspx stránku. Po žiadosti je overený, žiadosť je presmerovaný na WebForm1.aspx stránku.
  1. V roztoku Prieskumník kliknite pravým tlačidlom myši WebForm1.aspx, a potom kliknite na tlačidlo Zobrazenie Designer.
  2. Kliknite na tlačidlo HTML kartu v návrhárovi.
  3. Nahradiť existujúci kód s nasledujúci kód.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
      <body>	
        <form id="Form1" method="post" runat="server">
          <asp:Label ID="lblName" Runat=server /><br>
          <asp:Label ID="lblAuthType" Runat=server />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </script>
    					
  4. Uložte všetky súbory a potom skompilovať projekt.
  5. Vyžiadanie stránky WebForm1.aspx. Oznámenie, že ste presmerovaný na Logon.aspx.
  6. Zadajte prihlasovacie poverenia a kliknite na tlačidlo Predložiť. Keď budete presmerovaní na WebForm1.aspx, oznámenie, že váš používateľ názov sa zobrazí a že LdapAuthentication je typ autentifikácie pre Context.User.AuthenticationType Vlastnosť.
Poznámka Spoločnosť Microsoft odporúča použiť Secure Sockets Layer (SSL) šifrovanie, keď používate overovanie formulárov. To je, pretože používateľ je identifikované na základe overenia cookie a SSL šifrovanie v tejto uplatňovanie zamedzí ohrozenia overovania cookie a akékoľvek iné cenné informácie, ktoré sú prenášané.

ODKAZY

Ďalšie informácie získate po kliknutí na nasledovné číslo článku databázy Microsoft Knowledge Base:
306590ASP.Prehľad netto zabezpečenia
317012 Proces a žiadosť totožnosť v ASP.NET
311495 Ako zaviesť role-based bezpečnostné s overovanie na základe formulárov v vaša ASP.SIEŤOVÉ aplikácie pomocou Visual C#.NET
313091 Ako vytvoriť kľúče pomocou jazyka Visual Basic.NET na použitie v overovanie formulárov
313116 Požiadavky na overenie formulárov nie sú zamerané na stránke loginUrl

Vlastnosti

ID článku: 316748 - Posledná kontrola: 8. novembra 2011 - Revízia: 2.0
Informácie v tomto článku sa týkajú nasledujúcich produktov:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Kľúčové slová: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtsk
Strojovo preložené
DÔLEŽITÉ: Tento článok bol preložený pomocou softvéru na strojový preklad od spoločnosti Microsoft, nie prekladateľom. Spoločnosť Microsoft ponúka články preložené prekladateľmi aj strojovo preložené články, vďaka čomu máte možnosť prístupu ku všetkým článkom databázy Knowledge Base vo svojom jazyku. Strojovo preložený článok však nie je vždy perfektný. Môže obsahovať chyby týkajúce sa slovnej zásoby, syntaxe alebo gramatiky, podobne ako cudzinec môže robiť chyby, keď rozpráva vašim jazykom. Spoločnosť Microsoft nenesie zodpovednosť za akékoľvek nepresnosti, chyby alebo škody spôsobené akýmkoľvek nepresným prekladom obsahu alebo jeho použitím zo strany zákazníkov. Spoločnosť Microsoft softvér na strojový preklad pravidelne aktualizuje.
Pokiaľ chcete vidieť anglickú verziu článku, kliknite sem:316748

Odošlite odozvu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com