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:
- Mulai Microsoft Visual Studio.NET.
- Pada Berkas menu, titik Baru, lalu klik Project.
- Klik Visual C# proyek di bawah Jenis proyek, lalu klik ASP.Aplikasi NET Web di bawah Pola acu.
- Dalam Lokasi kotak, menggantikan WebApplication1 dengan FormsAuthAd.
- Klik Oke.
- Klik kanan Referensi simpul dalam Explorer solusi, dan kemudian klik Menambahkan referensi.
- 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:
- Dalam solusi Explorer, klik kanan node proyek, titik
untuk Tambahkan, lalu klik Menambah Item baru.
- Klik Kelas di bawah Pola acu.
- Jenis LdapAuthentication.cs dalam Nama kotak, dan kemudian klik Terbuka.
- 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.
- Dalam solusi Explorer, klik kanan Global.asax, lalu klik Lihat kode.
- Menambahkan kode berikut di bagian atas kode di belakang
Global.asax.cs file:
using System.Web.Security;
using System.Security.Principal;
- 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:
- Dalam IIS, memperluas node komputer untuk server Anda, memperluas Situs web, memperluas Situs Web standar, klik kanan FormsAuthAd, lalu klik Properti.
- Klik Tab keamanan direktori, lalu klik Mengedit di bawah Akses anonim dan kontrol otentikasi.
- Membuat account anonim untuk aplikasi account yang memiliki izin untuk Active Directory.
- Klik untuk mengosongkan kotak centang memungkinkan IIS untuk kontrol Password.
- Dalam "Keasliannya akses" bagian, Hapus centang kotak centang "Terpadu Windows otentikasi".
- Klik OK.
- 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:
- Dalam solusi Explorer, klik kanan node proyek, titik
untuk Tambahkan, lalu klik Tambahkan formulir Web.
- Jenis Logon.aspx dalam Nama kotak, dan kemudian klik Terbuka.
- Dalam solusi Explorer, klik kanan Logon.aspx, lalu klik Lihat desainer.
- Klik HTML tab di perancang.
- 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> - 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.
- Dalam solusi Explorer, klik kanan WebForm1.aspx, lalu klik Lihat desainer.
- Klik HTML tab di perancang.
- 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>
- Simpan semua file, dan kemudian kompilasi proyek.
- Permintaan halaman WebForm1.aspx. Pemberitahuan bahwa Anda
diarahkan ke Logon.aspx.
- 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.
Untuk informasi selengkapnya, klik nomor artikel berikut ini untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
306590
(http://support.microsoft.com/kb/306590/
)
ASP.Ikhtisar bersih keamanan
317012
(http://support.microsoft.com/kb/317012/
)
Proses dan permintaan identitas di ASP.NET
311495
(http://support.microsoft.com/kb/311495/
)
Bagaimana menerapkan berbasis peran keamanan dengan otentikasi berbasis bentuk di ASP Anda.NET aplikasi dengan menggunakan Visual C#.NET
313091
(http://support.microsoft.com/kb/313091/
)
Cara membuat tombol dengan menggunakan Visual Basic.NET untuk digunakan dalam bentuk-bentuk otentikasi
313116
(http://support.microsoft.com/kb/313116/
)
Bentuk-bentuk otentikasi permintaan tidak diarahkan ke halaman loginUrl