C# .NET을 사용하여 ASP.NET 응용 프로그램 만들기
- Visual Studio .NET을 엽니다.
- 새로운 ASP.NET 웹 응용 프로그램을 만들고 이름과 위치를 지정합니다.
Web.config 파일에서 보안 설정 구성
이 절에서는 <authentication> 및 <authorization> 구성 절을 추가 및 수정하여 폼 기반 인증을 사용하도록 ASP.NET 응용 프로그램을 구성하는 방법을 설명합니다.
- 프로젝트 탐색기에서 Web.config 파일을 엽니다.
- 인증 모드를 Forms로 변경합니다.
- <Forms> 태그를 삽입하고 적절한 특성으로 채웁니다. 다음 코드를 복사한 다음 편집 메뉴에서 HTML로 붙여넣기를 눌러 코드를 파일의 <authentication> 섹션에 붙여넣습니다.
<authentication mode="Forms"> <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30" /> </authentication>
- 다음과 같이 <authorization> 섹션에서 익명 사용자의 액세스를 거부하도록 지정합니다.
<authorization> <deny users ="?" /> <allow users = "*" /> </authorization>
사용자 정보를 저장하기 위한 데이터베이스 테이블 만들기
이 절에서는 사용자 이름, 암호 및 사용자 역할을 저장하기 위한 예제 데이터베이스를 만드는 방법을 설명합니다. 데이터베이스에 용자 역할을 저장하고 역할 기반 보안을 구현하려면 역할 열이 필요합니다.
- Windows 시작 메뉴에서 실행을 누르고 notepad를 입력하여 메모장을 엽니다.
- 다음 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
- 파일을 Users.sql로 저장합니다.
- Microsoft SQL Server 컴퓨터의 쿼리 분석기에서 Users.sql을 엽니다. 데이터베이스 목록에서 pubs를 누른 다음 해당 스크립트를 실행합니다. 이렇게 하면 예제 사용자 테이블이 만들어지고 이 예제 응용 프로그램에 사용될 Pubs 데이터베이스의 테이블이 채워집니다.
Logon.aspx 페이지 만들기
- Logon.aspx라는 프로젝트에 새 Web Form을 추가합니다.
- 편집기에서 Logon.aspx 페이지를 열고 HTML 뷰로 전환합니다.
- 다음 코드를 복사하고 편집 메뉴의 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"
이 Web Form은 사용자들이 사용자 이름과 암호를 제공하여 응용 프로그램에 로그온할 수 있도록 사용자에게 로그온 폼을 제공하는 데 사용됩니다.
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" />
- 디자인 뷰로 전환하고 해당 페이지를 저장합니다.
사용자 자격 증명이 유효한지 확인하도록 이벤트 처리기 코딩
이 절에서는 코드 숨김 페이지(Logon.aspx.cs)에 있는 코드를 설명합니다.
- 로그온을 두 번 눌러 Logon.aspx.cs 파일을 엽니다.
- 다음과 같이 필요한 네임스페이스를 코드 숨김 파일로 가져옵니다.
using System.Data.SqlClient; using System.Web.Security;
- 데이터베이스를 조사하여 사용자 자격 증명이 유효한지 확인하는 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; } - 두 메서드 중 하나를 사용하여 폼 인증 쿠키를 생성하고 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); }
- 다음과 같이 RedirectFromLoginPage 메서드를 호출하여 폼 인증 쿠키를 자동으로 생성하고 cmdLogin_ServerClick 이벤트의 해당 페이지로 사용자를 리디렉션합니다.
- Web Form Designer가 생성하는 코드의 InitializeComponent 메서드에 다음 코드가 추가되어 있는지 확인합니다.
this.cmdLogin.ServerClick +=
new System.EventHandler(this.cmdLogin_ServerClick);
Default.aspx 페이지 만들기
- 기존 WebForm1.aspx 페이지의 이름을 Default.aspx로 바꾸고 편집기에서 엽니다.
- HTML 뷰로 전환하고 다음 코드를 <form> 태그 사이에 복사합니다.
<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
이 단추는 폼 인증 섹션에서 로그오프하는 데 사용됩니다.
- 디자인 뷰로 전환하고 해당 페이지를 저장합니다.
- 다음과 같이 필요한 네임스페이스를 코드 숨김 파일로 가져옵니다.
using System.Web.Security;
- 로그아웃을 두 번 눌러 코드 숨김 페이지(Default.aspx.cs)를 열고 다음 코드를 cmdSignOut_ServerClick 이벤트 처리기에 복사합니다.
private void cmdSignOut_ServerClick(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("logon.aspx", true); }
- Web Form Designer가 생성하는 코드의 InitializeComponent 메서드에 다음 코드가 추가되어 있는지 확인합니다.
this.cmdSignOut.ServerClick +=
new System.EventHandler(this.cmdSignOut_ServerClick); - 프로젝트를 저장하고 컴파일합니다. 이제 해당 응용 프로그램을 사용할 수 있습니다.
추가 정보
- 데이터베이스에서 보안을 유지하면서 암호를 저장할 수 있습니다. HashPasswordForStoringInConfigFile이라는 FormsAuthentication 클래스 유틸리티 함수를 사용하여 암호를 데이터베이스 또는 구성 파일에 저장하기 전에 암호화할 수 있습니다.
- 필요할 때 쉽게 수정할 수 있도록 SQL 연결 정보를 구성 파일(Web.config)에 저장하려는 경우가 있습니다.
- 다른 암호 조합을 사용하려는 해커가 로그온하지 못하도록 코드 추가를 고려할 수 있습니다. 예를 들어, 두 번 또는 세 번의 로그온 시도만 허용하는 논리를 포함시킬 수 있습니다. 사용자가 특정 시도 횟수 안에 로그온할 수 없으면 다른 페이지를 방문하거나 전화로 문의하여 본인의 계정을 다시 사용할 수 있을 때까지 로그온할 수 없도록 데이터베이스에 플래그를 설정할 수 있습니다. 또한 이를 위해서는 필요한 위치에 적절한 오류 처리 코드를 추가해야 합니다.
- 사용자는 인증 쿠키를 기반으로 식별되므로 어느 누구라도 인증 쿠키 및 전송되는 다른 유용한 정보를 가로챌 수 없도록 이 응용 프로그램에 대해 SSL(Secure Sockets Layer)을 사용할 수 있습니다.
- 폼 기반 인증을 사용하려면 클라이언트가 브라우저에서 쿠키를 허용하거나 활성화해야 합니다.
- <authentication> 구성 섹션의 timeout 매개 변수는 인증 쿠키가 다시 생성되는 간격을 제어합니다. 보다 나은 성능과 보안을 제공하는 값을 선택할 수 있습니다.
- 인터넷의 특정한 중간 프록시 및 캐시는 Set-Cookie 헤더를 포함하는 웹 서버 응답을 캐시할 수 있으며, 이 응답은 다른 사용자에게 반환됩니다. 폼 기반 인증은 쿠키를 사용하여 사용자를 인증하므로 사용자들이 중간 프록시나 캐시로부터 원래 의도되지 않았던 쿠키를 받아 다른 사용자를 실수로 또는 고의로 가장할 수 있습니다. 다음 문서에서는 이러한 상황을 해결하는 방법을 설명합니다.
'.net' 카테고리의 다른 글
ASP.NET의 정규식 (0) | 2007.05.03 |
---|---|
회원가입 자동등록기를 통한 회원등록을 막기 (1) | 2007.05.03 |
ASP.NET에서 오류 보고 페이지를 만드는 방법 (0) | 2007.05.03 |
ASP.NET에서 웹 서버에 파일 업로드 (1) | 2007.05.03 |
ASP.NET 응용 프로그램간 사용자 정의 컨트롤 공유하기 (0) | 2007.05.03 |