Bagaimana untuk melakukan otentikasi terhadap Active Directory menggunakan bentuk-bentuk otentikasi dan Visual C#.NET

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 316748 - Melihat produk di mana artikel ini berlaku.
Artikel ini merujuk kepada Microsoft berikut.NET Kerangka perpustakaan kelas namespaces:
  • System.text
  • System.DirectoryServices
  • System.Security.Principal
  • System.web.Security
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Artikel ini menunjukkan bagaimana ASP.NET aplikasi dapat menggunakan bentuk-bentuk otentikasi untuk mengizinkan pengguna untuk melakukan otentikasi terhadap Active Directory menggunakan Lightweight Directory Access Protocol (LDAP). Setelah pengguna dikonfirmasi dan dialihkan, Anda dapat menggunakan Application_AuthenticateRequest metode Global.asax file untuk menyimpan GenericPrincipal objek dalam HttpContext.User properti yang mengalir sepanjang permintaan.

Menciptakan situs web ASP.Aplikasi NET Web dalam Visual C#.NET

Ikuti langkah berikut untuk membuat ASP baru.NET Web aplikasi bernama FormsAuthAd di Visual C#.NET:
  1. Mulai Microsoft Visual Studio.NET.
  2. Pada Berkas menu, titik Baru, lalu klik Project.
  3. Klik Visual C# proyek di bawah Jenis proyek, lalu klik ASP.Aplikasi NET Web di bawah Pola acu.
  4. Dalam Lokasi kotak, menggantikan WebApplication1 dengan FormsAuthAd.
  5. Klik Oke.
  6. Klik kanan Referensi simpul dalam Explorer solusi, dan kemudian klik Menambahkan referensi.
  7. Pada .NET tab di Menambahkan referensi kotak dialog, klik System.DirectoryServices.dll, klik Pilih, lalu klik Oke.

Menulis kode otentikasi

Ikuti langkah-langkah untuk membuat file kelas baru bernama LdapAuthentication.cs:
  1. Dalam solusi Explorer, klik kanan node proyek, titik untuk Tambahkan, lalu klik Menambah Item baru.
  2. Klik Kelas di bawah Pola acu.
  3. Jenis LdapAuthentication.cs dalam Nama kotak, dan kemudian klik Terbuka.
  4. Mengganti kode yang ada dalam LdapAuthentication.cs file dengan kode berikut.
    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();
         }
       }
    }
    					
Kode otentikasi menerima domain, nama pengguna, password, dan jalan ke pohon direktori aktif. Kode ini menggunakan LDAP direktori penyedia.

Kode dalam Logon.aspx halaman panggilan LdapAuthentication.IsAuthenticated metode dan melewati di kredensial yang dikumpulkan dari pengguna. Kemudian, DirectoryEntry objek dibuat dengan path ke direktori, pengguna nama, dan sandi. Nama pengguna harus dalam format "domain\username". The DirectoryEntry objek kemudian mencoba untuk memaksa AdsObject mengikat dengan mendapatkan NativeObject properti. Jika ini berhasil, CN atribut untuk pengguna yang diperoleh dengan menciptakan DirectorySearcher objek dan oleh penyaringan di SAMAccountName. Setelah pengguna dikonfirmasi, IsAuthenticated metode kembali benar.

Untuk mendapatkan daftar kelompok pengguna milik, kode ini panggilan LdapAuthentication.GetGroups metode. The LdapAuthentication.GetGroups metode memperoleh daftar keamanan dan kelompok-kelompok distribusi yang pengguna milik dengan menciptakan DirectorySearcher objek dan oleh penyaringan menurut memberOf atribut. Metode ini mengembalikan daftar dari kelompok yang terpisah oleh pipa (|).

Perhatikan bahwa LdapAuthentication.GetGroups metode memanipulasi dan memotong string. Hal ini mengurangi panjang string yang disimpan dalam cookie otentikasi. Jika string tidak terpotong, format setiap kelompok muncul sebagai berikut.
CN=...,...,DC=domain,DC=com
				
Ini dapat membuat sebuah string yang sangat panjang. Jika panjang string ini adalah lebih besar daripada panjang cookie, browser mungkin tidak menerima kuki pembuktian, dan Anda akan diarahkan ke halaman logon. Namun, Jika Anda berada di lingkungan multi-domain, Anda mungkin harus menjaga nama domain dengan kelompok nama karena kelompok di domain yang berbeda dapat memiliki nama kelompok yang sama. Anda harus menjaga nama domain untuk membedakan satu kelompok dari yang lain.

Kebanyakan browser mendukung cookie hingga 4096 byte. Jika string ini mungkin berpotensi melebihi panjang cookie, Anda mungkin ingin menyimpan informasi grup di ASP.NET Cache objek atau di database. Atau, Anda mungkin ingin mengenkripsi informasi grup dan menyimpan informasi ini dalam formulir tersembunyi lapangan.

Menulis kode Global.asax

Kode dalam Global.asax file menyediakan Application_AuthenticateRequest event handler. Ini event handler mengambil otentikasi cookie dari Context.request.cookies Koleksi, mendekripsi cookie, dan mengambil daftar grup yang akan disimpan di FormsAuthenticationTicket.UserData properti. Kelompok yang tercantum dalam daftar terpisah pipa yang dibuat di halaman Logon.aspx.

Kode mem-parsing string dalam array string untuk membuat GenericPrincipal objek. Setelah GenericPrincipal objek dibuat, objek ini ditempatkan di HttpContext.User properti.
  1. Dalam solusi Explorer, klik kanan Global.asax, lalu klik Lihat kode.
  2. Menambahkan kode berikut di bagian atas kode di belakang Global.asax.cs file:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Menggantikan yang ada kosong event handler untuk Application_AuthenticateRequest dengan kode berikut.
    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;
    	
    }
    					

Memodifikasi Web.config file

Dalam bagian ini, Anda mengkonfigurasi <forms></forms>, the <authentication></authentication>, dan <authorization></authorization> unsur-unsur dalam Web.config file. Dengan perubahan ini, hanya dikonfirmasi pengguna dapat mengakses aplikasi, dan tidak terauthentikasi permintaan akan diarahkan ke halaman Logon.aspx. Anda dapat mengubah konfigurasi ini untuk izin hanya pengguna dan grup akses ke aplikasi tertentu.

Mengganti kode yang ada dalam Web.config file dengan kode berikut.
<?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>
				
Pemberitahuan <identity impersonate="true"></identity> konfigurasi elemen. Hal ini menyebabkan ASP.NET untuk meniru account yang dikonfigurasi sebagai account anonim dari Microsoft Internet Information Services (IIS). Sebagai hasil dari konfigurasi ini, semua permintaan untuk aplikasi ini berjalan di bawah konteks keamanan account dikonfigurasi. The pengguna memberikan mandat untuk mengotentikasi terhadap Active Directory, tetapi rekening yang mengakses direktori aktif adalah rekening dikonfigurasi. Untuk lebih informasi, lihat Referensibagian.

Mengkonfigurasi IIS untuk otentikasi anonim

Untuk mengkonfigurasi IIS untuk otentikasi anonim, ikuti langkah-langkah:
  1. Dalam IIS, memperluas node komputer untuk server Anda, memperluas Situs web, memperluas Situs Web standar, klik kanan FormsAuthAd, lalu klik Properti.
  2. Klik Tab keamanan direktori, lalu klik Mengedit di bawah Akses anonim dan kontrol otentikasi.
  3. Membuat account anonim untuk aplikasi account yang memiliki izin untuk Active Directory.
  4. Klik untuk mengosongkan kotak centang memungkinkan IIS untuk kontrol Password.
  5. Dalam "Keasliannya akses" bagian, Hapus centang kotak centang "Terpadu Windows otentikasi".
  6. Klik OK.
  7. Klik menerapkan
Default IUSR_computernameaccount tidak memiliki izin untuk Active Directory.

Membuat halaman Logon.aspx

Ikuti langkah berikut untuk membuat ASP baru.Formulir Web NET bernama Logon.aspx:
  1. Dalam solusi Explorer, klik kanan node proyek, titik untuk Tambahkan, lalu klik Tambahkan formulir Web.
  2. Jenis Logon.aspx dalam Nama kotak, dan kemudian klik Terbuka.
  3. Dalam solusi Explorer, klik kanan Logon.aspx, lalu klik Lihat desainer.
  4. Klik HTML tab di perancang.
  5. Mengganti kode yang ada dengan kode berikut.
    <%@ 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. Mengubah jalan di halaman Logon.aspx untuk menunjuk ke Anda Server LDAP Directory.
Logon.aspx halaman adalah halaman yang mengumpulkan informasi dari pengguna dan panggilan metode pada LdapAuthentication kelas. Setelah kode mengotentikasi pengguna dan memperoleh daftar kelompok, kode menciptakan FormsAuthenticationTicket objek, mengenkripsi tiket, tiket dienkripsi untuk menambahkan kuki, menambahkan cookie untuk HttpResponse.Cookies Koleksi, dan kemudian mengarahkan permintaan ke URL yang awalnya diminta.

Memodifikasi halaman WebForm1.aspx

WebForm1.aspx halaman adalah halaman yang diminta awalnya. Bila pengguna meminta Halaman ini, permintaan diarahkan ke Logon.aspx Halaman. Setelah permintaan dikonfirmasi, permintaan dialihkan untuk WebForm1.aspx halaman.
  1. Dalam solusi Explorer, klik kanan WebForm1.aspx, lalu klik Lihat desainer.
  2. Klik HTML tab di perancang.
  3. Mengganti kode yang ada dengan kode berikut.
    <%@ 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. Simpan semua file, dan kemudian kompilasi proyek.
  5. Permintaan halaman WebForm1.aspx. Pemberitahuan bahwa Anda diarahkan ke Logon.aspx.
  6. Ketik kredensial masuk, dan kemudian klik Kirim. Ketika Anda akan diarahkan ke WebForm1.aspx, perhatikan bahwa pengguna Anda nama muncul dan yang LdapAuthentication Jenis otentikasi untuk Context.user.AuthenticationType properti.
Catatan Microsoft menganjurkan agar Anda menggunakan Secure Sockets Layer (SSL) enkripsi ketika Anda menggunakan bentuk-bentuk otentikasi. Hal ini karena pengguna diidentifikasi berdasarkan kuki pembuktian, dan enkripsi SSL ini aplikasi mencegah orang mengorbankan cookie otentikasi dan setiap informasi berharga lainnya yang ditransmisikan.

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
306590ASP.Ikhtisar bersih keamanan
317012 Proses dan permintaan identitas di ASP.NET
311495 Bagaimana menerapkan berbasis peran keamanan dengan otentikasi berbasis bentuk di ASP Anda.NET aplikasi dengan menggunakan Visual C#.NET
313091 Cara membuat tombol dengan menggunakan Visual Basic.NET untuk digunakan dalam bentuk-bentuk otentikasi
313116 Bentuk-bentuk otentikasi permintaan tidak diarahkan ke halaman loginUrl

Properti

ID Artikel: 316748 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Kata kunci: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:316748

Berikan Masukan

 

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