Form kimlik doğrulaması ve Visual Basic .NET kullanarak Active Directory karşı nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 326340 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Bu adım adım makalede, bir ASP.NET nasıl açıklar 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 Basic. NET'te bir ASP.NET Web uygulaması oluşturma

Visual Basic. NET'te 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 Basic Projects ' ı tıklatın ve ASP.NET Web uygulamasışablonları altında tıklatın.
  4. Konum kutusuna http:// <servername>/FormsAuthAd yazın... (Http://localhost (http://localhost/FormsAuthAd varsa ve Tamam ' ı tıklatın şekilde. yerel sunucuyu kullanıyorsanız, değiştirme
  5. Solution Explorer <a1>Başvurular</a1> düğümünü sağ tıklatın ve sonra da Add Reference</a1>'ı tıklatın.
  6. .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.vb 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.vb ' ı <a2>ad</a2> kutusuna yazın ve ' ı tıklatın.
  4. Varolan LdapAuthentication.vb dosyasındaki kodu aşağıdaki kodla değiştirin:
    Imports System
    Imports System.Text
    Imports System.Collections
    Imports System.DirectoryServices
    
    Namespace FormsAuth
        Public Class LdapAuthentication
    
            Dim _path As String
            Dim _filterAttribute As String
    
            Public Sub New(ByVal path As String)
                _path = path
            End Sub
    
            Public Function IsAuthenticated(ByVal domain As String, ByVal username As String, ByVal pwd As String) As Boolean
    
                Dim domainAndUsername As String = domain & "\" & username
                Dim entry As DirectoryEntry = New DirectoryEntry(_path, domainAndUsername, pwd)
    
                Try
                    'Bind to the native AdsObject to force authentication.			
                    Dim obj As Object = entry.NativeObject
                    Dim search As DirectorySearcher = New DirectorySearcher(entry)
    
                    search.Filter = "(SAMAccountName=" & username & ")"
                    search.PropertiesToLoad.Add("cn")
                    Dim result As SearchResult = search.FindOne()
    
                    If (result Is Nothing) Then
                        Return False
                    End If
    
                    'Update the new path to the user in the directory.
                    _path = result.Path
                    _filterAttribute = CType(result.Properties("cn")(0), String)
    
                Catch ex As Exception
                    Throw New Exception("Error authenticating user. " & ex.Message)
                End Try
    
                Return True
            End Function
    
            Public Function GetGroups() As String
                Dim search As DirectorySearcher = New DirectorySearcher(_path)
                search.Filter = "(cn=" & _filterAttribute & ")"
                search.PropertiesToLoad.Add("memberOf")
                Dim groupNames As StringBuilder = New StringBuilder()
    
                Try
                    Dim result As SearchResult = search.FindOne()
                    Dim propertyCount As Integer = result.Properties("memberOf").Count
    
                    Dim dn As String
                    Dim equalsIndex, commaIndex
    
                    Dim propertyCounter As Integer
    
                    For propertyCounter = 0 To propertyCount - 1
                        dn = CType(result.Properties("memberOf")(propertyCounter), String)
    
                        equalsIndex = dn.IndexOf("=", 1)
                        commaIndex = dn.IndexOf(",", 1)
                        If (equalsIndex = -1) Then
                            Return Nothing
                        End If
    
                        groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1))
                        groupNames.Append("|")
                    Next
    
                Catch ex As Exception
                    Throw New Exception("Error obtaining group names. " & ex.Message)
                End Try
    
                Return groupNames.ToString()
            End Function
        End Class
    End Namespace
    
    
    					

Kod açıklaması

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.
Kullanıcı kimlik doğrulaması
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.

Not LDAP, Active Directory ile ilişkili bir nesne için bağlanamıyor kullandığınızda, TCP bağlantı noktaları kullanılıyor. LDAP Artırılmış kullanımını System.DirectoryServices ad kullanılabilir olan tüm TCP bağlantı noktalarını kullanır. Kullanıcılarınızın kimliğini doğrulamak için kullanılan bağlantıyı yeniden kullanma ile TCP yükü azaltmak mümkün olabilir.
Kullanıcı grupları
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 kesilirse, her grup biçimi aşağıdaki gibi görünür:
CN=...,...,DC=domain,DC=com
				
bu çok uzun bir dizeyi oluşturabilirsiniz. Bu dize uzunluğunu tanımlama bilgisinin uzunluğundan büyükse, kimlik doğrulama tanımlama bilgisini oluşturulmayabilir. Bu dize tanımlama bilgisinin uzunluğundan büyük olasılıkla 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 Global.asax.vb dosya arkasındaki kodu, aşağıdaki kodu ekleyin:
    Imports System.Web.Security
    Imports System.Security.Principal
    					
  3. Varolan boş olay işleyici için Application_AuthenticateRequest aşağıdaki kodla değiştirin:
    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
            ' Fires upon attempting to authenticate the use
            Dim cookieName As String = FormsAuthentication.FormsCookieName
            Dim authCookie As HttpCookie = Context.Request.Cookies(cookieName)
    
            If (authCookie Is Nothing) Then
                'There is no authentication cookie.
                Return
            End If
    
            Dim authTicket As FormsAuthenticationTicket = Nothing
    
            Try
                authTicket = FormsAuthentication.Decrypt(authCookie.Value)
            Catch ex As Exception
                'Write the exception to the Event Log.
                Return
            End Try
    
            If (authTicket Is Nothing) Then
                'Cookie failed to decrypt.
                Return
            End If
    
            'When the ticket was created, the UserData property was assigned a
            'pipe-delimited string of group names.
            Dim groups As String() = authTicket.UserData.Split(New Char() {"|"})
    
            'Create an Identity.
            Dim id As GenericIdentity = New GenericIdentity(authTicket.Name, "LdapAuthentication")
    
            'This principal flows throughout the request.
            Dim principal As GenericPrincipal = New GenericPrincipal(id, groups)
    
            Context.User = principal
    
        End Sub
    					

Web.config dosyasını değiştirme

Bu bölümde, forms, authentication ve authorization öğeleri Web.config dosyasında yapılandırın. Bu değişiklikler, yalnızca kimliği doğrulanmış kullanıcılar uygulama 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="60" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				
Bildirimi 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 REFERENCES Bkz: bölüm.

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. ınternet ınformation Services (IIS) yönetim konsolunda, "FormsAuthAd" için sanal dizin düğümünü sağ tıklatın.
  2. Özellikler ' i tıklatın ve sonra Dizin Güvenliği</a0> sekmesini tıklatın.
  3. Anonim erişim ve doğrulama denetimi altında Düzenle ' yi tıklatın.
  4. <a0>Anonim erişim</a0> onay kutusunu seçin.
  5. Uygulama anonim hesap için Active Directory iznine sahip bir hesabın olun.
  6. Temizleyin IIS denetime izin ver parola onay kutusu.
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="vb" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuthAd.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">
    sub Login_Click(sender as object,e as EventArgs)
      Dim adPath as String = "LDAP://DC=..,DC=.." 'Path to your LDAP directory server
      Dim adAuth as LdapAuthentication = new LdapAuthentication(adPath)
      try
        if(true = adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text)) then
          Dim groups as string = adAuth.GetGroups()
    
          'Create the ticket, and add the groups.
          Dim isCookiePersistent as boolean = chkPersist.Checked
          Dim authTicket as FormsAuthenticationTicket = new FormsAuthenticationTicket(1, _
               txtUsername.Text,DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups)
    	
          'Encrypt the ticket.
          Dim encryptedTicket as String = FormsAuthentication.Encrypt(authTicket)
    		
          'Create a cookie, and then add the encrypted ticket to the cookie as data.
          Dim authCookie as HttpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket)
    
          if(isCookiePersistent = true) then
    		authCookie.Expires = authTicket.Expiration
          end if				
          '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."
        end if
     
      catch ex as Exception
        errorLabel.Text = "Error authenticating. " & ex.Message
      end try
    end sub
    </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 edinir sonra kodu bu sırayla aşağıdakileri yapar:
  • bir FormsAuthenticationTicket; oluşturur
  • bilet; şifreler.
  • şifrelenmiş anahtar için bir tanımlama bilgisi; ekler.
  • HttpResponse.Cookies derlemesine; tanımlama bilgisi ekler
  • istek, özgün olarak istenen URL'YE yönlendirir.

WebForm1.aspx sayfayı değiştirin.

Ö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. Varolan kodu aşağıdaki kodla değiştirin:
    <%@ Page language="vb" 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">
    sub Page_Load(sender as object, e as EventArgs)
      lblName.Text = "Hello " + Context.User.Identity.Name & "."
      lblAuthType.Text = "You were authenticated using " &   Context.User.Identity.AuthenticationType & "."
    end sub
    </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.Identity.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:
306590ASP.NET güvenliğine genel bakış
317012ASP.NET'te işlem ve istek kimliği (Bu bağlantı, bir kısmı veya tamamı İngilizce olan içeriğe işaret edebilir.)
306238Rol tabanlı güvenlik form tabanlı kimlik doğrulaması ile ASP.NET uygulamanız Visual Basic. NET'i kullanarak nasıl
313091Forms kimlik doğrulaması kullanmak için Visual Basic. NET'i kullanarak anahtarlarını oluşturma hakkında
313116Form kimlik doğrulama istekleri loginUrl sayfasına yönlendirilir

Özellikler

Makale numarası: 326340 - Last Review: 22 Mart 2007 Perşembe - Gözden geçirme: 4.5
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1
  • Microsoft Visual Basic .NET 2003 Standard Edition
Anahtar Kelimeler: 
kbmt kbconfig kbcookie kbhowtomaster kbsecurity kbwebforms KB326340 KbMttr
Machine-translated Article
Ö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:326340

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