DetailPage-MSS-KB

기술 자료

기술 자료: 308157 - 마지막 검토: 2007년 10월 29일 월요일 - 수정: 8.7

이 문서는 이전에 다음 ID로 출판되었음: KR308157

이 페이지에서

요약

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

요구 사항

다음은 권장되는 하드웨어, 소프트웨어 및 네트워크 인프라와 필요한 서비스 팩 목록입니다.
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server
  • Microsoft Internet Information Services(IIS) 5.0 이상

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

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

Web.config 파일에서 보안 설정 구성

이 절에서는 <authentication><authorization> 구성 절을 추가 및 수정하여 폼 기반 인증을 사용하도록 ASP.NET 응용 프로그램을 구성하는 방법을 설명합니다.
  1. 솔루션 탐색기에서 Web.config 파일을 엽니다.
  2. 인증 모드를 Forms로 변경합니다.
  3. <Forms> 태그를 삽입하고 적절한 특성을 입력합니다. 이 특성에 대한 자세한 내용은 참조 절에 있는 MSDN 설명서나 QuickStart 설명서를 참조하십시오. 다음 코드를 복사한 다음 편집 메뉴에서 HTML로 붙여넣기를 눌러 코드를 파일의 <authentication> 섹션에 붙여 넣습니다.
     <authentication mode="Forms">
     	<forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"  	
       protection="All" path="/" timeout="30" /> 
    </authentication> 					
  4. 다음과 같이 <authorization> 섹션에서 익명 사용자의 액세스를 거부하도록 지정합니다.
     <authorization> 
    	<deny users ="?" /> 	
       <allow users = "*" /> 
    </authorization> 					

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

이 절에서는 사용자 이름, 암호 및 사용자 역할을 저장하기 위한 예제 데이터베이스를 만드는 방법을 설명합니다. 데이터베이스에 사용자 역할을 저장하고 역할 기반 보안을 구현하려면 역할 열이 필요합니다.
  1. Windows 시작 메뉴에서 실행을 누른 다음 notepad를 입력하여 메모장을 엽니다.
  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.SqlClient
     Imports System.Web.Security 					
  3. 데이터베이스를 조사하여 사용자 자격 증명이 유효한지 확인하는 ValidateUser 함수를 만듭니다. 이 때 해당 데이터베이스를 가리키도록 Connection 문자열을 변경해야 합니다.
     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 이벤트의 해당 페이지로 사용자를 리디렉션할 수 있습니다. 두 경우 모두에 대한 예제 코드가 제공됩니다. 해당 요구 사항에 따라 두 방법 중 하나를 사용하십시오.
    • 다음과 같이 RedirectFromLoginPage 메서드를 호출하여 폼 인증 쿠기를 자동으로 생성하고 cmdLogin_ServerClick 이벤트의 해당 페이지로 사용자를 리디렉션합니다.
       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 연결 정보를 저장해 두면 필요할 때마다 손쉽게 수정할 수 있습니다.
  • 다양한 암호 조합을 사용하여 로그온하려는 해커를 막는 코드를 추가하는 것도 고려해 볼 수 있습니다. 예를 들어, 2~3회의 로그온 시도만 허용하는 논리를 포함시킬 수 있습니다. 사용자가 일정한 횟수 이내에 로그온하지 못한 경우 사용자가 다른 페이지를 방문하거나 지원 서비스를 받아서 자신의 계정을 다시 활성화할 때까지는 해당 사용자의 로그온을 막도록 데이터베이스에 플래그를 설정할 수 있습니다. 또한 필요에 따라 적절한 오류 처리 기능도 추가해야 합니다.
  • 인증 쿠키를 기반으로 사용자가 식별되기 때문에 이 응용 프로그램에 SSL(Secure Sockets Layer)을 사용하여 인증 쿠키와 전송되는 기타 유용한 정보를 어느 누구도 검색할 수 없도록 할 수 있습니다.
  • 폼 기반 인증을 사용하려면 클라이언트 브라우저에서 쿠키를 허용하거나 활성화해야 합니다.
  • <authentication> 구성 섹션의 timeout 매개 변수는 인증 쿠키의 재생성 간격을 제어합니다. 보다 나은 성능과 보안을 제공하는 값을 선택할 수 있습니다.
  • Set-Cookie 헤더를 포함하는 웹 서버 응답을 인터넷 상에 존재하는 특정 중간 프록시와 캐시에서 먼저 캐싱하고 다른 사용자에게 반환할 수 있습니다.

참조

<credentials> 섹션을 사용하여 사용자 및 암호를 저장하는 단순한 폼 기반 인증을 구현하는 방법에 대한 자세한 내용은 다음 ASP.NET QuickStart 예제에서 다음 문서를 참조하십시오.
폼 기반 인증(영문)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx (http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx)
XML(eXtensible Markup Language) 파일을 사용하여 사용자 및 암호를 저장하는 폼 기반 인증을 구현하는 방법에 대한 자세한 내용은 .NET Framework SDK(Software Development Kit) 설명서에서 다음 항목을 참조하십시오.
XML 사용자 파일을 사용한 폼 인증
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp (http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp)
ASP.NET 웹 응용 프로그램 보안에 대한 자세한 내용은 .NET Framework SDK 설명서에서 다음 문서를 참조하십시오.
ASP.NET 웹 응용 프로그램 보안
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconaspnetwebapplicationsecurity.asp (http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconaspnetwebapplicationsecurity.asp)
System.Web.Security 네임스페이스에 대한 자세한 내용은 .NET Framework SDK 설명서의 다음 문서를 참조하십시오.
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpref/html/frlrfSystemWebSecurity.asp (http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpref/html/frlrfSystemWebSecurity.asp)
ASP.NET 구성에 대한 자세한 내용은 .NET Framework SDK 설명서의 다음 문서를 참조하십시오.
ASP.NET 구성
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconaspnetconfiguration.asp (http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpconaspnetconfiguration.asp)

ASP.NET 구성 섹션
http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpgrfaspnetconfigurationsections.asp (http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/cpguide/html/cpgrfaspnetconfigurationsections.asp)
ASP.NET 보안 지침에 대한 자세한 내용은 다음 MSDN 백서를 참조하십시오.
ASP.NET 인증: .NET 보안 지침(영문)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx (http://msdn2.microsoft.com/en-us/library/ms978378.aspx)
ASP.NET에 대한 자세한 내용은 다음 MSDN 뉴스 그룹을 참조하십시오.
microsoft.public.dotnet.framework.aspnet (http://go.microsoft.com/fwlink/?linkid=5811&clcid=0x409)
자세한 내용은 다음 서적을 참조하십시오.
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET (http://go.microsoft.com/fwlink/?LinkId=8367 ) . Microsoft Press, 2001.

Howard, Michael and David LeBlanc. Writing Secure Code (http://go.microsoft.com/fwlink/?LinkId=8366 ) . Microsoft Press, 2001.




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면 Microsoft 뉴스 그룹 (http://support.microsoft.com/newsgroups/default.aspx) 에 참여하시기 바랍니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
  • 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
키워드: 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157
공유
추가 지원 옵션
Microsoft Community 지원 포럼
직접 문의하기
Microsoft Certified Partner 찾기
Microsoft Store
소기업이 아닙니까?
다음에서 팔로우하십시오.