Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

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

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
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
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

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 316748 - Xem lại Lần cuối: 08/27/2011 23:33:00 - Bản sửa đổi: 2.0

Microsoft Visual C# .NET 2003 Standard Edition, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0

  • kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtvi
Phản hồi