Cấp bậc tác giả:

DOTNET

Xác thực người dùng bằng Roles trong ASP.NET

Được viết bởi QuangIT ngày 01/01/2013 lúc 11:09 AM
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.
  • 0
  • 19117
Tải tệp tin: Click ở đây

Xác thực người dùng bằng Roles trong ASP.NET

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">
      <!--<credentials passwordFormat="Clear">
        <user name="Lewis" password="llllll"/>
      </credentials>-->
    </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:

<?xml version="1.0" encoding="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;
    
    // Create a new ticket used for authentication
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, // Ticket version
       newUser.UserName, // Username associated with ticket
       DateTime.Now, // Date/time issued
       DateTime.Now.AddMinutes(30), // Date/time to expire
       persistantCookie, // "true" for a persistent user cookie
       roles, // User-data, in this case the roles
       FormsAuthentication.FormsCookiePath);// Path cookie valid for
       
    // Encrypt the cookie using the machine key for secure transport
    string hash = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(
       FormsAuthentication.FormsCookieName, // Name of auth cookie
       hash); // Hashed ticket
       
    // Set the cookie's expiration time to the tickets expiration time
    if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
    
    // Add the cookie to the list for outgoing response
    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;
                
                // Get the stored user-data, in this case, our roles
                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.

Nguồn bài viết: Dngaz.com

BÌNH LUẬN BÀI VIẾT

Bài viết mới nhất

LIKE BOX

Bài viết được xem nhiều nhất

HỌC HTML