Αυτό το άρθρο βήμα προς βήμα παρουσιάζει πώς μια ASP.NET
εφαρμογή να χρησιμοποιήσετε έλεγχο ταυτότητας φορμών για να επιτρέψετε στους χρήστες να πραγματοποιήσουν έλεγχο ταυτότητας
από την υπηρεσία καταλόγου Active Directory, χρησιμοποιώντας το πρωτόκολλο Lightweight Directory Access
(LDAP). Αφού ο χρήστης είναι σε έλεγχο ταυτότητας και ανακατεύθυνση, μπορείτε να χρησιμοποιήσετε το
Application_AuthenticateRequest μέθοδος αρχείο Global.asax για να αποθηκεύσετε ένα
GenericPrincipal αντικείμενο με το
HttpContext.User ιδιότητα που ρέει σε ολόκληρη την αίτηση.
Δημιουργήστε μια ASP.Η εφαρμογή NET Web στο Visual C#.NET
Ακολουθήστε τα εξής βήματα για να δημιουργήσετε ένα νέο ASP.Με το όνομα της εφαρμογής NET Web
FormsAuthAd στο Visual C#.NET:
- Ξεκινήστε το Microsoft Visual Studio.NET.
- Από το Το αρχείο μενού, σημείο Νέα, και στη συνέχεια κάντε κλικ στο κουμπί Έργο.
- Κάντε κλικ στο κουμπί Έργα Visual C# στην περιοχή Τύποι έργου, και στη συνέχεια κάντε κλικ στο κουμπί ASP.Εφαρμογή NET Web στην περιοχή Πρότυπα.
- Με το Θέση πλαίσιο, WebApplication1 με αντικατάσταση FormsAuthAd.
- Κάντε κλικ στο κουμπί OK.
- Κάντε δεξιό κλικ του Αναφορές κόμβος στο διάλυμα Explorer και στη συνέχεια κάντε κλικ Προσθήκη αναφοράς.
- Από το .NET στο το Προσθήκη αναφοράς στο παράθυρο διαλόγου, κάντε κλικ στο κουμπί System.DirectoryServices.dll, κάντε κλικ στο κουμπί Επιλέξτε, και στη συνέχεια κάντε κλικ στο κουμπί OK.
Συντάξτε τον κώδικα ελέγχου ταυτότητας
Ακολουθήστε τα εξής βήματα για να δημιουργήσετε ένα νέο αρχείο κλάσης που ονομάζεται
LdapAuthentication.cs:
- Στην Εξερεύνηση λύση, κάντε δεξιό κλικ στον κόμβο έργου σημείο
Για να Προσθήκη, και στη συνέχεια κάντε κλικ στο κουμπί Προσθήκη νέου στοιχείου.
- Κάντε κλικ στο κουμπί Κλάση στην περιοχή Πρότυπα.
- Τύπος LdapAuthentication.cs με το Όνομα πλαίσιο και στη συνέχεια κάντε κλικ Άνοιγμα.
- Αντικαταστήσετε τον υπάρχοντα κώδικα στο αρχείο LdapAuthentication.cs
με τον ακόλουθο κώδικα.
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();
}
}
}
Ο κωδικός ελέγχου ταυτότητας δέχεται έναν τομέα, όνομα χρήστη, μια
κωδικός πρόσβασης και μια διαδρομή για το δέντρο στο Active Directory. Αυτός ο κώδικας που χρησιμοποιεί το
Υπηρεσία παροχής LDAP directory.
Κώδικα στο Logon.aspx τη σελίδα κλήσεις της
LdapAuthentication.IsAuthenticated η μέθοδος και φάσεις στις πιστοποιήσεις που συλλέγονται από το
ο χρήστης. Στη συνέχεια, μια
DirectoryEntry Δημιουργία αντικειμένου με τη διαδρομή στη δομή καταλόγου, ο χρήστης
το όνομα και τον κωδικό πρόσβασης. Το όνομα χρήστη πρέπει να είναι σε μορφή "τομέας\όνομα_χρήστη".
Το
DirectoryEntry αντικείμενο προσπαθεί, στη συνέχεια, για να επιβάλετε την
AdsObject σύνδεση με την απόκτηση του
NativeObject η ιδιότητα. Εάν επιτύχει αυτό, το
CN το χαρακτηριστικό για το χρήστη επιτυγχάνεται, δημιουργώντας ένα
DirectorySearcher αντικείμενο και το φιλτράρισμα από το
SAMAccountName. Μετά τον έλεγχο ταυτότητας του χρήστη, το
IsAuthenticated η μέθοδος επιστρέφει
TRUE.
Για να αποκτήσετε μια λίστα με τις ομάδες στις οποίες ανήκει ο χρήστης
Αυτός ο κωδικός καλεί το
LdapAuthentication.GetGroups μέθοδος. Το
LdapAuthentication.GetGroups η μέθοδος αποκτά μια λίστα ασφαλείας και τις ομάδες διανομής που
ο χρήστης ανήκει, δημιουργώντας ένα
DirectorySearcher αντικείμενο και φιλτράρισμα, σύμφωνα με το
Μέλος το χαρακτηριστικό. Αυτή η μέθοδος επιστρέφει μια λίστα ομάδων που διαχωρίζονται
με καθέτους (|).
Σημειώστε ότι το
LdapAuthentication.GetGroups η μέθοδος χειρίζεται και περικόπτει συμβολοσειρές. Αυτό μειώνει τη διάρκεια
συμβολοσειρά που είναι αποθηκευμένη στο cookie ελέγχου ταυτότητας. Εάν η συμβολοσειρά δεν είναι
περικοπή, η μορφή κάθε ομάδα εμφανίζεται ως εξής.
CN=...,...,DC=domain,DC=com
Αυτό μπορεί να δημιουργήσει μια μεγάλη συμβολοσειρά. Εάν το μήκος αυτής της συμβολοσειράς είναι
μεγαλύτερο από το μήκος του cookie, προγράμματα περιήγησης μπορούν να αποδέχονται cookie ελέγχου ταυτότητας και θα ανακατευθυνθείτε στη σελίδα σύνδεσης. Ωστόσο,
Εάν βρίσκεστε σε περιβάλλον πολλαπλών τομέων, πρέπει να διατηρήσετε το όνομα τομέα
με την ομάδα επειδή ομάδες σε διαφορετικούς τομείς μπορεί να έχει το όνομα του
ίδιο όνομα ομάδας. Πρέπει να διατηρήσετε το όνομα τομέα για να διαφοροποιήσετε μία ομάδα
από την άλλη.
Τα περισσότερα προγράμματα περιήγησης υποστηρίζουν cookies έως 4096 byte. Εάν αυτή η συμβολοσειρά μπορεί δυνητικά
υπερβαίνει το μήκος του cookie
μπορεί να θέλετε να αποθηκεύσετε πληροφορίες ομάδας με το ASP.Αντικείμενο προσωρινής αποθήκευσης Δικτύου ή σε ένα
βάση δεδομένων. Εναλλακτικά, μπορείτε να κρυπτογραφήσετε πληροφορίες ομάδας και
Αποθηκεύστε τις πληροφορίες σε ένα κρυφό πεδίο φόρμας.
Συντάξτε τον κώδικα Global.asax
Ο κώδικας στο αρχείο Global.asax παρέχει ένα
Application_AuthenticateRequest το πρόγραμμα χειρισμού συμβάντων. Αυτό το πρόγραμμα χειρισμού συμβάντων ανακτά τον έλεγχο ταυτότητας
το cookie από το
Context.Request.cookies συλλογή, αποκρυπτογραφεί το cookie και ανακτά τη λίστα των ομάδων
που θα αποθηκευτεί με το
FormsAuthenticationTicket.UserData η ιδιότητα. Οι ομάδες εμφανίζονται σε λίστα που είναι διαχωρισμένες με διοχέτευση
Δημιουργία σελίδας Logon.aspx.
Ο κωδικός αναλύει τη συμβολοσειρά σε ένα
συμβολοσειρά πίνακα για να δημιουργήσετε μια
GenericPrincipal το αντικείμενο. Μετά την
GenericPrincipal Δημιουργία αντικειμένου, αυτό το αντικείμενο τοποθετείται στο του
HttpContext.User η ιδιότητα.
- Στην Εξερεύνηση λύση, κάντε δεξιό κλικ Global.asax, και στη συνέχεια κάντε κλικ στο κουμπί Προβολή κώδικα.
- Προσθέστε τον ακόλουθο κώδικα στο επάνω μέρος του κώδικα πίσω
Το αρχείο Global.asax.CS:
using System.Web.Security;
using System.Security.Principal;
- Αντικαταστήστε το υπάρχον στοιχείο χειρισμού συμβάντος κενή για το Application_AuthenticateRequest με τον ακόλουθο κώδικα.
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;
}
Τροποποιήστε το αρχείο Web.config
Σε αυτήν την ενότητα ρύθμιση του
<forms></forms>, το
<authentication></authentication>, και το
<authorization></authorization> στοιχεία στο αρχείο Web.config. Με αυτές τις αλλαγές μόνο
εξουσιοδοτημένους χρήστες να έχουν πρόσβαση αιτήσεις εφαρμογής και χωρίς έλεγχο ταυτότητας
ανακατευθύνονται σε μια σελίδα Logon.aspx. Μπορείτε να τροποποιήσετε αυτή τη ρύθμιση παραμέτρων για
επιτρέπονται μόνο ορισμένους χρήστες και ομάδες πρόσβαση στην εφαρμογή.
Αντικαταστήσετε τον υπάρχοντα κώδικα στο αρχείο Web.config, με τον ακόλουθο κώδικα.
<?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>
Παρατηρήστε το
<identity impersonate="true"></identity> στοιχείο ρύθμισης παραμέτρων. Αυτό προκαλεί ASP.NET μίμηση του
λογαριασμός που έχει ρυθμιστεί ως ανώνυμο λογαριασμό από το Microsoft Internet
Information Services (IIS). Από αυτήν τη ρύθμιση, όλες τις αιτήσεις
Αυτή η εφαρμογή εκτελείται στο περιβάλλον ασφαλείας του ρυθμισμένου λογαριασμού. Το
χρήστης παρέχει διαπιστευτήρια για να πραγματοποιήσουν έλεγχο ταυτότητας σε υπηρεσία καταλόγου Active Directory, αλλά το
ο λογαριασμός που αποκτά πρόσβαση στο Active Directory είναι ρυθμισμένο λογαριασμό. Για περισσότερες πληροφορίες
πληροφορίες, δείτε το
Αναφορέςενότητα.
Ρύθμιση παραμέτρων των υπηρεσιών IIS για τον ανώνυμο έλεγχο ταυτότητας
Για να ρυθμίσετε τις παραμέτρους των υπηρεσιών IIS για τον ανώνυμο έλεγχο ταυτότητας, ακολουθήστε αυτά
τα βήματα:
- Στις υπηρεσίες IIS, αναπτύξτε τον κόμβο υπολογιστή του διακομιστή, αναπτύξτε το στοιχείο Τοποθεσίες Web, αναπτύξτε το στοιχείο Προεπιλεγμένη τοποθεσία Web, κάντε δεξιό κλικ FormsAuthAd, και στη συνέχεια κάντε κλικ στο κουμπί Ιδιότητες.
- Κάντε κλικ στην επιλογή του Καρτέλα "Ασφάλεια καταλόγου", και στη συνέχεια κάντε κλικ στο κουμπί Επεξεργασία στην περιοχή Ανώνυμη πρόσβαση και έλεγχος ταυτότητας.
- Κάνετε τον ανώνυμο λογαριασμό για την εφαρμογή ενός λογαριασμού με δικαιώματα της υπηρεσίας καταλόγου Active Directory.
- Κάντε κλικ για να καταργήσετε το πλαίσιο ελέγχου δυνατότητα IIS έλεγχος κωδικού πρόσβασης.
- Στην ενότητα "Πρόσβαση με έλεγχο ταυτότητας", καταργήστε την επιλογή του πλαισίου ελέγχου "Ενσωματωμένος έλεγχος ταυτότητας των Windows".
- Κάντε κλικ στο OK.
- Κάντε κλικ στο κουμπί εφαρμογή
Προεπιλεγμένη IUSR_
όνομα_υπολογιστήλογαριασμός έχει δικαίωμα της υπηρεσίας καταλόγου Active Directory.
Δημιουργία σελίδας Logon.aspx
Ακολουθήστε τα εξής βήματα για να δημιουργήσετε ένα νέο ASP.NET φόρμα Web με όνομα
Logon.aspx:
- Στην Εξερεύνηση λύση, κάντε δεξιό κλικ στον κόμβο έργου σημείο
Για να Προσθήκη, και στη συνέχεια κάντε κλικ στο κουμπί Προσθήκη φόρμας Web.
- Τύπος Logon.aspx με το Όνομα πλαίσιο και στη συνέχεια κάντε κλικ Άνοιγμα.
- Στην Εξερεύνηση λύση, κάντε δεξιό κλικ Logon.aspx, και στη συνέχεια κάντε κλικ στο κουμπί Προβολή "Σχεδίαση".
- Κάντε κλικ στην επιλογή του HTML στην καρτέλα στη σχεδίαση.
- Αντικαταστήσετε τον υπάρχοντα κώδικα με τον παρακάτω κώδικα.
<%@ 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> - Τροποποιήστε τη διαδρομή στη σελίδα Logon.aspx για να σας
Ο διακομιστής καταλόγου LDAP.
Σελίδα Logon.aspx είναι μια σελίδα που συλλέγει τις πληροφορίες
από τις μεθόδους και κλήσης χρήστη στον το
LdapAuthentication κλάση. Μετά τον κωδικό ελέγχει την ταυτότητα του χρήστη και αποκτά μια λίστα
ομάδες, ο κώδικας δημιουργεί ένα
FormsAuthenticationTicket αντικείμενο, κρυπτογραφεί το εισιτήριο, προσθέτει το κρυπτογραφημένο εισιτηρίου ένα
το cookie, προσθέτει το cookie του
HttpResponse.Cookies συλλογή, και στη συνέχεια ανακατευθύνει την αίτηση στο URL που είχε
είχατε αρχικά ζητήσει.
Τροποποιήστε τη σελίδα αρχείο WebForm1.aspx
Το αρχείο WebForm1.aspx σελίδας είναι η σελίδα που ζητήθηκε αρχικά.
Όταν ο χρήστης ζητά αυτήν τη σελίδα, γίνεται ανακατεύθυνση για να το Logon.aspx
σελίδα. Μετά τον έλεγχο ταυτότητας της αίτησης, η αίτηση γίνεται ανακατεύθυνση της
Σελίδα αρχείο WebForm1.aspx.
- Στην Εξερεύνηση λύση, κάντε δεξιό κλικ Αρχείο WebForm1.aspx, και στη συνέχεια κάντε κλικ στο κουμπί Προβολή "Σχεδίαση".
- Κάντε κλικ στην επιλογή του HTML στην καρτέλα στη σχεδίαση.
- Αντικαταστήσετε τον υπάρχοντα κώδικα με τον παρακάτω κώδικα.
<%@ 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>
- Αποθήκευση όλων των αρχείων και στη συνέχεια να μεταγλωττίσετε το έργο.
- Αίτηση σελίδας αρχείο WebForm1.aspx. Παρατηρήστε ότι είστε
ανακατεύθυνση Logon.aspx.
- Πληκτρολογήστε τις πιστοποιήσεις σύνδεσης και στη συνέχεια κάντε κλικ στο κουμπί Υποβολή. Σημειώστε ότι όταν γίνεται ανακατεύθυνση στο αρχείο WebForm1.aspx, σας χρήστη
το όνομα εμφανίζεται και ότι LdapAuthentication είναι ο τύπος ελέγχου ταυτότητας για το Context.User.AuthenticationType η ιδιότητα.
Σημείωση Η Microsoft συνιστά να χρησιμοποιήσετε το Secure Sockets Layer (SSL)
κρυπτογράφηση όταν χρησιμοποιείτε έλεγχο ταυτότητας φορμών. Αυτό συμβαίνει επειδή ο χρήστης
προσδιορίζονται με βάση το cookie ελέγχου ταυτότητας και κρυπτογράφησης SSL σε αυτήν
εφαρμογή αποτρέπει άλλα άτομα σε κίνδυνο το cookie ελέγχου ταυτότητας και οποιαδήποτε
άλλες πολύτιμες πληροφορίες που μεταδίδονται.
Για περισσότερες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
306590
(http://support.microsoft.com/kb/306590/
)
ASP.Επισκόπηση ΔΙΚΤΎΟΥ ασφαλείας
317012
(http://support.microsoft.com/kb/317012/
)
Ταυτότητα αίτησης και διαδικασίας στο ASP.NET
311495
(http://support.microsoft.com/kb/311495/
)
Τον τρόπο υλοποίησης που βασίζεται σε ρόλους ασφαλείας με έλεγχο ταυτότητας που βασίζεται σε φόρμες στο σας ASP.NET εφαρμογής χρησιμοποιώντας Visual C#.NET
313091
(http://support.microsoft.com/kb/313091/
)
Τρόπος δημιουργίας κλειδιών με χρήση της Visual Basic.NET για χρήση του ελέγχου ταυτότητας φορμών
313116
(http://support.microsoft.com/kb/313116/
)
Οι αιτήσεις ελέγχου ταυτότητας φορμών δεν μεταβαίνετε στη σελίδα loginUrl