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

Souhrn

Tento podrobný článek popisuje, 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 Basic .NET

Takto vytvořit nové ASP.NET webové aplikace s názvem FormsAuthAd v jazyce Visual Basic .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 jazyka Visual Basic v části Typy projektua klepněte na Webovou aplikaci ASP.NET v části šablony.
  4. Do pole umístění zadejte http://<servername>/FormsAuthAd (nahrazení http://localhost používáte-li místní server (tak, aby jste http://localhost/FormsAuthAda potom klepněte na tlačítko OK.
  5. 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.
  6. 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.vb:
  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.vb zadejte do pole název a klepněte na tlačítko Otevřít.
  4. Nahraďte existující kód v souboru LdapAuthentication.vb následujícím kódem:
    Imports SystemImports System.Text
    Imports System.Collections
    Imports System.DirectoryServices

    Namespace FormsAuth
    Public Class LdapAuthentication

    Dim _path As String
    Dim _filterAttribute As String

    Public Sub New(ByVal path As String)
    _path = path
    End Sub

    Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean

    Dim domainAndUsername As String = domain & "\" & username
    Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)

    Try
    'Bind to the native AdsObject to force authentication.
    Dim obj As Object = entry.NativeObject
    Dim search As DirectorySearcher = New DirectorySearcher(entry)

    search.Filter = "(SAMAccountName=" & username & ")"
    search.PropertiesToLoad.Add("cn")
    Dim result As SearchResult = search.FindOne()

    If (result Is Nothing) Then
    Return False
    End If

    'Update the new path to the user in the directory.
    _path = result.Path
    _filterAttribute = CType(result.Properties("cn")(0), String)

    Catch ex As Exception
    Throw New Exception("Error authenticating user. " & ex.Message)
    End Try

    Return True
    End Function

    Public Function GetGroups() As String
    Dim search As DirectorySearcher = New DirectorySearcher(_path)
    search.Filter = "(cn=" & _filterAttribute & ")"
    search.PropertiesToLoad.Add("memberOf")
    Dim groupNames As StringBuilder = New StringBuilder()

    Try
    Dim result As SearchResult = search.FindOne()
    Dim propertyCount As Integer = result.Properties("memberOf").Count

    Dim dn As String
    Dim equalsIndex, commaIndex

    Dim propertyCounter As Integer

    For propertyCounter = 0 To propertyCount - 1
    dn = CType(result.Properties("memberOf")(propertyCounter), String)

    equalsIndex = dn.IndexOf("=", 1)
    commaIndex = dn.IndexOf(",", 1)
    If (equalsIndex = -1) Then
    Return Nothing
    End If

    groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
    groupNames.Append("|")
    Next

    Catch ex As Exception
    Throw New Exception("Error obtaining group names. " & ex.Message)
    End Try

    Return groupNames.ToString()
    End Function
    End Class
    End Namespace



Vysvětlení kódu

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.
Ověřování uživatelů
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.

Poznámka: Použijete-li vytvořit vazbu na objekt služby Active Directory souvisejících LDAP, porty TCP jsou používány. Zvýšené používání protokolu LDAP pomocí oboru názvů System.DirectoryServices může použít všechny porty TCP, které jsou k dispozici. Je možné snížit zatížení TCP pomocí opakovaného použití připojení, které používá k ověření uživatele.
Skupiny uživatelů
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, nemusí být vytvořen soubor cookie ověřování. Tento řetězec může být potenciálně větší než délka 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. Přidejte následující kód v horní části kódu soubor Global.asax.vb:
    Imports System.Web.SecurityImports System.Security.Principal

  3. Nahraďte existující prázdné obslužné rutiny pro Application_AuthenticateRequest následujícím kódem:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)        ' Fires upon attempting to authenticate the use
    Dim cookieName As String = FormsAuthentication.FormsCookieName
    Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)

    If (authCookie Is Nothing) Then
    'There is no authentication cookie.
    Return
    End If

    Dim authTicket As FormsAuthenticationTicket = Nothing

    Try
    authTicket = FormsAuthentication.Decrypt(authCookie.Value)
    Catch ex As Exception
    'Write the exception to the Event Log.
    Return
    End Try

    If (authTicket Is Nothing) Then
    'Cookie failed to decrypt.
    Return
    End If

    'When the ticket was created, the UserData property was assigned a
    'pipe-delimited string of group names.
    Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})

    'Create an Identity.
    Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")

    'This principal flows throughout the request.
    Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)

    Context.User = principal

    End Sub

Upravte soubor Web.config

V této části nakonfigurujete
formuláře
ověřovánía
ověření 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="60" path="/" >
</forms>
</authentication>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
<identity impersonate="true" />
</system.web>
</configuration>

Upozornění identity impersonate = "true" / element konfigurace. 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. V konzole Správa Internetová informační služba (IIS) klikněte pravým tlačítkem myši na uzel virtuálního adresáře pro "FormsAuthAd".
  2. Klepněte na příkaz Vlastnostia potom klepněte na kartu Zabezpečení adresáře .
  3. Klepněte na tlačítko Upravit pod anonymního přístupu a ověřování.
  4. Zaškrtněte políčko Anonymní přístup .
  5. Vytvořit anonymní účet pro použití účtu, který má oprávnění ke službě Active Directory.
  6. Klepnutím zrušte zaškrtnutí políčka Povolit IIS heslo řízení .
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="vb" AutoEventWireup="true" %><%@ Import Namespace="FormsAuthAd.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">
    sub Login_Click(sender as object,e as EventArgs)
    Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
    Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
    try
    if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
    Dim groups as string = adAuth.GetGroups()

    'Create the ticket, and add the groups.
    Dim isCookiePersistent as boolean = chkPersist.Checked
    Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
    txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)

    'Encrypt the ticket.
    Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)

    'Create a cookie, and then add the encrypted ticket to the cookie as data.
    Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)

    if(isCookiePersistent = true) then
    authCookie.Expires = authTicket.Expiration
    end if
    '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."
    end if

    catch ex as Exception
    errorLabel.Text = "Error authenticating. " & ex.Message
    end try
    end sub
    </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 provede následující akce v tomto pořadí:
  • vytvoří FormsAuthenticationTicket objekt;
  • zašifruje lístek;
  • Přidá šifrovaný lístek do souboru cookie;
  • Přidá soubor cookie HttpResponse.Cookies kolekce;
  • požadavek přesměruje na původně požadovanou adresu URL.

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="vb" 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">
    sub Page_Load(sender as object, e as EventArgs)
    lblName.Text = "Hello " + Context.User.Identity.Name & "."
    lblAuthType.Text = "You were authenticated using " & Context.User.Identity.AuthenticationType & "."
    end sub
    </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.Identity.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

306238 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 Basic .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: 326340 - Poslední kontrola: 9. 1. 2017 - Revize: 1

Váš názor