Làm th? nào đ? xác th?c đ?i v?i thư m?c đang ho?t đ?ng b?ng cách s? d?ng các h?nh th?c xác th?c và Visual C#.NET

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 316748 - Xem s?n ph?m mà bài này áp d?ng vào.
Bài vi?t này đ? c?p đ?n Microsoft sau.NET Khuôn kh? không gian tên thư vi?n l?p:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.web.Security
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Bài vi?t-by-step này ch?ng t? làm th? nào m?t ASP.NET ?ng d?ng có th? s? d?ng các h?nh th?c xác th?c cho phép ngư?i dùng xác th?c Đ?i v?i thư m?c đang ho?t đ?ng b?ng cách s? d?ng Lightweight Directory Access Protocol (LDAP). Sau khi ngư?i dùng xác th?c và đ?i hư?ng, b?n có th? s? d?ng các Application_AuthenticateRequest phương pháp c?a t?p tin Global.asax đ? lưu tr? m?t GenericPrincipal đ?i tư?ng trong các HttpContext.User b?t đ?ng s?n ch?y trong su?t theo yêu c?u.

T?o m?t ASP.NET Web ?ng d?ng trong Visual C#.NET

Th?c hi?n theo các bư?c sau đ? t?o ra m?t m?i ASP.NET Web ?ng d?ng đ?t tên FormsAuthAd trong Visual C#.NET:
  1. B?t đ?u Microsoft Visual Studio.NET.
  2. Trên các Tệp tr?nh đơn, đi?m đ?n M?i, sau đó b?m Dự án.
  3. Nh?p vào Visual C# các d? án dư?i Các lo?i d? án, sau đó b?m ASP.NET Web ?ng d?ng dư?i Khuôn mẫu.
  4. Trong các V? trí h?p, thay th? WebApplication1 v?i FormsAuthAd.
  5. Nh?p vào Ok.
  6. Nh?p chu?t ph?i vào các Tham khảo nút trong gi?i pháp Explorer và sau đó nh?p vào Thêm tài li?u tham kh?o.
  7. Trên các .NET th? tab trong các Thêm tài li?u tham kh?o h?p tho?i h?p, b?m vào System.DirectoryServices.dll, b?m Ch?n, sau đó b?m Ok.

Vi?t m? xác th?c

Làm theo các bư?c sau đ? t?o m?t t?p l?p m?i, đ?t tên là LdapAuthentication.cs:
  1. Trong gi?i pháp Explorer, b?m chu?t ph?i vào nút d? án, đi?m đ? Thêm, sau đó b?m Thêm m?c m?i.
  2. Nh?p vào L?p h?c dư?i Khuôn mẫu.
  3. Lo?i LdapAuthentication.cs trong các Tên h?p, và sau đó nh?p vào M?.
  4. Thay th? m? hi?n có trong t?p tin LdapAuthentication.cs v?i đo?n m? sau.
    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();
         }
       }
    }
    					
M? xác th?c ch?p nh?n m?t tên mi?n, tên ngư?i dùng, m?t m?t kh?u và m?t đư?ng d?n đ?n cây trong Active Directory. M? này s? d?ng các Thư m?c LDAP mà nhà cung c?p.

M? s? trong Logon.aspx trang g?i là LdapAuthentication.IsAuthenticated phương pháp và vư?t qua trong các ch?ng ch? đư?c thu th?p t? các ngư?i s? d?ng. Sau đó, m?t DirectoryEntry đ?i tư?ng đư?c t?o ra v?i đư?ng d?n đ?n cây thư m?c, ngư?i s? d?ng tên và m?t kh?u. Tên ngư?i dùng ph?i ? đ?nh d?ng "vùng\tên_ngư?i_dùng". Các DirectoryEntry đ?i tư?ng sau đó c? g?ng đ? bu?c các AdsObject ràng bu?c b?ng cách l?y các NativeObject b?t đ?ng s?n. N?u đi?u này thành công, các CN thu?c tính cho ngư?i s? d?ng đư?c thu đư?c b?ng cách t?o ra m?t DirectorySearcher đ?i tư?ng và b?ng l?c trên các SAMAccountName. Sau khi ngư?i dùng xác th?c, các IsAuthenticated tr? v? phương pháp s? th?t.

Đ? có đư?c m?t danh sách c?a các nhóm ngư?i dùng thu?c v?, m? này g?i các LdapAuthentication.GetGroups phương pháp. Các LdapAuthentication.GetGroups phương pháp l?y đư?c danh sách c?a an ninh và phân ph?i các nhóm mà ngư?i dùng thu?c v? b?ng cách t?o ra m?t DirectorySearcher đ?i tư?ng và b?ng l?c theo các memberOf thu?c tính. Phương pháp này tr? v? m?t danh sách c?a các nhóm b? chia c?t b?i đư?ng ?ng (|).

Nh?n th?y r?ng các LdapAuthentication.GetGroups phương pháp thao túng và truncates dây. Đi?u này làm gi?m đ? dài c?a chu?i đư?c lưu tr? trong cookie xác th?c. N?u các chu?i không c?t ng?n, đ?nh d?ng c?a m?i nhóm xu?t hi?n như sau.
CN=...,...,DC=domain,DC=com
				
Đi?u này có th? t?o ra m?t chu?i r?t dài. N?u chi?u dài c?a chu?i này là l?n hơn đ? dài c?a cookie, các tr?nh duy?t có th? không ch?p nh?n cookie xác th?c, và b?n s? đư?c chuy?n đ?n trang đăng nh?p. Tuy nhiên, N?u b?n đang ? trong m?t môi trư?ng multi-domain, b?n có th? ph?i gi? cho tên mi?n v?i nhóm tên v? nhóm trong tên mi?n khác nhau có th? có các cùng m?t tên nhóm. B?n ph?i gi? cho tên mi?n đ? phân bi?t m?t nhóm t? khác.

H?u h?t các tr?nh duy?t h? tr? cookie lên đ?n 4096 byte. N?u chu?i này có th? có ti?m năng vư?t quá đ? dài c?a cookie, b?n có th? mu?n đ? lưu tr? thông tin nhóm trong ASP.Đ?i tư?ng đ?m ?n NET ho?c trong m?t cơ s? d? li?u. Ngoài ra, b?n có th? mu?n m?t m? hóa thông tin nhóm và lưu thông tin này trong m?t l?nh v?c bi?u m?u ?n.

Vi?t m? Global.asax

M? trong t?p tin Global.asax cung c?p m?t Application_AuthenticateRequest s? ki?n x? l?. X? l? s? ki?n này l?y vi?c xác th?c cookie t? các Context.request.cookies b? sưu t?p, decrypts cookie, và l?y danh sách các nhóm đó s? đư?c lưu tr? trong các FormsAuthenticationTicket.UserData b?t đ?ng s?n. Các nhóm xu?t hi?n trong ?ng tách ra danh sách là t?o ra trong trang Logon.aspx.

M? phân tích chu?i trong m?t chu?i m?ng đ? t?o ra m?t GenericPrincipal đ?i tư?ng. Sau khi các GenericPrincipal đ?i tư?ng đư?c t?o ra, đ?i tư?ng này đư?c đ?t trong các HttpContext.User b?t đ?ng s?n.
  1. Trong gi?i pháp Explorer, b?m chu?t ph?i vào Global.asax, sau đó b?m Xem m?.
  2. Thêm m? sau ? đ?u m? đ?ng sau Global.asax.CS t?p tin:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Thay th? b? x? l? s? ki?n có s?n ph?m nào s?n có cho các Application_AuthenticateRequest v?i đo?n m? sau.
    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;
    	
    }
    					

Ch?nh s?a Web.config file

Trong ph?n này, b?n c?u h?nh các <forms></forms>, các <authentication></authentication>, và các <authorization></authorization> các y?u t? trong Web.config file. V?i nh?ng thay đ?i, ch? xác th?c ngư?i dùng có th? truy c?p các ?ng d?ng, và unauthenticated yêu c?u đư?c chuy?n đ?n m?t trang Logon.aspx. B?n có th? s?a đ?i c?u h?nh này đ?n cho phép ch? có m?t s? ngư?i dùng và các nhóm quy?n truy c?p vào các ?ng d?ng.

Thay th? m? hi?n có trong t?p tin Web.config v?i đo?n m? sau.
<?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>
				
Thông báo các <identity impersonate="true"></identity> c?u h?nh ph?n t?. Đi?u này gây ra ASP.NET m?o danh các tài kho?n đư?c c?u h?nh như các tài kho?n chưa xác đ?nh ngư?i t? Microsoft Internet Information Services (IIS). Như là k?t qu? c?a vi?c c?u h?nh này, t?t c? các yêu c?u đ? ?ng d?ng này ch?y theo ng? c?nh b?o m?t c?a tài kho?n đư?c c?u h?nh. Các ngư?i s? d?ng cung c?p thông tin đăng nh?p đ? xác th?c đ?i v?i Active Directory, nhưng các tài kho?n ch? y?u truy c?p Active Directory là tài kho?n đư?c c?u h?nh. Đ? bi?t thêm thông tin, xem các Tham khảokeá tieáp.

C?u h?nh IIS cho vô danh xác th?c

Đ? c?u h?nh IIS cho vô danh xác th?c, làm theo các bư?c sau:
  1. Trong IIS, m? r?ng nút máy tính cho máy ch? c?a b?n, m? r?ng Các trang web, m? r?ng Trang Web m?c đ?nh, b?m chu?t ph?i vào FormsAuthAd, sau đó b?m Thu?c tính.
  2. B?m vào các Thư m?c Security Tab, sau đó b?m Ch?nh s?a dư?i Chưa xác đ?nh ngư?i truy c?p và đi?u khi?n xác th?c.
  3. Làm cho các tài kho?n chưa xác đ?nh ngư?i cho ?ng d?ng trương m?c có quy?n trong Active Directory.
  4. Nh?n vào đây đ? b? ch?n h?p ki?m cho phép IIS đ? đi?u khi?n m?t kh?u.
  5. Trong ph?n "Truy c?p xác th?c", b? ch?n h?p ki?m "Integrated Windows Authentication".
  6. Bấm OK.
  7. Click vào áp d?ng
M?c đ?nh IUSR_computernametài kho?n không có s? cho phép thư m?c ho?t đ?ng.

T?o trang Logon.aspx

Th?c hi?n theo các bư?c sau đ? t?o ra m?t m?i ASP.NET Web m?u đ?t tên Logon.aspx:
  1. Trong gi?i pháp Explorer, b?m chu?t ph?i vào nút d? án, đi?m đ? Thêm, sau đó b?m Thêm m?u Web.
  2. Lo?i Logon.aspx trong các Tên h?p, và sau đó nh?p vào M?.
  3. Trong gi?i pháp Explorer, b?m chu?t ph?i vào Logon.aspx, sau đó b?m Xem thi?t k?.
  4. B?m vào các HTML th? nhà thi?t k?.
  5. Thay th? m? hi?n có v?i đo?n m? sau.
    <%@ 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. S?a đ?i đư?ng d?n trong Logon.aspx đ? tr? đ?n trang c?a b?n H? ph?c v? LDAP Directory.
Các trang Logon.aspx là m?t trang mà thu th?p thông tin t? ngư?i dùng và các cu?c g?i các phương pháp trên các LdapAuthentication l?p h?c. Sau khi m? authenticates ngư?i s? d?ng và l?y đư?c danh sách các nhóm, các m? t?o ra m?t FormsAuthenticationTicket đ?i tư?ng, m? hóa vé, cho bi?t thêm vé đư?c m? hóa v?i m?t cookie, cho bi?t thêm các cookie đ? các HttpResponse.Cookies b? sưu t?p, và sau đó chuy?n hư?ng đ?n các yêu c?u URL Ban đ?u đư?c yêu c?u.

S?a đ?i trang WebForm1.aspx

WebForm1.aspx trang là trang đư?c yêu c?u ban đ?u. Khi ngư?i dùng yêu c?u Trang này, yêu c?u đư?c chuy?n hư?ng đ?n Logon.aspx Trang. Sau khi yêu c?u đư?c xác th?c, yêu c?u đư?c chuy?n hư?ng đ?n các WebForm1.aspx trang.
  1. Trong gi?i pháp Explorer, b?m chu?t ph?i vào WebForm1.aspx, sau đó b?m Xem thi?t k?.
  2. B?m vào các HTML th? nhà thi?t k?.
  3. Thay th? m? hi?n có v?i đo?n m? sau.
    <%@ 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. Lưu t?t c? các file và sau đó biên d?ch d? án.
  5. Yêu c?u các trang WebForm1.aspx. Thông báo r?ng b?n đang có chuy?n hư?ng đ?n Logon.aspx.
  6. Nh?p ?y nhi?m đăng nh?p, và sau đó nh?p vào Gửi. Khi b?n đang chuy?n hư?ng đ?n WebForm1.aspx, nh?n th?y r?ng ngư?i dùng c?a b?n tên xu?t hi?n và r?ng LdapAuthentication là ki?u xác th?c cho các Context.user.AuthenticationType b?t đ?ng s?n.
Chú ý Microsoft khuy?n cáo b?n s? d?ng Secure Sockets Layer (SSL) m?t m? hoá khi b?n s? d?ng các h?nh th?c xác th?c. Đi?u này là do ngư?i s? d?ng đư?c xác đ?nh d?a trên cookie xác th?c và m?t m? hoá SSL v? đi?u này ?ng d?ng ngăn ch?n b?t c? ai t? ?nh hư?ng đ?n cookie xác th?c và b?t k? thông tin giá tr? mà đang đư?c truy?n đi.

THAM KH?O

Đ? bi?t thêm chi ti?t, nh?p vào s? bài vi?t sau đ? xem các bài vi?t trong cơ s? ki?n th?c Microsoft:
306590ASP.T?ng quan v? an ninh m?ng
317012 Quá tr?nh và yêu c?u danh tính trong ASP.NET
311495 Làm th? nào đ? th?c hi?n d?a trên vai tr? an ninh v?i d?a trên các h?nh th?c xác th?c trong ASP c?a b?n.NET ?ng d?ng b?ng cách s? d?ng Visual C#.NET
313091 Làm th? nào đ? t?o ra phím b?ng cách s? d?ng Visual Basic.NET đ? s? d?ng trong các h?nh th?c xác th?c
313116 Các h?nh th?c xác th?c yêu c?u không đư?c hư?ng d?n đ?n trang loginUrl

Thu?c tính

ID c?a bài: 316748 - L?n xem xét sau cùng: 27 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
T? khóa: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:316748

Cung cấp Phản hồi

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com