Form kimlik doğrulaması ve Visual C# .NET kullanarak Active Directory'ye karşı doğrulamak nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 316748 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makalede, aşağıdaki Microsoft .NET Framework sınıf kitaplığı ad alanlarına başvurur:
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu adım adım makalede, bir ASP.NET uygulamasına karşı Active Directory Basit Dizin Erişim Protokolü (LDAP) kullanarak doğrulamak için kullanıcılara izin vermek için form kimlik doğrulaması nasıl kullanabileceğinizi gösterir. Sonra kullanıcı kimlik doğrulaması ve yeniden yönlendirilen istek akar HttpContext.User özelliğinde bir GenericPrincipal nesnesi depolamak için Global.asax dosyası Application_AuthenticateRequest yöntemini kullanabilirsiniz.

Visual C# .NET ile bir ASP.NET Web uygulaması yaratın

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 ve sonra Proje'yitıklatın.
  3. Visual C# projeleri içinProje türlerialtında tıklatın ve Şablonlaraltında ASP.NET Web uygulaması ' nı tıklatın.
  4. Konum kutusunda, WebApplication1 ile değiştir FormsAuthAd.
  5. Tamam' ı tıklatın.
  6. Solution Explorer içindeki Başvurular düğümünü sağ tıklatın ve sonra Add Reference' ı tıklatın.
  7. Add Reference iletişim kutusunda .NET sekmesinde System.DirectoryServices.dllseçeneğini tıklatın, 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. Çözüm Gezgini'nde, noktası Ekle, proje düğümüne sağ tıklayın ve Add New Item' ı tıklatın.
  2. Sınıfşablonlarıaltında'ı tıklatın.
  3. Türü LdapAuthentication.csad kutusuna ve sonra da ' ı tıklatın.
  4. Aşağıdaki kod LdapAuthentication.cs yazın varolan kodu 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ı, kullanıcı adı, parola ve Active Directory ağacında yolunu kabul eder. LDAP dizin sağlayıcısı bu kodu kullanır.

Logon.aspx sayfasına kod LdapAuthentication.IsAuthenticated yöntemini çağırır ve kullanıcıdan toplanan kimlik bilgileri geçirir. Daha sonra dizin ağacında, kullanıcı adı ve parola yolu ile bir DirectoryEntry nesnesi oluşturulur. Kullanıcı adı "etkialanı\kullanıcıadı" biçiminde olmalıdır. DirectoryEntry nesnesinin NativeObject özelliğini elde ederek AdsObject bağlama zorlamak sonra çalışır. Bu işlem başarılı olursa, CN = özniteliği kullanıcı için bir DirectorySearcher nesnesi oluşturarak ve üzerinde SAMAccountNamesüzme yoluyla elde edilir. Kullanıcının kimliği doğrulandıktan sonra IsAuthenticated yöntemi truedeğerini döndürür.

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

LdapAuthentication.GetGroups yöntemi yönetir ve dizeleri keser dikkat edin. Bu kimlik doğrulama tanımlama bilgilerinde depolanan dize uzunluğunu azaltır. Dize kesilmiş değil, her grup biçimi aşağıdaki gibi görünür.
CN=...,...,DC=domain,DC=com
				
Bu çok uzun bir dize oluşturabilir. Bu dizenin uzunluğu tanımlama uzunluğundan büyükse, tarayıcılar, kimlik doğrulama tanımlama bilgisi kabul etmeyebilir ve oturum açma sayfasına yönlendirilir. Ancak, bir çoklu etki alanı ortamında çalışıyorsanız, gruplar farklı etki alanlarında aynı ada sahip olabileceğinden, grup adı etki alanı adıyla tutmak zorunda kalabilirsiniz. Bir grup diğerlerinden ayırt etmek için etki alanı adı tutmak zorunda.

Çoğu tarayıcılar çerezleri en fazla 4096 bayt desteklemez. Bu dize uzunluğu tanımlama bilgisi, büyük olasılıkla aşabilir grup bilgileri ASP.NET önbellek nesnesi veya bir veritabanında depolamak isteyebilirsiniz. Alternatif olarak, grup bilgileri şifrelemek ve gizli form alanı ile bu bilgileri depolamak isteyebilirsiniz.

Global.asax kod yazma

Application_AuthenticateRequest olay işleyicisini Global.asax dosyasındaki kodu sağlar. Bu olay işleyicisi Context.Request.Cookies koleksiyonundan kimlik doğrulama tanımlama bilgisini alır, tanımlama bilgisi şifresini çözer ve FormsAuthenticationTicket.UserData özelliğinde depolanan gruplarının listesini alır. Gruplar, Logon.aspx sayfasına içinde oluşturulan kanal ayrılmış bir liste olarak görünür.

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 yerleştirilir.
  1. Çözüm Gezgini'nde, Global.asaxsağ tıklatın ve Kod Görüntüle'yitıklatın.
  2. Kod behindGlobal.asax.cs dosyasının en üstünde aşağıdaki kodu ekleyin:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. Varolan boş olay işleyicisi için Application_AuthenticateRequest aşağıdaki kod ile 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, yapılandırdığınız <forms> </forms>, <authentication> </authentication>ve <authorization></authorization> Web.config dosyasındaki öğeleri. Bu değişiklikler, yalnızca kimliği doğrulanmış kullanıcıların uygulamaya erişebilecekleri ve kimliği doğrulanmamış isteklerin Logon.aspx sayfasına yönlendirilirsiniz. Yalnızca belirli kullanıcıları ve grupları uygulamaya erişmeye izin vermek için bu yapılandırmayı değiştirebilirsiniz.

Web.config dosyasında varolan 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>
				
Dikkat edin <identity impersonate="true"></identity> yapılandırma öğesi. Bu, ASP.NET, Microsoft Internet Information Services (IIS) dan adsız hesabı olarak yapılandırılmış hesabın özelliklerini almasına neden olur. Bu yapılandırma sonucu olarak, bu uygulama için tüm istekleri yapılandırılmış hesabın güvenlik bağlamında çalışır. Kullanıcı Active Directory'de kimlik doğrulaması için kimlik bilgilerini sağlar, ancak Active Directory'ye erişen yapılandırılan hesabı hesabıdır. Daha fazla bilgi için bkz. Başvurular .

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

IIS anonim kimlik doğrulaması için yapılandırmak için şu adımları izleyin:
  1. IIS Yöneticisi'nde, sunucu bilgisayarın düğümünü genişletin, Web siteleri' ni genişletin, Varsayılan Web sitesinigenişletin, FormsAuthAdsağ tıklatın ve sonra Özellikler' i tıklatın.
  2. Dizin Güvenliği sekmesinitıklatın ve ardından Anonim erişim ve doğrulama denetimialtında Düzenle ' yi tıklatın.
  3. Uygulaması için anonim hesabın Active Directory izni olan bir hesap yapın.
  4. IIS denetim parolasını izin ver onay kutusunu tıklatıp temizleyin.
  5. "Erişim kimlik doğrulaması" 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
IUSR_ varsayılanBilgisayarAdı hesabı Active Directory izni yok.

Logon.aspx sayfasına oluşturun

Logon.aspx adlı yeni bir ASP.NET Web formu oluşturmak için şu adımları izleyin:
  1. Çözüm Gezgini'nde, noktası Ekle, proje düğümüne sağ tıklayın ve sonra Add Web Form'utıklatın.
  2. Türü Logon.aspxad kutusuna ve sonra da ' ı tıklatın.
  3. Çözüm Gezgini'nde, Logon.aspxsağ tıklatın ve Görünüm Tasarımcısı' nı tıklatın.
  4. Tasarımcı HTML sekmesini tıklatın.
  5. Varolan kodu aşağıdaki kodla değiştirin.
    <%@ 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. Yolu Logon.aspx sayfasına yourLDAP sunucuya işaret edecek şekilde değiştirin.
Logon.aspx sayfasına bilgileri kullanıcı ve arama yöntemleri LdapAuthentication sınıf üzerinde toplayan bir sayfadır. Kod, kullanıcının kimliğini doğrular ve gruplarının bir listesini alır sonra kodu bir FormsAuthenticationTicket nesnesi oluşturur, anahtarı şifreler, şifrelenmiş anahtar için bir tanımlama bilgisi ekler, tanımlama bilgisi HttpResponse.Cookies koleksiyonuna ekler ve sonra istek başlangıçta istenen URL'ye yönlendirir.

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

WebForm1.aspx sayfasının başlangıçta istenen sayfasıdır. Kullanıcı bu sayfayı istediğinde, istek Logon.aspx sayfasına yönlendirilir. İstek kimliği doğrulandıktan sonra istek WebForm1.aspx sayfasına yönlendirilir.
  1. Solution Explorer'da WebForm1.aspxdosyasını sağ tıklatın ve Görünüm Tasarımcısı' nı tıklatın.
  2. Tasarımcı HTML sekmesini tıklatın.
  3. Varolan kodu aşağıdaki kodla değiştirin.
    <%@ 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 sayfasının isteyin. Bu, areredirected Logon.aspx için dikkat edin.
  6. Oturum açma kimlik bilgilerini yazın ve sonra Gönder' i tıklatın. WebForm1.aspx dosyasına yönlendirilir, kullanıcı adınızı görünür dikkat edin ve LdapAuthentication kimlik doğrulama, Context.User.AuthenticationType özelliği için yazın.
Not Microsoft Forms kimlik doğrulamasını kullandığınızda, Güvenli Yuva Katmanı (SSL) şifrelemesi kullanmanızı önerir. Bu kullanıcı tabanlı kimlik doğrulama tanımlama bilgisi üzerinde tanımlanır ve bu uygulaması üzerinde SSL şifrelemesi herkes kimlik doğrulama tanımlama bilgisi ve aktarılıyor herhangi bir değerli bilgilerini bozmasını önler çünkü.

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 ASP.NET güvenliğine genel bakış
317012 ASP.NET işlem ve istek kimliği
311495 Rol tabanlı güvenlik form tabanlı kimlik doğrulaması ile ASP.NET uygulamanızı Visual C# .NET kullanarak gerçekleştirme
313091 Form kimlik doğrulaması kullanmak için Visual Basic .NET kullanarak anahtarları oluşturma
313116 Formlar kimlik doğrulama isteklerini loginUrl sayfasına yönlendirilir değil

Özellikler

Makale numarası: 316748 - Last Review: 2 Nisan 2014 Çarşamba - Gözden geçirme: 9.0
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: 
kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms kbmt KB316748 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, Microsoft Makine Çevirisi Düzenleme yazılımı tarafından tercüme edilmiş olup, yüksek olasılıkla profesyonel bir çevirmen yerine CTF teknolojisi kullanılarak, Microsoft Topluluğu tarafından düzenlenmiştir. Microsoft, Bilgi Bankamız içindeki tüm makaleleri kendi dilinizde okuyabilmeniz için size hem profesyonel çevirmenler tarafından tercüme edilen hem de makine tarafından tercüme edildikten sonra Topluluk tarafından kontrol edilen makaleler sunar. Bununla birlikte, makine tarafından tercüme edilen, hatta Topluluk tarafından kontrol edilen bir makale bile her zaman mükemmel dil kalitesinde olmayabilir. Makalede dilinizi konuşan yabancı birisinin yapabileceği türden sözcük, söz dizimi veya dilbilgisi hataları bulunabilir. Microsoft, içeriğin hatalı tercümesinin veya müşterilerimiz tarafından kullanımının doğurabileceği olası yanlış anlamalar, hatalar veya zararlardan sorumlu değildir. Öte yandan Microsoft, Makine Çevirisi Düzenleme işlemini geliştirmek amacıyla Makine Çevirisi Düzenleme yazılımını ve araçlarını sık sık güncelleştirmektedir.
Makalenin İngilizcesi aşağıdaki gibidir: 316748

Geri Bildirim Ver

 

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