Makale numarası: 316748 - Son Gözden Geçirme: 16 Ekim 2007 Salı - Gözden geçirme: 5.4

Forms kimlik doğrulaması ve Visual C#. NET'i kullanarak, Active Directory karşı kimlik doğrulaması nasıl kullanılır

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Bu makalede, aşağıdaki Microsoft .NET Framework Sınıf Kitaplığı ad alanlarına başvurulmaktadır:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu adım adım makalede, bir ASP.NET nasıl gösterir uygulama Forms kimlik doğrulaması, kullanıcıların karşı Active Directory, Basit Dizin Erişim Protokolü (LDAP) kullanarak kimlik doğrulaması için izin vermek için kullanabilirsiniz. Kullanıcı kimliği doğrulandı ve yeniden yönlendirildi sonra GenericPrincipal bir nesne istek akar HttpContext.User özelliği depolamak için Global.asax dosyası Application_AuthenticateRequest yöntemini kullanabilirsiniz.

Visual C# .NET ASP.NET Web uygulama oluşturma

Visual C# .NET, FormsAuthAd adlı yeni bir ASP.NET Web uygulaması oluşturmak için şu adımları izleyin:
  1. Microsoft Visual Studio .NET'i başlatın.
  2. Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
  3. Project Types altında Visual C# Projects ' ı tıklatın ve ASP.NET Web uygulamasışablonları altında tıklatın.
  4. Konum kutusunda WebApplication1 FormsAuthAd ile değiştirin.
  5. Tamam ' ı tıklatın.
  6. Solution Explorer <a1>Başvurular</a1> düğümünü sağ tıklatın ve sonra da Add Reference</a1>'ı tıklatın.
  7. .NET sekmesinde <a0>Başvuru Ekle</a0> iletişim kutusunda, System.DirectoryServices.dll ' ı tıklatın, sonra da Seç ' i tıklatın ve sonra Tamam ' ı tıklatın.

Kimlik doğrulama kodu yazın

LdapAuthentication.cs adlı yeni bir sınıf dosyası oluşturmak için şu adımları izleyin:
  1. Solution Explorer'da (Çözüm Gezgini), proje düğümünü sağ tıklatın, sonra da Ekle işaret ve sonra Yeni Öğe Ekle'yi tıklatın.
  2. Sınıfşablon altında'ı tıklatın.
  3. LdapAuthentication.cs ' ı <a2>ad</a2> kutusuna yazın ve ' ı tıklatın.
  4. Varolan LdapAuthentication.cs dosyasındaki kodu aşağıdaki kodla değiştirin.
    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();
         }
       }
    }
    					
Kimlik doğrulama kodu, bir etki alanı, bir kullanıcı adı, parola ve konsol ağacında Active Directory'de bir yolunu kabul eder. LDAP Dizin sağlayıcısı, bu kodu kullanır.

Kod Logon.aspx sayfasına LdapAuthentication.IsAuthenticated yöntemini çağırır ve kullanıcıdan toplanan kimlik bilgilerinde geçirir. Daha sonra bir DirectoryEntry nesne yolu dizin ağacı, kullanıcı adı ve parola ile oluşturulur. Kullanıcı adı, "etkialanı\kullanıcıadı" biçiminde olmalıdır. Sonra DirectoryEntry nesne NativeObject özelliği alma tarafından AdsObject bağlantısını zorlamak çalışır. Bu başarılı olursa, CN = özniteliği kullanıcı bir DirectorySearcher nesnesi oluşturarak ve üzerinde SAMAccountName süzme yoluyla elde edilir. Kullanıcının kimliği doğrulandıktan sonra IsAuthenticated yöntemi true değerini döndürür.

Kullanıcının ait olduğu grupların listesini edinmek için <a0></a0>, bu kod, LdapAuthentication.GetGroups yöntemini ça??r?r. LdapAuthentication.GetGroups yöntemi, kullanıcı bir DirectorySearcher nesnesi oluşturarak ve memberOf özniteliği göre süzme yoluyla ait güvenlik ve dağıtım gruplarının bir listesini elde eder. Bu yöntem, kanallar (|) tarafından ayrılmış gruplarının bir listesini döndürür.

LdapAuthentication.GetGroups yöntemi yönetir ve dizelerini kırpar dikkat edin. Bu, kimlik doğrulama tanımlama bilgisinde saklanan dize uzunluğunu azaltır. Dize kesiliyor her grubun biçimi aşağıdaki gibi görünür.
CN=...,...,DC=domain,DC=com
				
Bu işlem çok uzun bir dize oluşturabilir. Bu dize uzunluğunu tanımlama bilgisinin uzunluğundan büyükse, tarayıcılar, kimlik doğrulama tanımlama bilgisini kabul etmeyebilir ve oturum açma sayfasına yönlendirilir. Ancak bir çok etki alanı ortamında, farklı etki alanlarında bulunan gruplar aynı grup adı olabileceği için Grup adı etki alanı adıyla tutmak zorunda kalabilirsiniz. Bir grup diğerinden ayırt edebilmek için etki alanı adı korumak gerekir.

Çoğu tarayıcı tanımlama bilgilerini en fazla 4096 bayt destekler. Bu dize, olası tanımlama bilgisi uzunluğu aşmış olabilir, Grup bilgileri <a0>ASP.NET önbelleği</a0> nesnesindeki veya bir veritabanında depolamak isteyebilirsiniz. Alternatif olarak, Grup bilgileri şifrelemek ve bu gizli bir form alanı depolamak isteyebilirsiniz.

Global.asax kod yazma

Kod Global.asax dosyasına bir <a0>Application_AuthenticateRequest</a0> olay işleyicisi sağlar. Bu olay işleyicisinin kimlik doğrulama tanımlama bilgisini Context.Request.Cookies topluluğundan alır, tanımlama bilgisinin şifresini çözer ve FormsAuthenticationTicket.UserData özelliğinde depolanan grupların listesini alır. Grupları Logon.aspx sayfasına içinde oluşturulan yöneltme ayrılmış bir listesi görüntülenir.

Kod GenericPrincipal bir nesne oluşturmak için bir dize dizisi dizesini ayrıştırır. Bu nesne, GenericPrincipal nesne oluşturulduktan sonra HttpContext.User özelliğinde yer alır.
  1. Solution Explorer'da (Çözüm Gezgini), Global.asax ' ı sağ tıklatın ve Kod Görüntüle</a1>'ı tıklatın.
  2. Üst kodunun - Global.asax.cs dosya arkasında aşağıdaki kodu ekleyin:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Varolan boş olay işleyici için Application_AuthenticateRequest aşağıdaki kodla değiştirin.
    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 dosyasını değiştirme

Bu bölümde, <forms>yapılandırma, <authentication> ve <authorization> Web.config dosyasındaki öğeleri. Bu değişiklikler, yalnızca kimliği doğrulanmış kullanıcıların uygulamayı erişebilir ve kimliği doğrulanmamış isteklerin bir Logon.aspx sayfasına yönlendirilirsiniz. Bu yapılandırma, yalnızca belirli kullanıcılara ve gruplara erişim uygulama izin verecek şekilde değiştirebilirsiniz.

Varolan Web.config dosyasındaki kodu aşağıdaki kodla değiştirin.
<?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>
				
Fark <identity impersonate="true" /> yapılandırma öğesi. Bu, ASP.NET, Microsoft ınternet ınformation Services (IIS)'dan anonim hesap olarak yapılandırılan hesabının kimliğine bürünmek neden olur. Bu yapılandırma işleminin sonucu olarak, bu uygulama için tüm istekleri yapılandırılmış bir hesabın güvenlik bağlamında çalışır. Kullanıcı, Active Directory karşı kimlik doğrulaması için kimlik bilgilerini sağlar, ancak Active Directory erişen yapılandırılmış hesabın hesaptır. Daha fazla bilgi için bkz: References bölümünde.

IIS anonim kimlik doğrulaması için yapılandırma

Anonim kimlik doğrulaması için ııS'YI yapılandırmak için aşağıdaki adımları izleyin:
  1. ııs'de, sunucu bilgisayarın düğümünü genişletin, Web sitelerini genişletin, Varsayılan Web sitesi ' ni genişletin, FormsAuthAd ' ı sağ tıklatın ve sonra da Properties ' i tıklatın.
  2. Dizin Güvenliği sekmesi tıklatın ve sonra Anonim erişim ve doğrulama denetimi altında Düzenle ' yi tıklatın.
  3. Uygulama anonim hesap için Active Directory iznine sahip bir hesabın olun.
  4. IIS denetim parolası izin ver</a0> onay kutusunu tıklatıp temizleyin.
  5. “ Kimliği doğrulanmış erişim ” bölümünde “ tümleşik Windows kimlik doğrulaması ” onay kutusunun işaretini kaldırın.
  6. Tamam'ı tıklatın.
  7. Uygula'yı tıklatın
Varsayılan ıusr_ computername hesabını Active Directory izni yok.

Logon.aspx sayfasına oluşturma

Yeni ASP.NET Web Form Logon.aspx adlı oluşturmak için şu adımları izleyin:
  1. Solution Explorer'da (Çözüm Gezgini), proje düğümünü sağ tıklatın, sonra da Ekle işaret ve Web formu Ekle</a1>'ı tıklatın.
  2. Logon.aspx <a2>ad</a2> kutusuna yazın ve sonra ' ı tıklatın.
  3. Solution Explorer'da (Çözüm Gezgini), Logon.aspx ' ı sağ tıklatın ve sonra da Görünüm Designer ' ı tıklatın.
  4. Tasarımcı <a1>HTML</a1> sekmesini tıklatın.
  5. Replace the existing code with the following code.
    <%@ 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. Logon.aspx sayfasında, LDAP Dizin sunucusuna işaret edecek biçimde yolu değiştirin.
Logon.aspx sayfasına bilgileri, kullanıcı ve arama yöntemleri LdapAuthentication sınıfını toplayan bir sayfadır. Kod, kullanıcının kimliğini doğrular ve gruplarının bir listesini elde eder kodu FormsAuthenticationTicket oluşturur, bilet şifreler, şifrelenmiş anahtar için bir tanımlama bilgisi ekler, tanımlama bilgisinin HttpResponse.Cookies derlemesine ekler sonra sonra isteği, başlangıçta istenen URL'YE yönlendirir.

WebForm1.aspx sayfasını değiştirme

Özgün olarak istenen sayfa WebForm1.aspx sayfasıdır. Kullanıcıyı bu sayfayı istediğinde, isteği yeniden yönlendirilip için Logon.aspx sayfasına. Isteği, istek kimliği doğrulandıktan sonra WebForm1.aspx sayfasına yönlendirilir.
  1. Solution Explorer'da (Çözüm Gezgini), WebForm1.aspx dosyasını sağ tıklatın ve Görünüm Tasarımcısı</a1>'ı tıklatın.
  2. Tasarımcı <a1>HTML</a1> sekmesini tıklatın.
  3. Aşağıdaki code.
    <%@ 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. Tüm dosyaları kaydedin ve sonra Projeyi derleyin.
  5. WebForm1.aspx sayfa isteyin. Logon.aspx için yönlendirileceği dikkat edin.
  6. Oturum açma kimlik bilgilerini yazın ve ardından Gönder ' i tıklatın. WebForm1.aspx yeniden yönlendirilmesi sırasında kullanıcı adınızı görünür dikkat edin ve LdapAuthentication kimlik olduğunu Context.User.AuthenticationType özelliği için yazın.
Not Microsoft Güvenli Yuva Katmanı (SSL) kullanmasını önerir şifreleme Forms kimlik doğrulaması'nı kullanın. Bunun nedeni, kullanıcı kimlik doğrulama tanımlama bilgisini alarak tanımlanır ve bu uygulama, SSL şifrelemesini kimlik doğrulama tanımlama bilgisini ve aktarılmasına neden diğer önemli bilgileri bozmasını herkes engeller olmasıdır.

Referanslar

Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
306590  (http://support.microsoft.com/kb/306590/ ) ASP.NET güvenliğine genel bakış
317012  (http://support.microsoft.com/kb/317012/ ) ASP.NET'te işlem ve istek kimliği (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)
311495  (http://support.microsoft.com/kb/311495/ ) Rol tabanlı güvenlik form tabanlı kimlik doğrulaması ile ASP.NET uygulamanız Visual C#. NET'i kullanarak nasıl
313091  (http://support.microsoft.com/kb/313091/ ) Forms kimlik doğrulaması kullanmak için Visual Basic. NET'i kullanarak anahtarlarını oluşturma hakkında
313116  (http://support.microsoft.com/kb/313116/ ) Form kimlik doğrulama istekleri loginUrl sayfaya yönlendirilirsiniz

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
Anahtar Kelimeler: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB316748 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:316748  (http://support.microsoft.com/kb/316748/en-us/ )