Visual Basic.NET을 사용 하 여 ASP.NET 응용 프로그램에서 폼 기반 인증을 구현 하는 방법

요약

이 문서에서는 사용자 정보를 저장 하는 데이터베이스를 사용 하 여 폼 기반 인증을 구현 하는 방법을 보여 줍니다.

요구 사항

다음은 권장된 하드웨어, 소프트웨어, 네트워크 인프라 및 필요한 서비스 팩입니다.
  • Microsoft Visual Studio.NET
  • Microsoft SQL Server
  • Microsoft 인터넷 정보 서비스 (IIS) 버전 5.0 이상

Visual Basic.NET을 사용 하 여 ASP.NET 응용 프로그램 만들기

  1. Visual Studio.NET을 엽니다.
  2. 새 ASP.NET 웹 응용 프로그램을 만들고 이름과 위치를 지정 합니다.

Web.config 파일의 보안 설정 구성

이 섹션에 추가 하 고 폼 기반 인증을 사용 하도록 ASP.NET 응용 프로그램을 구성 하려면 < 인증 >< 인증 > 구성 섹션을 수정 하는 방법을 보여 줍니다.
  1. 솔루션 탐색기에서 Web.config 파일을 엽니다.
  2. 인증 모드를 변경 합니다.
  3. < 폼 > 태그를 삽입 하 고 적절 한 특성 입력 합니다. (이러한 특성에 대 한 자세한 내용은 MSDN 설명서 나 QuickStart 설명서에 나와 있는를 참조 하면
    참조 절입니다.) 다음 코드를 복사 하 고 파일의 < 인증 > 섹션에 코드를 편집 메뉴에서 HTML로 붙여넣기 를 클릭 합니다.
    <authentication mode="Forms"><forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
    protection="All" path="/" timeout="30" />
    </authentication>

  4. 다음과 같이 < 인증 > 섹션에서 익명 사용자에 게 액세스를 거부:
    <authorization><deny users ="?" />
    <allow users = "*" />
    </authorization>

사용자 정보를 저장 하는 예제 데이터베이스 테이블 만들기

이 섹션에서는 사용자 이름, 암호 및 사용자 역할을 저장 하기 위한 예제 데이터베이스를 만드는 방법을 보여 줍니다. 데이터베이스에 사용자 역할을 저장 하 고 역할 기반 보안을 구현 하려면 역할 열이 필요 합니다.
  1. Windows 시작 메뉴에서 실행을 누른 다음 메모장을 열려면 메모장 입력 합니다.
  2. 다음 SQL 스크립트 코드 선택한 코드를 마우스 오른쪽 단추로 클릭 한 다음 복사를 클릭 합니다. 메모장에서 다음 코드를 붙여 넣으려면 편집 메뉴에서 붙여넣기 를 클릭 합니다.
    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. 파일을 Users.sql로 저장 합니다.
  4. Microsoft SQL Server 컴퓨터에서 쿼리 분석기에서 Users.sql를 엽니다. 데이터베이스 목록에서 pubs를 누르고 스크립트를 실행 합니다. 예제 사용자 테이블이 만들어지고이 예제 응용 프로그램에 사용할 Pubs 데이터베이스에이 테이블이 채워집니다.

Logon.aspx 페이지 만들기

  1. Logon.aspx 라는 프로젝트에 새 Web Form을 추가 합니다.
  2. 편집기에서 Logon.aspx 페이지를 열고 HTML 뷰로 전환 합니다.
  3. 다음 코드를 복사 하 고 편집 메뉴의 HTML로 붙여넣기 옵션을 사용 하 여 < 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에 사용자 이름 및 응용 프로그램에 로그온 할 때 암호를 제공할 수 있습니다 사용자에 게 로그온 폼을 제공 하는 데 사용 됩니다.
  4. 디자인 보기로 전환한 다음 페이지를 저장 합니다.

사용자 자격 증명이 유효한 지 확인 하도록 이벤트 처리기 코딩

이 섹션에는 코드를 코드 숨김 페이지 (Logon.aspx.vb)에 배치 됩니다.
  1. Logon.aspx.vb 파일을 엽니다.
  2. 코드 숨김 파일에서 필요한 네임 스페이스를 가져옵니다.
    Imports System.Data.SqlClientImports System.Web.Security

  3. ValidateUser 함수를 데이터베이스에서 검색 하 여 사용자 자격 증명 유효성 검사를 만듭니다. (데이터베이스를 가리키도록 연결 문자열을 변경 하는 있는지 확인 합니다.)
    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

  4. 폼 인증 쿠키를 생성 하 고 cmdLogin_ServerClick 이벤트를 적절 한 페이지로 사용자를 리디렉션합니다 두 가지 방법 중 하나를 사용할 수 있습니다. 두 시나리오 모두에 대 한 샘플 코드가 제공 됩니다. 요구 사항에 따라 둘 중 하나를 사용 합니다.
    • 자동으로 폼 인증 쿠키를 생성 하 고 cmdLogin_ServerClick 이벤트를 적절 한 페이지로 사용자를 리디렉션합니다 RedirectFromLoginPage 메서드를 호출 합니다.
      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

    • 인증 티켓 생성 암호화, 만들고 쿠키를 응답에 추가 하 고 사용자를 리디렉션하십시오. 이렇게 하면 쿠키를 만드는 방법에 대 한 더 많은 제어 합니다. 이 예에서 FormsAuthenticationTicket 함께 사용자 지정 데이터를 포함할 수도 있습니다.
      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

Default.aspx 페이지 만들기

이 여기서는 인증 된 후 사용자가 리디렉션되는 테스트 페이지를 만듭니다. 첫 번째 응용 프로그램에 로그온 하지 않고이 페이지를 찾는 사용자는 로그온 페이지로 리디렉션됩니다.
  1. 기존 WebForm1.aspx 페이지를 Default.aspx로 바꾸고 편집기에서 엽니다.
  2. HTML 뷰로 전환한 다음 < form > 태그 사이 다음 코드를 복사 합니다.
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    이 단추를 사용 하 여 로그 오프 폼 인증 세션입니다.
  3. 디자인 보기로 전환한 다음 페이지를 저장 합니다.
  4. 코드 숨김 파일에서 필요한 네임 스페이스를 가져옵니다.
    Imports System.Web.Security
  5. 코드 숨김 페이지 (Default.aspx.vb)를 열고 cmdSignOut_ServerClick 이벤트 처리기에 다음 코드를 복사 합니다.
    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

  6. 저장 하 고 프로젝트를 컴파일하십시오. 이제 응용 프로그램을 사용할 수 있습니다.

문제 해결

  • 데이터베이스의 암호를 안전 하 게 저장할 수도 있습니다. 암호를 암호화 하 여 데이터베이스 또는 구성 파일에 저장 하기 전에 HashPasswordForStoringInConfigFile 라는 FormsAuthentication 클래스 유틸리티 함수를 사용할 수 있습니다.
  • 필요에 따라 쉽게 수정할 수 있도록 구성 파일 (Web.config)에 SQL 연결 정보를 저장할 수도 있습니다.
  • 로그온 암호의 다른 조합을 사용 하 여 사용 하려는 해커를 막는 코드를 추가 고려할 수 있습니다. 예를 들어, 두 개 또는 세 개의 로그온 시도 허용 하는 논리를 포함할 수 있습니다. 사용자가 특정 횟수 이내에에서 로그온 되어 있으면 해당 사용자가 다른 페이지를 방문 하거나 지원 받아서 자신의 계정을 다시 활성화할 때까지 로그온 할 수 없는 데이터베이스에 플래그를 설정 하는 것이 좋습니다. 또한 어디에서 나 적절 한 오류 처리를 추가 해야 합니다.
  • 인증 쿠키를 기반으로 사용자가 식별을 하기 때문에 아무도 인증 쿠키와 전송 되는 기타 유용한 정보를 검색할 수 있도록이 응용 프로그램에 Secure Sockets Layer (SSL)를 사용 하는 것이 좋습니다.
  • 폼 기반 인증에 클라이언트는 그대로 사용 하거나 브라우저에서 쿠키를 사용 해야 합니다.
  • < 인증 > 구성 섹션의 timeout 매개 변수는 인증 쿠키가 다시 생성 되는 간격을 제어 합니다. 보다 나은 성능과 보안을 제공 하는 값을 선택할 수 있습니다.
  • 특정 중간 프록시와 캐시 인터넷에서 처리 된 다음 다른 사용자에 게 반환 Set-cookie 헤더를 포함 하는 웹 서버 응답을 캐시할 수 있습니다. 폼 기반 인증 쿠키를 사용 하 여 사용자 인증을 하기 때문에 중간 프록시나 캐시에 원래 의도 하지 않은에서 쿠키를 받은 실수로 또는 고의로 다른 사용자를 가장 하도록 발생할 수 있습니다.

참조

< 자격 > 섹션을 사용 하 여 사용자 이름 및 암호를 저장 하 여 간단한 폼 기반 인증을 구현 하는 방법에 대 한 정보를 ASP.NET 퀵 스타트 샘플의 다음 문서를 참조 하십시오.사용자 이름 및 암호를 저장 하는 확장 가능한 태그 언어 (XML) 파일을 사용 하 여 폼 기반 인증을 구현 하는 방법에 대 한 정보를.NET Framework 소프트웨어 개발 키트 (SDK) 설명서의 다음 항목을 참조 하십시오.
사용자가 XML 파일을 사용 하 여 폼 인증
http://msdn2.microsoft.com/en-us/library/1b1y85bh(vs.71).aspx
ASP.NET 웹 응용 프로그램 보안에 대 한 자세한 내용은.NET Framework SDK 설명서의 다음 문서를 참조 하십시오.System.Web.Security 네임 스페이스에 대 한 자세한 내용은.NET Framework SDK 설명서의 다음 문서를 참조 하십시오.ASP.NET 구성에 대 한 자세한 내용은 다음.NET Framework SDK 문서를 참조 하십시오.ASP.NET 보안 지침에 대 한 내용은 다음 MSDN 백서를 참조 하십시오.
ASP.NET에서 인증:.NET 보안 지침
http://msdn2.microsoft.com/en-us/library/ms978378.aspx
자세한 내용은 다음 설명서를 참조 합니다.
Esposito, Dino입니다. ASP.NET 및 ADO.NET을 사용 하 여 웹 솔루션을 구축합니다. Microsoft Press, 2001입니다.

Howard, Michael 및 David LeBlanc입니다. 보안 코드를 작성합니다. Microsoft Press, 2001입니다.
속성

문서 ID: 308157 - 마지막 검토: 2017. 2. 6. - 수정: 2

Microsoft ASP.NET 1.1, Microsoft ASP.NET 1.0, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition

피드백