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:
- Microsoft Visual Studio .NET'i başlatın.
- Dosya menüsünde Yeni ' nin üzerine gelin ve sonra Project ' i tıklatın.
- Project Types altında Visual Basic Projects ' ı tıklatın ve ASP.NET Web uygulamasışablonları altında tıklatın.
- 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
- Solution Explorer <a1>Başvurular</a1> düğümünü sağ tıklatın ve sonra da Add Reference</a1>'ı tıklatın.
- .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:
- 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.
- Sınıfşablon altında'ı tıklatın.
- LdapAuthentication.vb ' ı <a2>ad</a2> kutusuna yazın ve Aç ' ı tıklatın.
- 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.
- Solution Explorer'da (Çözüm Gezgini), Global.asax ' ı sağ tıklatın ve Kod Görüntüle</a1>'ı tıklatın.
- Üst Global.asax.vb dosya arkasındaki kodu, aşağıdaki kodu ekleyin:
Imports System.Web.Security
Imports System.Security.Principal
- 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:
- ınternet ınformation Services (IIS) yönetim konsolunda, "FormsAuthAd" için sanal dizin düğümünü sağ tıklatın.
- Özellikler ' i tıklatın ve sonra Dizin Güvenliği</a0> sekmesini tıklatın.
- Anonim erişim ve doğrulama denetimi altında Düzenle ' yi tıklatın.
- <a0>Anonim erişim</a0> onay kutusunu seçin.
- Uygulama anonim hesap için Active Directory iznine sahip bir hesabın olun.
- 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:
- 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.
- Logon.aspx <a2>ad</a2> kutusuna yazın ve sonra Aç ' ı tıklatın.
- Solution Explorer'da (Çözüm Gezgini), Logon.aspx ' ı sağ tıklatın ve sonra da Görünüm Designer ' ı tıklatın.
- Tasarımcı <a1>HTML</a1> sekmesini tıklatın.
- 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>
- 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.
- 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.
- Tasarımcı <a1>HTML</a1> sekmesini tıklatın.
- 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>
- Tüm dosyaları kaydedin ve sonra Projeyi derleyin.
- WebForm1.aspx sayfa isteyin. Logon.aspx için yönlendirileceği dikkat edin.
- 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.
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.)
306238
(http://support.microsoft.com/kb/306238/
)
Rol tabanlı güvenlik form tabanlı kimlik doğrulaması ile ASP.NET uygulamanız Visual Basic. 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 sayfasına yönlendirilir