Help and Support

Identificativo articolo: 326340 - Ultima modifica: giovedì 22 marzo 2007 - Revisione: 4.5

Come autenticare Active Directory utilizzando l'autenticazione basata su form e Visual Basic .NET

In questa pagina

Espandi tutto | Chiudi tutto

Sommario

Questo articolo dettagliato descrive come ASP.NET in un'applicazione può utilizzare l'autenticazione basata su form per consentire agli utenti per l'autenticazione in Active Directory utilizzando LDAP (Lightweight Directory Access Protocol).

Dopo che l'utente è autenticato e reindirizzato, è possibile utilizzare il metodo Application_AuthenticateRequest del file Global.asax per memorizzare un oggetto GenericPrincipal nella proprietà HttpContext.User che scorre in tutta la richiesta.

Creare un'applicazione Web ASP.NET in Visual Basic .NET

Attenersi alla seguente procedura per creare una nuova applicazione Web ASP.NET denominata FormsAuthAd in Visual Basic. NET:
  1. Avviare Microsoft Visual Studio .NET.
  2. Scegliere nuovo dal menu File , quindi progetto .
  3. Fare clic su progetti di Visual Basic in tipi di progetto e quindi Applicazione Web ASP.NET in modelli .
  4. Nella casella Percorso , digitare <servername> http:// <nomeserver>/FormsAuthAd(sostituzione http://localhost se si utilizza il server locale (in modo come a disporre http://localhost/FormsAuthAd e scegli OK .
  5. Fare clic con il pulsante destro del mouse sul nodo Riferimenti in Esplora soluzioni e quindi fare clic su Aggiungi riferimento .
  6. Nella scheda .NET nella finestra di dialogo Aggiungi riferimento fare clic su System.DirectoryServices.dll , fare clic su Seleziona e quindi fare clic su OK .

Scrivere il codice di autenticazione

Attenersi alla seguente procedura per creare un nuovo file di classe denominato LdapAuthentication.vb:
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nodo del progetto, scegliere Aggiungi e quindi fare clic su Aggiungi nuovo elemento .
  2. Selezionare classe in modelli .
  3. Digitare LdapAuthentication.vb nella casella Nome e quindi fare clic su Apri .
  4. Sostituire il codice esistente nel file LdapAuthentication.vb con il codice riportato di seguito: _path
    Imports System
    Imports 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
    
    
    					

Spiegazione del codice

Il codice di autenticazione accetta un dominio, un nome utente, una password e un percorso per la struttura di Active Directory. Questo codice utilizza il provider di directory LDAP.
Autenticazione utente
Il codice della pagina Logon.aspx chiama il metodo LdapAuthentication.IsAuthenticated e passa le credenziali vengono raccolti da parte dell'utente. Quindi, viene creato un oggetto DirectoryEntry con il percorso per la struttura di directory, il nome utente e la password. Il nome utente deve essere nel formato "dominio\nomeutente". L'oggetto DirectoryEntry tenta quindi di imporre l'associazione AdsObject ottenendo la proprietà NativeObject . Se questa operazione ha esito positivo, l'attributo CN per l'utente viene ottenuto creando un oggetto DirectorySearcher e filtrando in SAMAccountName . Dopo che l'utente è autenticato, il metodo IsAuthenticated restituisce true .

Nota Quando si utilizza LDAP per associare a un oggetto relativi ad Active Directory, vengono utilizzate le porte TCP. Maggiore utilizzo di LDAP con lo spazio dei nomi System.DirectoryServices è possibile utilizzare tutte le porte TCP sono disponibili. È possibile ridurre il carico TCP riutilizzando la connessione utilizzata per autenticare l'utente.
Gruppi di utenti
Per ottenere un elenco di gruppi che l'utente appartiene, il codice chiama il metodo LdapAuthentication.GetGroups . Il metodo LdapAuthentication.GetGroups Ottiene un elenco di gruppi di protezione e distribuzione che l'utente appartiene a creando un oggetto DirectorySearcher e da un filtro in base all'attributo memberOf . Questo metodo restituisce un elenco di gruppi separati da pipe (|).

Si noti che il metodo LdapAuthentication.GetGroups modifica e tronca le stringhe. Questo riduce la lunghezza della stringa memorizzata in un cookie di autenticazione. Se la stringa non è troncata, il formato di ogni gruppo viene visualizzato nel modo seguente:
CN=...,...,DC=domain,DC=com
				
questo possibile creare una stringa molto lunga. Se la lunghezza di questa stringa è maggiore della lunghezza del cookie, il cookie di autenticazione non può essere creato. Se questa stringa può essere potenzialmente maggiore della lunghezza del cookie, sarà necessario memorizzare le informazioni relative al gruppo nell'oggetto cache ASP.NET o in un database. In alternativa, sarà necessario crittografare le informazioni di gruppo e memorizzare queste informazioni in un campo di form nascosto.

Scrivere il codice di Global.asax

Il codice nel file Global.asax fornisce un gestore eventi Application_AuthenticateRequest . Questo gestore eventi recupera il cookie di autenticazione dall'insieme Context.Request.Cookies , decrittografa il cookie e recupera l'elenco di gruppi che verrà essere memorizzato nella proprietà FormsAuthenticationTicket.UserData . I gruppi vengono visualizzati in un elenco separato da pipe utilizzata per creata la pagina Logon.aspx.

Il codice analizza la stringa in una matrice di stringhe per creare un oggetto GenericPrincipal . Una volta creato l'oggetto GenericPrincipal , questo oggetto viene posizionato nella proprietà HttpContext.User .
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Global.asax e quindi scegliere Visualizza codice .
  2. Aggiungere il codice riportato di seguito all'inizio del codice dietro il file Global.asax.vb:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Sostituire il gestore eventi vuoto esistente per Application_AuthenticateRequest con il codice seguente:
    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
    					
    Dim principale come GenericPrincipal = nuovo Context.User GenericPrincipal(id, groups) = principale End Sub

Modificare il file Web.config

In questa sezione, è possibile configurare i forms, l' authentication e gli elementi di authorization nel file Web.config. Grazie a queste modifiche solo agli utenti autenticati possono accedere l'applicazione e le richieste non autenticate vengono reindirizzate a una pagina Logon.aspx. È possibile modificare questa configurazione agli consentono di determinati utenti e gruppi di accesso all'applicazione.

Sostituire il codice esistente nel file Web.config con il codice riportato di seguito:
<?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>
				
Si noti il identity impersonate="true" / elemento di configurazione. In questo modo, ASP.NET di rappresentare l'account è configurato come l'account anonimo da Microsoft Internet Information Services (IIS). Di conseguenza questa configurazione, tutte le richieste per questa applicazione vengono eseguiti con il contesto di protezione dell'account configurato. L'utente fornisce le credenziali per l'autenticazione in Active Directory, ma l'account che accede a Active Directory è l'account configurato. Per ulteriori informazioni, vedere REFERENCES sezione.

Configurare IIS per l'autenticazione anonima

Per configurare IIS per l'autenticazione anonima, eseguire la procedura seguente:
  1. Fare clic con il pulsante destro del mouse nella console di gestione di Internet Information Services (IIS) sul directory virtuale nodo per "FormsAuthAd" .
  2. Fare clic su proprietà e quindi la scheda Protezione directory .
  3. Fare clic su Modifica in Controllo autenticazione e accesso anonimo .
  4. Selezionare la casella di controllo Accesso anonimo .
  5. Verificare l'account anonimo per l'applicazione di un account che disponga delle autorizzazioni necessarie per Active Directory.
  6. Fare clic per cancellare il Allow IIS A Control password casella di controllo.
L'account predefinito del computername IUSR_ non dispone delle autorizzazioni necessarie per Active Directory.

Creare la pagina Logon.aspx

Attenersi alla seguente procedura per creare un nuovo Web Form ASP.NET denominata Logon.aspx:
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nodo del progetto, scegliere Aggiungi e quindi fare clic su Aggiungi modulo Web .
  2. Digitare Logon.aspx nella casella Nome e quindi fare clic su Apri .
  3. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Logon.aspx e quindi fare clic su Visualizza finestra di progettazione .
  4. Fare clic sulla scheda HTML nella finestra di progettazione.
  5. Replace the existing code with the following code:
    <%@ 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. Modificare il percorso nella pagina Logon.aspx per scegliere il server LDAP.
La pagina Logon.aspx è una pagina che raccoglie le informazioni da metodi utente e la chiamata sulla classe LdapAuthentication . Dopo il codice autentica l'utente e ottiene un elenco di gruppi, il codice effettua le seguenti nell'ordine seguente:
  • Crea un oggetto FormsAuthenticationTicket ;
  • Consente di crittografare il ticket.
  • Aggiunge il ticket crittografato a un cookie.
  • Aggiunge il cookie all'insieme HttpResponse.Cookies ;
  • reindirizza la richiesta all'URL richiesto originariamente.

Modifica della pagina WebForm1.aspx

La pagina WebForm1.aspx è la pagina che viene richiesto originariamente. Quando l'utente richiede la pagina, la richiesta viene reindirizzata al Logon.aspx pagina. Dopo che la richiesta è autenticata, viene reindirizzata la richiesta alla pagina WebForm1.aspx.
  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse su WebForm1.aspx e quindi fare clic su Visualizza finestra di progettazione .
  2. Fare clic sulla scheda HTML nella finestra di progettazione.
  3. Sostituire il codice esistente con il codice riportato di seguito:
    <%@ 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. Salvare tutti i file e quindi compilare il progetto.
  5. Richiedere la pagina WebForm1.aspx. Si noti che l'utente viene reindirizzato a Logon.aspx.
  6. Digitare le credenziali di accesso e quindi fare clic su Invia . Durante l'verrai reindirizzato a WebForm1.aspx, è possibile notare che venga visualizzato il nome utente e che LdapAuthentication è il tipo di autenticazione per la proprietà Context.User.Identity.AuthenticationType .
Nota Microsoft consiglia di utilizzare SSL (Secure Sockets Layer) crittografia quando si utilizza l'autenticazione basata su form. Questo avviene perché l'utente viene identificato in base al cookie di autenticazione e crittografia SSL in questa applicazione impedisce a chiunque di compromettere il cookie di autenticazione e le altre informazioni importanti che viene trasmesso.

Riferimenti

Per ulteriori informazioni, fare clic seguenti numeri articolo consente di visualizzare gli articoli della Microsoft Knowledge Base:
306590  (http://support.microsoft.com/kb/306590/ ) Cenni preliminari sulla protezione ASP.NET
317012  (http://support.microsoft.com/kb/317012/ ) Identità di processo e richiesta in ASP.NET
306238  (http://support.microsoft.com/kb/306238/ ) Come implementare la protezione basata sui ruoli con l'autenticazione basata su form nell'applicazione ASP.NET mediante Visual Basic .NET
313091  (http://support.microsoft.com/kb/313091/ ) Come creare chiavi utilizzando Visual Basic .NET per l'autenticazione basata su form
313116  (http://support.microsoft.com/kb/313116/ ) Le richieste di autenticazione form non sono indirizzate loginUrl pagina

Le informazioni in questo articolo si applicano a:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
Chiavi: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 326340  (http://support.microsoft.com/kb/326340/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Traduzione articoli