In questo articolo viene descritto come ASP.NET è possibile utilizzare l'autenticazione basata su form per consentire agli utenti di autenticarsi in Active Directory mediante il protocollo LDAP (Lightweight Directory Access Protocol).
Dopo 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 passa 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:
- Avviare Microsoft Visual Studio .NET.
- Scegliere Nuovo dal menu file , quindi progetto .
- Fare clic su Progetti di Visual Basic in Tipi progetto e quindi fare clic su Applicazione Web ASP.NET in modelli .
- Nella casella percorso , digitare <servername> http:// <nomeserver>/FormsAuthAd (sostituendo http://localhost se si utilizza il server locale (in modo come a sono http://localhost/FormsAuthAd e quindi fare clic su OK .
- Fare clic con il pulsante destro del mouse sul nodo riferimenti in Esplora soluzioni e quindi fare clic su Aggiungi riferimento .
- Nella scheda .NET nella finestra di dialogo Aggiungi riferimento , fare clic su System.DirectoryServices.dll , fare clic su Seleziona e scegliere OK .
Scrivere il codice di autenticazione
Attenersi alla seguente procedura per creare un nuovo file di classe denominato LdapAuthentication.vb:
- In Esplora soluzioni, fare clic con il pulsante destro del mouse sul nodo progetto, scegliere Aggiungi , quindi Aggiungi nuovo elemento .
- Fare clic su classe in modelli .
- Digitare LdapAuthentication.vb nella casella Nome e quindi fare clic su Apri .
- Sostituire il codice esistente nel file LdapAuthentication.vb con il codice riportato di seguito:
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 di struttura della console 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, un oggetto
DirectoryEntry viene creato con il percorso nella struttura della directory, il nome utente e la password. Il nome utente deve essere nel formato "dominio\nomeutente". L'oggetto
DirectoryEntry tenta quindi di forzare l'associazione
AdsObject ottenendo la proprietà
NativeObject . Se questo ha esito positivo, l'attributo
CN per l'utente viene ottenuto creazione di un oggetto
DirectorySearcher e filtro di
SAMAccountName . Dopo che l'utente è autenticato, il metodo di
IsAuthenticated restituisce
true .
Nota Quando si utilizza LDAP per l'associazione a un oggetto relative ad Active Directory, vengono utilizzate le porte TCP. Aumento dell'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 è utilizzato per autenticare l'utente.
Gruppi di utenti
Per ottenere un elenco dei gruppi che l'utente appartiene, questo codice chiama il metodo
LdapAuthentication.GetGroups . Il metodo
LdapAuthentication.GetGroups Ottiene un elenco dei gruppi di protezione e la distribuzione a cui appartiene l'utente per la creazione di un oggetto
DirectorySearcher e filtrando 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 nel cookie di autenticazione. Se la stringa non viene troncata, il formato di ogni gruppo viene visualizzato come segue:
CN=...,...,DC=domain,DC=com
questo possibile creare una stringa molto lunga. Se la lunghezza di questa stringa è maggiore della lunghezza del cookie, è possibile che il cookie di autenticazione non venga creato. Se questa stringa potenzialmente sia maggiore della lunghezza del cookie, sarà necessario memorizzare le informazioni di gruppo nell'oggetto cache ASP.NET o in un database. In alternativa, è possibile che si desidera crittografare le informazioni di gruppo e memorizzare le informazioni in un campo modulo nascosto.
Scrivere il codice di Global.asax
Il codice nel file Global.asax fornisce un gestore di eventi
Application_AuthenticateRequest . Questo gestore eventi recupera il cookie di autenticazione dall'insieme
Context.Request.Cookies , decrittografa il cookie e recupera l'elenco dei gruppi che verranno memorizzati nella proprietà
FormsAuthenticationTicket.UserData . I gruppi vengono visualizzati in un elenco, separati da pipe in creata nella pagina Logon.aspx.
Il codice analizza la stringa in una matrice di stringa per creare un oggetto
GenericPrincipal . Dopo aver creato l'oggetto
GenericPrincipal , questo oggetto viene posizionato nella proprietà
HttpContext.User .
- In Esplora soluzioni, fare clic con il pulsante destro del mouse su Global.asax e quindi scegliere Visualizza codice .
- Aggiungere il codice riportato di seguito nella parte superiore del codice, dietro il file Global.asax.vb:
Imports System.Web.Security
Imports System.Security.Principal
- Sostituire il gestore eventi vuoto esistente per il Application_AuthenticateRequest con il codice riportato di seguito:
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
Modifica del File Web.config
In questa sezione, è possibile configurare i
forms, l'
authentication e gli elementi
authorization nel file Web.config. Con queste modifiche, solo gli utenti autenticati di accedere all'applicazione e le richieste non autenticate vengono reindirizzate a una pagina Logon.aspx. È possibile modificare questa configurazione per consentire solo certi 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). Come risultato di questa configurazione, tutte le richieste per l'applicazione viene eseguito nel 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 i
REFERENCES sezione.
Configurare IIS per l'autenticazione anonima
Per configurare IIS per l'autenticazione anonima, attenersi alla seguente procedura:
- Clic con il pulsante destro del mouse nella console di Gestione Internet Information Services (IIS) sul directory virtuale nodo per "FormsAuthAd" .
- Fare clic su Proprietà e quindi scegliere la scheda Protezione Directory .
- Fare clic su Modifica in controllo autenticazione e accesso anonimo .
- Selezionare la casella di controllo Accesso anonimo .
- Verificare l'account anonimo per l'applicazione di un account che dispone dell'autorizzazione per Active Directory.
- Fare clic per deselezionare il IIS Consenti per controllo password casella di controllo.
Impostazione predefinita IUSR_
computername non dispone dell'autorizzazione in Active Directory.
Creare la pagina Logon.aspx
Attenersi alla seguente procedura per creare un nuovo ASP.NET Web Form denominato Logon.aspx:
- Fare clic con il pulsante destro del mouse sul nodo progetto in Esplora soluzioni, scegliere Aggiungi e quindi fare clic su Aggiungi Web Form .
- Digitare Logon.aspx nella casella Nome e quindi fare clic su Apri .
- In Esplora soluzioni, fare clic con il pulsante destro del mouse su Logon.aspx e quindi fare clic su Visualizza finestra di progettazione .
- Fare clic sulla scheda HTML nella finestra di progettazione.
- 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>
- Modificare il percorso nella pagina Logon.aspx per riferimento al server LDAP.
La pagina Logon.aspx è una pagina che raccoglie le informazioni dai metodi utente e la chiamata della classe
LdapAuthentication . Dopo il codice autentica l'utente e ottiene un elenco di gruppi, il codice svolge le seguenti nell'ordine indicato:
- 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 richiesta originariamente. Quando l'utente richiede questa pagina, la richiesta viene reindirizzata la Logon.aspx pagina. Dopo la richiesta è autenticata, la richiesta viene reindirizzata alla pagina WebForm1.aspx.
- In Esplora soluzioni, fare clic con il pulsante destro del mouse su WebForm1.aspx e quindi fare clic su Visualizza finestra di progettazione .
- Fare clic sulla scheda HTML nella finestra di progettazione.
- 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>
- Salvare tutti i file e quindi compilare il progetto.
- Richiedere la pagina WebForm1.aspx. Si noti che si viene reindirizzati a Logon.aspx.
- Digitare le credenziali di accesso e quindi fare clic su Invia . Quando si viene reindirizzati a WebForm1.aspx, si noti che il nome utente visualizzato e che LdapAuthentication l'autenticazione si digitare per la proprietà Context.User.Identity.AuthenticationType .
Nota Si consiglia di utilizzare SSL (Secure Sockets Layer) quando si utilizza l'autenticazione basata su moduli di crittografia. Infatti, l'utente è identificato in base al cookie di autenticazione e crittografia SSL in questa applicazione impedisce a tutti gli utenti di compromettere il cookie di autenticazione e altre preziose informazioni trasmesse.
Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportato di seguito:
306590
(http://support.microsoft.com/kb/306590/
)
Cenni preliminari sulla protezione ASP.NET
317012
(http://support.microsoft.com/kb/317012/
)
Identità di processo e della richiesta in ASP.NET
306238
(http://support.microsoft.com/kb/306238/
)
Come implementare protezione basata sui ruoli con l'autenticazione basata su form in un'applicazione ASP.NET utilizzando Visual Basic .NET
313091
(http://support.microsoft.com/kb/313091/
)
Come creare chiavi tramite utilizzando Visual Basic .NET per l'utilizzo nell'autenticazione basata su form
313116
(http://support.microsoft.com/kb/313116/
)
Richieste di autenticazione form non sono indirizzate a pagina loginUrl