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

DOTNET

Làm thế nào để thực hiện xác thực dựa trên Form trong ứng dụng ASP.NET

Được viết bởi webmaster ngày 13/09/2013 lúc 01:53 AM
Bài viết này giải thích cách thực hiện xác thực dựa trên biểu mẫu bằng cách sử dụng cơ sở dữ liệu để lưu trữ người dùng.
  • 0
  • 8537

Làm thế nào để thực hiện xác thực dựa trên Form trong ứng dụng ASP.NET

Bài viết này giải thích cách thực hiện xác thực dựa trên biểu mẫu bằng cách sử dụng cơ sở dữ liệu để lưu trữ người dùng.

Yêu cầu

Danh sách phác thảo các khuyến nghị phần cứng, phần mềm, cơ sở hạ tầng mạng và gói dịch vụ mà bạn cần:
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server
  • Microsoft Internet Information Services (IIS) phiên bản 5.0 hoặc phiên bản mới hơn
Tạo một ứng dụng ASP.NET sử dụng Visual Basic .NET hoặc C#.NET
1. Mở Visual Studio .NET.
2. Tạo một ứng dụng ASP.NET Web và chỉ định tên và vị trí.

Phần này giải thích làm thế nào để thêm và sửa đổi <authentication> cấu hình <authorization> ứng dụng ASP.NET sử dụng xác thực dựa trên Form.
1. Trong Solution Explorer, mở tập tin Web.config.
2. Thay đổi chế độ xác thực với Forms.
3. Chèn từ khóa <Forms>và điền vào thích hợp thuộc tính. Sao chép các mã sau, và sau đó nhấp vào Paste as HTML trên menu Edit để dán mã này trong </authentication> của tập tin:
<authentication mode="Forms">
<forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
protection="All" path="/" timeout="30" />
</authentication>
Từ chối truy cập cho người dùng vô danh trong <authorization>như sau:
<authorization>
<deny users ="?" />
<allow users = "*" />
</authorization>
Cấu hình thiết đặt bảo mật trong tệp Web.config

Phần này chứng tỏ làm thế nào để tạo ra một bộ máy cơ sở dữ liệu mẫu để lưu trữ tên người dùng, mật khẩu và các vai trò cho người dùng. Bạn cần các cột vai trò Nếu bạn muốn để lưu trữ các vai trò người dùng trong bộ máy cơ sở dữ liệu và thực hiện dựa trên vai trò an ninh.

1. Từ menu Windows Start, click Run, và sau đó gõ Notepad để mở Notepad.
2. Làm nổi bật mã kịch bản SQL sau, bấm chuột phải vào các Mã, và sau đó nhấp vào Copy. Trong Notepad, hãy nhấp vào Paste trên menu Edit để dán đoạn mã sau:

if exists (select * from sysobjects where id = 
object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Users]
GO
CREATE TABLE [dbo].[Users] (
    [uname] [varchar] (15) NOT NULL ,
    [Pwd] [varchar] (25) NOT NULL ,
    [userRole] [varchar] (25) NOT NULL ,
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
    (
        [uname]
    )  ON [PRIMARY] 
GO

INSERT INTO Users values('user1','user1','Manager')
INSERT INTO Users values('user2','user2','Admin')
INSERT INTO Users values('user3','user3','User')
GO
3. Lưu tệp dưới dạng Users.sql.
4. Trên Microsoft SQL Server, mở Users.sql trong Query Analyzer. Từ danh sách cơ sở dữ liệu, nhấp vào pubs  và chạy script. Điều này tạo ra một bảng người dùng và populates bảng trong cơ sở dữ liệu Pubs được sử dụng với mẫu ứng dụng này.

Tạo trang Logon.aspx

1. Thêm một mẫu Web mới cho dự án được đặt tên Logon.aspx.
2. Mở trang Logon.aspx trong trình soạn thảo, và chuyển sang xem HTML.
3. Copy đoạn mã sau, và sử dụng các tùy chọn Paste dưới dạng HTML trên menu Edit để chèn mã giữa Tag <form>
<h3>
   <font face="Verdana">Logon Page</font>
</h3>
<table>
   <tr>
      <td>Email:</td>
      <td><input id="txtUserName" type="text" runat="server"></td>
      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
           Display="Static" ErrorMessage="*" runat="server" 
           ID="vUserName" /></td>
   </tr>
   <tr>
      <td>Password:</td>
      <td><input id="txtUserPass" type="password" runat="server"></td>
      <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
          Display="Static" ErrorMessage="*" runat="server" 
          ID="vUserPass" />
      </td>
   </tr>
   <tr>
      <td>Persistent Cookie:</td>
      <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
      <td></td>
   </tr>
</table>
<input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
<asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
Web Form này được sử dụng để trình bày Form đăng nhập cho người dùng để họ có thể cung cấp tên người dùng và mật khẩu để đăng nhập vào ứng dụng của họ.
4. Chuyển sang chế độ xem trang design, và lưu trang.

Mã xử lí sự kiện để nó xác nhận thông tin đăng nhập người dùng

Phần này trình bày các mã được đặt trong mã đằng sau Trang (Logon.aspx.vb).

1. Mở tập tin Logon.aspx.vb.
2. Nhập khẩu các không gian tên yêu cầu trong các tập tin mã phía sau:
VB
Imports System.Data.SqlClient
Imports System.Web.Security
C#
using System.Data.SqlClient;
using System.Web.Security;

3. Tạo ra một chức năng ValidateUser để xác nhận thông tin kí nhập người dùng bằng cách xem các bộ máy cơ sở dữ liệu. (Hãy chắc chắn rằng bạn thay đổi chuỗi kết nối đến điểm đến của bạn bộ máy cơ sở dữ liệu.)
VB
Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
        Dim conn As SqlConnection
        Dim cmd As SqlCommand
        Dim lookupPassword As String

        lookupPassword = Nothing

        ' Check for an invalid userName.
        ' userName  must not be set to nothing and must be between one and 15 characters.
        If ((userName Is Nothing)) Then
            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
            Return False
        End If
        If ((userName.Length = 0) Or (userName.Length > 15)) Then
            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
            Return False
        End If

        ' Check for invalid passWord.
        ' passWord must not be set to nothing and must be between one and 25 characters.
        If (passWord Is Nothing) Then
            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
            Return False
        End If
        If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
            System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
            Return False
        End If

        Try
            ' Consult with your SQL Server administrator for an appropriate connection
            ' string to use to connect to your local SQL Server.
            conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")
            conn.Open()

            ' Create SqlCommand to select pwd field from the users table given a supplied userName.
            cmd = New SqlCommand("Select pwd from users where uname=@userName", conn)
            cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25)
            cmd.Parameters("@userName").Value = userName


            ' Execute command and fetch pwd field into lookupPassword string.
            lookupPassword = cmd.ExecuteScalar()

            ' Cleanup command and connection objects.
            cmd.Dispose()
            conn.Dispose()
        Catch ex As Exception
            ' Add error handling here for debugging.
            ' This error message should not be sent back to the caller.
            System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message)
        End Try

        ' If no password found, return false.
        If (lookupPassword Is Nothing) Then
            ' You could write failed login attempts here to the event log for additional security.
            Return False
        End If

        ' Compare lookupPassword and input passWord by using a case-sensitive comparison.
        Return (String.Compare(lookupPassword, passWord, False) = 0)

End Function
C#
private bool ValidateUser( string userName, string passWord )
{
    SqlConnection conn;
    SqlCommand cmd;
    string lookupPassword = null;

    // Check for invalid userName.
    // userName must not be null and must be between 1 and 15 characters.
    if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )
    {
        System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
        return false;
    }

    // Check for invalid passWord.
    // passWord must not be null and must be between 1 and 25 characters.
    if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )
    {
        System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
        return false;
    }

    try
    {
        // Consult with your SQL Server administrator for an appropriate connection
        // string to use to connect to your local SQL Server.
        conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );
        conn.Open();

        // Create SqlCommand to select pwd field from users table given supplied userName.
        cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );
        cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );
        cmd.Parameters["@userName"].Value = userName;

        // Execute command and fetch pwd field into lookupPassword string.
        lookupPassword = (string) cmd.ExecuteScalar();

        // Cleanup command and connection objects.
        cmd.Dispose();
        conn.Dispose();
    }
    catch ( Exception ex )
    {
        // Add error handling here for debugging.
        // This error message should not be sent back to the caller.
        System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );
    }

    // If no password found, return false.
    if ( null == lookupPassword ) 
    {
        // You could write failed login attempts here to event log for additional security.
        return false;
    }

    // Compare lookupPassword and input passWord, using a case-sensitive comparison.
    return ( 0 == string.Compare( lookupPassword, passWord, false ) );

}

4. Bạn có thể sử dụng một trong hai phương thức để tạo ra các form xác thực cookie và chuyển hướng người dùng đến một trang phù hợp trong sự kiện cmdLogin_ServerClick . Mẫu mã được cung cấp cho cả hai tình huống. Sử dụng một trong hai họ theo yêu cầu của bạn.
Gọi phương pháp RedirectFromLoginPage để tự động tạo ra cookie xác thực của các hình thức và chuyển hướng người dùng đến một trang thích hợp trong trường hợp cmdLogin_ServerClick:
VB
Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
   Handles cmdLogin.ServerClick
   If ValidateUser(txtUserName.Value,txtUserPass.value) Then
      FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
      chkPersistCookie.Checked)
   Else
      Response.Redirect("logon.aspx", True)
   End If
End Sub
C#
private void cmdLogin_ServerClick(object sender, System.EventArgs e)
{
if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
    FormsAuthentication.RedirectFromLoginPage(txtUserName.Value,
        chkPersistCookie.Checked);
    else
        Response.Redirect("logon.aspx", true);
}
Tạo ra xác thực qua ticket, mã hóa nó, tạo ra cookie, thêm nó vào các phản ứng, và chuyển hướng người sử dụng. Điều này sẽ cho bạn nhiều hơn nữa kiểm soát trong làm thế nào bạn tạo ra các cookie. Bạn cũng có thể bao gồm các dữ liệu tuỳ chỉnh căn dọc với FormsAuthenticationTicket trong trường hợp này.
VB
Private Sub cmdLogin_ServerClick(ByVal sender As Object, _
   ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
   If Validateuser(txtUserName.Value,txtUserPass.Value) Then
      Dim tkt As FormsAuthenticationTicket
      Dim cookiestr As String
      Dim ck As HttpCookie

      tkt = New FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now(), _
dateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data")
      cookiestr = FormsAuthentication.Encrypt(tkt)
      ck = new HttpCookie(FormsAuthentication.FormsCookieName(), cookiestr)
      if (chkPersistCookie.Checked) then ck.Expires=tkt.Expiration 
      ck.Path = FormsAuthentication.FormsCookiePath() 
      Response.Cookies.Add(ck)

      Dim strRedirect As String
      strRedirect = Request("ReturnURL")
      If strRedirect <> "" Then
         Response.Redirect(strRedirect, True)
      Else
         strRedirect = "default.aspx"
         Response.Redirect(strRedirect, True)
      End If
   Else
      Response.Redirect("logon.aspx", True)
   End If
End Sub
C#
private void cmdLogin_ServerClick(object sender, System.EventArgs e)
{
   if (ValidateUser(txtUserName.Value,txtUserPass.Value) )
   {
      FormsAuthenticationTicket tkt;
      string cookiestr;
      HttpCookie ck;
      tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now, 
DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");
      cookiestr = FormsAuthentication.Encrypt(tkt);
      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
      if (chkPersistCookie.Checked)
      ck.Expires=tkt.Expiration;    
            ck.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Add(ck);

      string strRedirect;
      strRedirect = Request["ReturnUrl"];
      if (strRedirect==null)
            strRedirect = "default.aspx";
         Response.Redirect(strRedirect, true);
   }
   else
      Response.Redirect("logon.aspx", true);
}
    

Tạo trang Default.aspx

Phần này tạo ra một trang thử nghiệm mà người dùng được chuyển hướng sau khi họ xác thực. Nếu người dùng duyệt đến trang này mà không cần đầu tiên kí nhập ứng dụng, họ được chuyển hướng đến trang đăng nhập.
1. Đổi tên trang WebForm1.aspx hiện tại như Default.aspx, và mở nó trong trình soạn thảo.
2. Chuyển sang chế độ xem HTML, và sao chép đoạn mã sau giữa Tag <form>
<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
Nút chọn này được sử dụng để thoát ra khỏi form xác thực Phiên làm việc.

3. Chuyển sang chế độ xem Design, và lưu trang.
4. Nhập không gian tên yêu cầu trong các tập tin mã phía sau:
Imports System.Web.Security
5. Mở mã trang (Default.aspx.vb), và sao chép mã xử lý sự kiện cmdSignOut_ServerClick:
VB
Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles cmdSignOut.ServerClick
   FormsAuthentication.SignOut()
   Response.Redirect("logon.aspx", True)
End Sub
C#
this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
Save và biên dịch dự án. Bây giờ bạn có thể sử dụng các ứng dụng.

Khắc phục sự cố

- Bạn có thể muốn lưu trữ mật khẩu an toàn trong cơ sở dữ liệu. Bạn có thể sử dụng chức năng tiện ích lớp FormsAuthentication được đặt tên là HashPasswordForStoringInConfigFile để mã hóa mật khẩu trước khi bạn lưu trữ chúng trong cơ sở dữ liệu hoặc tập tin cấu hình.
- Bạn có thể muốn lưu trữ thông tin kết nối SQL trong các cấu hình tập tin (Web.config) để bạn có thể dễ dàng thay đổi nó nếu cần thiết.
- Bạn có thể xem xét thêm mã để ngăn chặn tin tặc cố gắng để sử dụng kết hợp khác nhau của mật khẩu từ đăng nhập. Ví dụ, bạn có thể bao gồm logic mà chấp nhận chỉ có hai hoặc ba cố gắng đăng nhập. Nếu người dùng không thể đăng nhập vào, bạn có thể muốn đặt một lá cờ trong để không cho phép người dùng để đăng nhập vào cho đến khi người dùng đó re-enables tài khoản bằng cách truy cập một trang khác hoặc bằng cách gọi đường dây hỗ trợ của bạn. Ngoài ra, bạn nên thêm thích hợp lỗi xử lý bất cứ nơi nào cần thiết.
- Bởi vì người dùng được xác định dựa trên việc xác thực cookie, bạn có thể muốn sử dụng Secure Sockets Layer (SSL) về ứng dụng này vì vậy không có ai có thể lấy cookie xác thực và bất kỳ giá trị khác khi thông tin được truyền đi.
- Xác thực dựa trên hình thức yêu cầu rằng client của bạn chấp nhận hoặc bật cookie trên trình duyệt của họ.
- Các thông số timeout cấu hình phần <authentication> kiểm soát khoảng thời gian mà tại đó các cookie xác thực tái tạo. Bạn có thể chọn các giá trị cung cấp tốt hơn hiệu suất và bảo mật.
- Một số proxy trung gian và lưu trữ trên Internet có thể bộ nhớ cache phản ứng Máy chủ Web có tiêu đề thiết lập Cookie, sau đó quay trở lại người sử dụng khác. Bởi vì sử dụng xác thực dựa trên hình thức cookie xác thực người dùng, điều này có thể gây ra như người dùng vô tình (hoặc cố ý) mạo danh người dùng khác bằng cách nhận được một cookie từ một proxy trung gian hoặc bộ nhớ cache không phải dành cho họ.

Nguồn bài viết: DOTNET.VN

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