Postup při ověření u služby Active Directory pomocí ověřování pomocí formulářů a Visual C# .NET

Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security

Souhrn

Tento článek ukazuje, jak aplikace technologie ASP.NET můžete použít ověřování pomocí formulářů, aby se uživatelé ověřují proti Active Directory pomocí LDAP Lightweight Directory Access Protocol (). Poté, co je uživatel ověřen a přesměrována, můžete použít Application_AuthenticateRequest metoda v souboru Global.asax pro uložení GenericPrincipal objekt v HttpContext.User vlastnost, která toky v rámci žádosti.

Vytvořit webovou aplikaci ASP.NET v aplikaci Visual C# .NET

Takto vytvořit nové ASP.NET webové aplikace s názvem FormsAuthAd v aplikaci Visual C# .NET:
  1. Spusťte aplikaci Visual Studio .NET.
  2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
  3. Klepněte na tlačítko Projekty Visual C# v části Typy projektua klepněte na Webovou aplikaci ASP.NET v části šablony.
  4. V poli umístění nahraďte WebApplication1 FormsAuthAd.
  5. Klepněte na tlačítko OK
  6. Klepněte pravým tlačítkem na uzel odkazy v Průzkumníku řešení a potom klepněte na tlačítko Přidat odkaz.
  7. V dialogovém okně Přidat odkaz na kartě .NET klepněte na tlačítko System.DirectoryServices.dll, klepněte na tlačítko Vybrata klepněte na tlačítko OK.

Napište ověřovací kód

Postupujte takto Chcete-li vytvořit nový soubor třídy s názvem LdapAuthentication.cs:
  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel projektu, přejděte na příkaz Přidata potom klepněte na tlačítko Přidat novou položku.
  2. Ve skupinovém rámečku šablony, klepněte na tlačítko třídy .
  3. LdapAuthentication.cs zadejte do pole název a klepněte na tlačítko Otevřít.
  4. Nahraďte existující kód v souboru LdapAuthentication.cs následujícím kódem.
    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();
    }
    }
    }

Domény, uživatelské jméno, heslo a cesta do stromové struktury služby Active Directory je možné zadat ověřovací kód. Tento kód používá zprostředkovatele adresáře LDAP.

Kód ve stránce Logon.aspx volá LdapAuthentication.IsAuthenticated metodu a předá v pověření, které jsou shromažďovány od uživatele. Poté je vytvořen objekt DirectoryEntry cesta ke adresářový strom, uživatelské jméno a heslo. Uživatelské jméno musí být ve formátu "DOMENA\Uzivatelske_jmeno". DirectoryEntry objekt se poté pokusí vynutit vazby AdsObject získáním NativeObject vlastnost. Pokud se to podaří, KN atribut pro uživatele se získá vytvořením DirectorySearcher objektu a pomocí filtrování SAMAccountName. Poté, co byl uživatel ověřen, metodu IsAuthenticated vrátí hodnotu true.

Chcete-li získat seznam skupin, které uživatel patří, tento kód volání LdapAuthentication.GetGroups metoda. LdapAuthentication.GetGroups metoda získá seznam zabezpečení a distribučních skupin, které uživatel patří vytvořením DirectorySearcher objektu a pomocí filtrování podle atributu memberOf . Tato metoda vrátí seznam skupin, které jsou odděleny potrubí (|).

Všimněte si, že LdapAuthentication.GetGroups metoda pracuje a zkrátí řetězce. Tato funkce omezuje délku řetězce, který je uložen v souboru cookie ověřování. Pokud řetězec není zkrácen formát každé skupiny se zobrazí takto.
CN=...,...,DC=domain,DC=com
To může vytvořit velmi dlouhý řetězec. Pokud je délka tohoto řetězce větší než délka souboru cookie, prohlížečích nemusí přijmout ověřovací soubor cookie a budete přesměrováni na přihlašovací stránku. Pokud pracujete v prostředí s více doménami, může však nutné zachovat název domény s názvem, protože skupiny v různých doménách mohou mít stejný název skupiny. Je nutné zachovat název domény k odlišení od jiného jedna skupina.

Většina webových prohlížečů podporuje soubory cookie 4096 bajtů. Tento řetězec může potenciálně překročit délku souboru cookie, můžete ukládat informace o skupině v ASP.NET mezipaměti objektu nebo v databázi. Alternativně můžete zašifrovat informace o skupině a uložit tyto informace ve skrytém poli formuláře.

Napsat kód Global.asax

Kód v souboru Global.asax obsahuje obslužnou rutinu události Application_AuthenticateRequest . Tato obslužná rutina události načte ověřovací soubor cookie z kolekce Context.Request.Cookies , dešifruje soubor cookie a načte seznam skupin, které budou uloženy v FormsAuthenticationTicket.UserData vlastnost. Skupiny jsou zobrazeny v seznamu oddělené kanálu, který je vytvořen na stránce Logon.aspx.

Kód analyzuje řetězec v poli řetězců k vytvoření objektů GenericPrincipal . Po vytvoření objektů GenericPrincipal je objekt umístěn v HttpContext.User vlastnost.
  1. V Průzkumníku řešení klikněte pravým tlačítkem myši Global.asaxa potom klepněte na tlačítko Zobrazit kód.
  2. V horní části souboru Global.asax.cs kódu přidejte následující kód:
    using System.Web.Security;using System.Security.Principal;

  3. Nahraďte existující prázdné obslužné rutiny pro Application_AuthenticateRequest následujícím kódem.
    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;

    }

Upravte soubor Web.config

V této části můžete konfigurovat < forms >, < ověřování >a < authorization > prvky v souboru Web.config. Tyto změny pouze ověřeným uživatelům přístup k aplikaci a jsou neověřené požadavky přesměrovány na stránce Logon.aspx. Můžete upravit tato konfigurace povolit pouze určité uživatele a skupiny přístup k aplikaci.

Nahraďte existující kód v souboru Web.config následující 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>

Upozornění < identity impersonate = "true" / > konfiguračního prvku. To způsobí, že ASP.NET zosobnit účet, který je nakonfigurován jako anonymní účet z Internetová informační služba (IIS). Po nastavení této konfigurace všechny požadavky na tuto aplikaci spustit v kontextu zabezpečení účtu konfigurované. Uživatel zadá pověření k ověřování služby Active Directory, ale účet, který má přístup ke službě Active Directory je nakonfigurovaný účet. Další informace naleznete v části odkazy .

Konfigurace služby IIS pro anonymní ověřování

Konfigurace služby IIS pro anonymní ověřování, postupujte takto:
  1. Ve službě IIS rozbalte uzel pro počítač serveru, rozbalte položku webové servery, rozbalte výchozí web, klepněte pravým tlačítkem myši FormsAuthAda potom klepněte na příkaz Vlastnosti.
  2. Klepněte na Kartu Zabezpečení adresářea ve skupinovém rámečku Nastavení anonymního přístupu a ověřováníklepněte na tlačítko Upravit .
  3. Vytvořit anonymní účet pro použití účtu, který má oprávnění ke službě Active Directory.
  4. Klepnutím zrušte zaškrtnutí políčka Povolit IIS heslo řízení.
  5. V oddílu "Ověřený přístup" zrušte zaškrtnutí políčka "Integrované ověřování systému Windows".
  6. Klepněte na tlačítko OK.
  7. Klepněte na tlačítko použít
Výchozí účet IUSR_název_počítače nemá oprávnění ke službě Active Directory.

Vytvořit na stránce Logon.aspx

Postupujte podle těchto kroků vytvořte nový webový formulář ASP.NET s názvem Logon.aspx:
  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na uzel projektu, přejděte na příkaz Přidata potom klepněte na tlačítko Přidat webový formulář.
  2. Do pole název zadejte Logon.aspx a klepněte na tlačítko Otevřít.
  3. V Průzkumníku řešení klikněte pravým tlačítkem myši Logon.aspxa potom klepněte na tlačítko Návrhář zobrazení.
  4. Klepněte na záložku HTML v návrháři.
  5. Nahraďte existující kód následující 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 přejděte na adresář LDAP serveru na stránce Logon.aspx.
Logon.aspx stránka je stránka, která shromažďuje informace od uživatele a volání metod na LdapAuthentication třída. Po kódu ověří uživatele a získá seznam skupiny, kód vytvoří FormsAuthenticationTicket objekt, zašifruje lístek, přidá šifrovaný lístek do souboru cookie, přidá souboru cookie HttpResponse.Cookies kolekce a pak přesměruje požadavek na adresu URL, která byla původně požadoval.

Upravit stránku WebForm1.aspx

Stránka WebForm1.aspx je původně požadovanou stránku. Pokud uživatel požádá o tuto stránku, je požadavek přesměrován na stránku Logon.aspx. Po ověření žádosti je požadavek přesměrován na stránku WebForm1.aspx.
  1. V Průzkumníku řešení klikněte pravým tlačítkem myši WebForm1.aspxa potom klepněte na tlačítko Návrhář zobrazení.
  2. Klepněte na záložku HTML v návrháři.
  3. Nahraďte existující kód následující 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šechny soubory a poté zkompilovat projekt.
  5. Požadavek stránku WebForm1.aspx. Všimněte si, že budete přesměrováni na Logon.aspx.
  6. Zadejte přihlašovací pověření a potom klepněte na tlačítko Odeslat. Když budete přesměrováni do souboru WebForm1.aspx, Všimněte si, že vaše uživatelské jméno se objeví a že LdapAuthentication ověřování zadejte pro vlastnost Context.User.AuthenticationType .
Poznámka: Společnost Microsoft doporučuje použít šifrování protokol SSL (Secure Sockets Layer) (SSL), při použití ověřování pomocí formulářů. Je to proto, že uživatel je určen založené na souboru cookie ověřování a šifrování SSL v této aplikaci můžete komukoli porušili ověřovací soubor cookie a další důležité informace, která byla přenesena.

Odkazy

Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:

306590 Přehled zabezpečení technologie ASP.NET

317012 zpracování a vyžádání identity v technologii ASP.NET

311495 jak implementovat zabezpečení založené na rolích pomocí ověřování na základě formulářů ve vaší aplikaci technologie ASP.NET pomocí Visual C# .NET

313091 jak vytvořit klíče pomocí jazyka Visual Basic .NET pro použití při ověřování pomocí formulářů

313116 požadavky na ověřování formulářů není přesměrováni na stránku loginUrl

Vlastnosti

ID článku: 316748 - Poslední kontrola: 9. 1. 2017 - Revize: 1

Váš názor