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

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

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

 

이 절에서는 <authentication><authorization> 구성 절을 추가 및 수정하여 폼 기반 인증을 사용하도록 ASP.NET 응용 프로그램을 구성하는 방법을 설명합니다.

  1. 프로젝트 탐색기에서 Web.config 파일을 엽니다.
  2. 인증 모드를 Forms로 변경합니다.
  3. <Forms> 태그를 삽입하고 적절한 특성으로 채웁니다. 다음 코드를 복사한 다음 편집 메뉴에서 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.cs)에 있는 코드를 설명합니다.
  1. 로그온을 두 번 눌러 Logon.aspx.cs 파일을 엽니다.
  2. 다음과 같이 필요한 네임스페이스를 코드 숨김 파일로 가져옵니다.
    using System.Data.SqlClient;
    using System.Web.Security;
  3. 데이터베이스를 조사하여 사용자 자격 증명이 유효한지 확인하는 ValidateUser 함수를 만듭니다. 데이터베이스를 가리키도록 연결 문자열을 변경해야 합니다.
    private bool ValidateUser(string uid, string passwd)
    {
       SqlConnection cnn;
       SqlCommand cmd;
       SqlDataReader dr;
    cnn = new SqlConnection
    ("server=localhost;uid=sa;pwd=password;database=pubs");
    cmd = new SqlCommand
    ("Select *from users where uname='" + uid + "'",cnn);
    cnn.Open(); dr = cmd.ExecuteReader(); while (dr.Read()) { if (string.Compare(dr["Pwd"].ToString(),passwd,false)==0) { cnn.Close(); return true; } } cnn.Close(); return false; }
  4. 두 메서드 중 하나를 사용하여 폼 인증 쿠키를 생성하고 cmdLogin_ServerClick 이벤트의 해당 페이지로 사용자를 리디렉션할 수 있습니다. 두 시나리오에 대한 예제 코드가 제공됩니다. 두 시나리오 중 필요한 시나리오를 사용하십시오.

    • 다음과 같이 RedirectFromLoginPage 메서드를 호출하여 폼 인증 쿠키를 자동으로 생성하고 cmdLogin_ServerClick 이벤트의 해당 페이지로 사용자를 리디렉션합니다.
      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); }
    • 인증 티켓을 생성하고, 암호화하고, 쿠키를 만들고, 응답에 쿠키를 추가한 다음 사용자를 리디렉션합니다. 이를 통해 쿠키를 만드는 방법을 보다 강력하게 제어할 수 있습니다. 또한 이 경우에는 FormsAuthenticationTicket과 함께 사용자 지정 데이터를 포함시킬 수 있습니다.
      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); 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); }
  5. Web Form Designer가 생성하는 코드의 InitializeComponent 메서드에 다음 코드가 추가되어 있는지 확인합니다.
    this.cmdLogin.ServerClick += 
    new System.EventHandler(this.cmdLogin_ServerClick);


Default.aspx 페이지 만들기

이 절에서는 인증된 후에 사용자가 리디렉션되는 테스트 페이지를 만듭니다. 처음에 응용 프로그램에 로그온하지 않고 이 페이지를 검색하는 경우 로그온 페이지로 리디렉션됩니다.
  1. 기존 WebForm1.aspx 페이지의 이름을 Default.aspx로 바꾸고 편집기에서 엽니다.
  2. HTML 뷰로 전환하고 다음 코드를 <form> 태그 사이에 복사합니다.
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    이 단추는 폼 인증 섹션에서 로그오프하는 데 사용됩니다.
  3. 디자인 뷰로 전환하고 해당 페이지를 저장합니다.
  4. 다음과 같이 필요한 네임스페이스를 코드 숨김 파일로 가져옵니다.
    using System.Web.Security;
  5. 로그아웃을 두 번 눌러 코드 숨김 페이지(Default.aspx.cs)를 열고 다음 코드를 cmdSignOut_ServerClick 이벤트 처리기에 복사합니다.
    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
       FormsAuthentication.SignOut();
       Response.Redirect("logon.aspx", true);
    }
  6. Web Form Designer가 생성하는 코드의 InitializeComponent 메서드에 다음 코드가 추가되어 있는지 확인합니다.
    this.cmdSignOut.ServerClick +=
    new System.EventHandler(this.cmdSignOut_ServerClick);
  7. 프로젝트를 저장하고 컴파일합니다. 이제 해당 응용 프로그램을 사용할 수 있습니다.

추가 정보

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

     

+ Recent posts