Giới thiệu
Các hình thức xác thực người dùng
và mật khẩu xác nhận cho các ứng dụng web mà không yêu cầu xác thực của
Windows. Với các hình thức xác thực, thông tin người dùng được lưu trữ trong
một nguồn dữ liệu bên ngoài, chẳng hạn như là cơ sở dữ liệu Mebership, hoặc
trong tập tin cấu hình ứng dụng. Một khi người dùng được xác thực, các hình
thức xác thực duy trì một vé xác thực trong một cookie hoặc URL để người dùng
xác thực không cần phải cung cấp thông tin mỗi lần request.
Tại trang web, tôi có một thư mục
"Admin", tôi chỉ muốn người dùng với vai trò quản lý có thể truy cập.Đơn
giản là không muốn kiểm tra quyền của mỗi người dùng vào thư mục này, chỉ phụ
thuộc vào vai trò. Bài viết này sẽ bàn về cách tiếp cận này.
Bối cảnh
Trong trường hợp, tôi không quan
tâm những người đã đăng nhập vào trang web, nếu họ không đăng nhập, họ chỉ có
thể duyệt trang web, nếu họ đăng ký và đăng nhập, họ có thể làm một số việc,
như thêm một bảng điều khiển, xóa bảng điều khiển mà họ tạo ra, nếu người dùng
đăng nhập với vai trò quản lý, trang web sẽ cấp cho họ quyền truy cập các tập
tin trong thư mục "admin".
Dùng Code
Tải đoạn mã về, giải nén nó ra,
tạo một thư mục ảo trên IIS. Thư mục gốc chứa "login.aspx",
"logout.aspx", "default.aspx", và một thư mục gọi là
"admin". "Admin", chỉ có một tập tin,
"default.aspx" - đây là các tập tin tôi sẽ ngăn chặn người dùng truy
cập bình thường.
Các hình thức xác thực bao gồm
một số thành phần quan trọng mà bạn cần phải thực hiện.
Tại file web.config, tôi thiết
lập chế độ xác thực "Forms".
Web.config, tôi tạo ra một thư
mục mà tôi muốn để xác thực người sử dụng như sau:
<location path="Admin">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users ="*"/>
</authorization>
</system.web>
</location>
<authentication mode="Forms">
<forms name="AuthCookie" path="/" loginUrl="login.aspx"
protection="All" timeout="30">
-->
</forms>
</authentication>
Hãy nhớ đặt <allow
roles="Administrators" /> trước <deny users="*" />
, nếu không sẽ không có ai có thể truy cập vào thư mục "admin".
Hình thức xác thực “login” URL là
“login.aspx ", bạn có thể thay đổi bất kỳ tập tin bạn muốn.
Tôi sử dụng cho nhiều người dùng
mà tôi muốn để xác thực và sử dụng asp:LoginView trang web điều khiển để hiển
thị trạng thái đăng nhập của họ, nó bật ra không được linh hoạt. Tôi bỏ nó,
thay vào đó bằng cách sử dụng role, và bài viết này xuất phát từ đây. Bằng cách
này tôi có thể tạo ra người dùng, lưu chúng vào cơ sở dữ liệu, giao cho role
" Administrators ", họ sẽ có thể truy cập vào thư mục “Admin”.
OK, tiếp theo là tạo ra một cấu
trúc trang web. Ở đây tôi sử dụng “web.sitemap”, bạn có thể thêm nó bằng cách
chọn tùy chọn thêm mục mới của Visual Studio 2008/2010.
Tập tin “web.sitemap”, tôi tạo ra
một số SiteMapNode với role “Administrators” như sau:
="1.0" ="utf-8"
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="~" title="Home" description="">
<siteMapNode url="default.aspx" title="Home" description="" roles="*"/>
<siteMapNode url="login.aspx" title="Login" description="" roles="*"/>
<siteMapNode url="Admin/" title="Administration" description="" roles ="*" >
<siteMapNode url="Admin/default.aspx" title="Administration"
description="" roles ="Administrators" />
</siteMapNode>
<siteMapNode url="logout.aspx" title="Logout" description="" roles="*"/>
</siteMapNode>
</siteMap>
Trong default.aspx, tôi sử dụng
Repeater, và SiteMapDataSource điều khiển để thực hiện duy trì trang web. Trên
trang web thực sự của tôi, tôi sử dụng Repeater, SiteMapDataSource và
SiteMapPath điều khiển trang chủ, làm cho toàn bộ trang web trông sạch sẽ và
gọn gàng hơn.
Khi người dùng đầu tiên nhìn thấy
trang web này, họ có thể nhìn thấy liên
kết “Administrator”, click vào nó, đối tượng FormsAuthentication của IIS sẽ
điều hướng người dùng đến trang "login.aspx" vì thiết lập file “Web.Config”,
yêu cầu người dùng đăng nhập.
Nhập tên người dùng, mật khẩu,
kiểm tra xem nó thông qua các phương thức khác nhau, truy cập cơ sở dữ liệu
trong trường hợp này, người dùng xác thực, xin sử dụng role "Adminitrators"
như sau:
FormsAuthenticationUtil.RedirectFromLoginPage("Lewis", "Administrators", true);
FormsAuthenticationUtil là một
DLL của bên thứ ba, nó tạo ra một vé xác thực người dùng đăng nhập, thay đổi trạng
thái Logged In. Sau đó, tôi đã ngừng sử dụng DLL này. Bởi vì tôi cần phải kiểm
soát toàn bộ quá trình đăng nhập của người dùng.
Tôi tạo ra một lớp người dùng đặc
biệt xử lý quy trình người dùng đăng nhập và đăng ký, vv
public static void CreateTicket(ENetUser newUser,bool persistantCookie)
{
string roles = "users";
if (newUser.Email.ToLower().Trim() == "abc@hotmail.com" ||
newUser.Email.ToLower().Trim() ==
"john.dole@pertronic.co.nz") roles = "Administrators";
roles += "," + newUser.ID;
roles += "," + newUser.ID;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
newUser.UserName,
DateTime.Now,
DateTime.Now.AddMinutes(30),
persistantCookie,
roles,
FormsAuthentication.FormsCookiePath);
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
hash);
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}
Như bạn có thể thấy, tôi tạo ra
một vé cho người sử dụng, thêm một cookie vào máy tính của người sử dụng. Khi
người dùng truy cập trang web của chúng tôi trong thời gian này, sẽ tái tạo vé
của người dùng từ Cookie.
Đoạn mã trên không phải là trong
mã ví dụ, đó là một gợi ý “FormsAuthenticationUtil”
Điều tiếp theo là bạn cần phải hiểu
ứng dụng web làm thế nào để xác thực người dùng. Tôi thêm vào dòng sau global.asax,
nếu bạn không có tập tin trong thư mục gốc web của bạn, thêm nó bằng cách chọn
"Add Items" từ Visual Studio 2008/2010 trong menu “Web Site”.
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id =
(FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}
}
Như bạn có thể thấy, một khi
người dùng đã đăng nhập, họ sẽ được chứng thực, nhưng họ không có "Administrators"
với bất kỳ role nào.
Như tôi đã đề cập ở trên, ví dụ
không cho thấy làm thế nào để đọc các tập tin cookie trên từ máy tính. Lý do tôi cần để làm điều này là tôi muốn tiết kiệm thời gian
người dùng đăng nhập trong mỗi lần họ mở trang web.
Tại trang web, các mã sau đây
đã được bổ sung "global.asax",
bắt đầu session, đọc cookie, cung cấp cho người dùng một vé, phương thức xác
thực ứng dụng này sẽ sử dụng vé để cấp người dùng với vai trò "Administrators".
void Session_Start(object sender, EventArgs e)
{
HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie != null)
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
}
}
FormsAuthentication.FormsCookieName được định nghĩa trong
web.config.