반응형
'ASP.NET & Core를 다루는 기술'이라는 책을 통해서 ASP.NET 공부를 하기 시작했다. 공부를 하다보니 예제와 설명이 적절하게 섞여서 나온 책인 것 같다. 위의 책을 바탕으로 공부한 내용을 글로 쓰려한다.
인증과 권한
- 인증(Authentication)은 특정 아이디와 암호로 인증된 사용자임을 확인하는 것으로 로그인이 통과됨을 의미한다.
- 권한(Authorization) 또는 허가는 인증된 사용자에게 특정 자원에 접근할 수 있도록 처리하는 것으로 응용 프로그램 내에서 특정 권한에 대한 허가를 의미한다.
인증 방식의 종류
- 세션 인증 : ASP.NET의 Session 개체를 사용해 인증된 사용자에 대한 특정 값을 비교하는 방식으로 인증을 처리하는 방식 중에서 가장 고전적인 방식이다.
- 쿠키 인증 : 세션 인증의 서버 측 자원 사용을 줄이고자 인증 정보를 클라이언트 웹 브라우저의 쿠키에 저장하는 인증 방식이다.
- 폼 인증 : ASP.NET 웹 폼의 대표적인 인증 방식으로 인증 관련 기능을 따로 API화 해 놓은 방식이다.
실습 ( 코드 기반으로 회원 가입, 로그인, 로그인 확인, 로그아웃 구현하기 )
1. SQL Server 데이터베이스 프로젝트에 인증 관련 테이블 및 저장 프로시저 추가
- 데이터베이스 이름은 'DotNetNote.Database'로 만들었다.
- 테이블은 'Users'로 이름짓고 생성했다.
UID는 Primary Key로 설정했고 Identity 설정해서 1씩 증가하도록 만들어주었다.
- 실습에 필요한 프로시저는 다음과 같이 입력한다.
-- [1] 입력 저장 프로시저
CREATE PROCEDURE WriterUsers
@UserID NVARCHAR(25),
@Password NVARCHAR(20)
AS
INSERT INTO Users Values (@UserID, @Password)
-- [2] 출력 저장 프로시저
CREATE PROCEDURE ListUsers
AS
SELECT *
FROM Users
ORDER BY UID DESC
-- [3] 상세 저장 프로시저
CREATE PROCEDURE ViewUsers
@UID INT
AS
SELECT *
FROM Users
WHERE UID = @UID
-- [4] 수정 저장 프로시저
CREATE PROCEDURE ModifyUsers
@UserID NVARCHAR(25),
@Password NVARCHAR(20),
@UID INT
AS
BEGIN TRAN
UPDATE Users SET UserID = @UserID, [Password] = @Password WHERE UID = @UID
COMMIT TRAN
-- [5] 삭제 저장 프로시저
CREATE PROCEDURE DeleteUsers
@UID INT
AS
DELETE Users WHERE UID = @UID
-- [6] 검색 저장 프로시저
CREATE PROCEDURE SearchUsers
@SearchField NVARCHAR(25),
@SearchQuery NVARCHAR(25)
AS
DECLARE @strSql NVARCHAR(255)
SET @strSql = '
SELECT *
FROM Users
WHERE ' + @SearchField + ' Like ''%' + @SearchQuery + '%'''
EXEC(@strSql)
2. ASP.NET 웹 폼, MVC, Web API가 포함된 웹 프로젝트 생성
- 새로운 프로젝트를 만들 때 Empty 템플릿에 ASP.NET Web Forms, MVC, Web API 관련 참조를 추가해서 생성한다.
- 프로젝트 루트에 있는 'Web.config' 파일을 열고, 데이터베이스 연결 문자열 정보와 폼인증 설정을 위한 코드를 다음과 같이 입력한다.
<configuration>
<!-- [1] 데이터베이스 연결 문자열 -->
<connectionStrings>
<add name="ConnectionString" connectionString="Data Source=10.188.2.239;Initial Catalog=DotNetNote.Database;User ID=chang;Password=root1234!!" providerName="System.Data.SqlClient"/>
</connectionStrings>
<appSettings>
... 생략 ...
</appSettings>
<system.web>
<!-- [2] 폼 인증 적용 -->
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx"></forms>
</authentication>
... 생략 ...
- 프로젝트 루트에 'Default.aspx' 웹 폼을 생성하고 다음과 같이 코드를 작성한다.
< /Default.aspx >
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DevUser.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>회원 관리 - 메인 페이지</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>회원 관리</h1>
<h2>메인 페이지</h2>
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<!-- 로그인 전 -->
<asp:LoginStatus ID="LoginStatus1" runat="server" LoginText="로그인" />
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Register.aspx">회원가입</asp:HyperLink>
</AnonymousTemplate>
<LoggedInTemplate>
<!-- 로그인 후 -->
<asp:LoginStatus ID="LoginStatus2" runat="server" LogoutText="로그아웃" Visible="false" />
<a href="Logout.aspx">로그아웃</a>
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="~/UserInfo.aspx">
<asp:LoginName ID="LoginName1" runat="server" />
</asp:HyperLink>
</LoggedInTemplate>
</asp:LoginView>
</div>
</form>
</body>
</html>
아직 해당 링크의 웹 폼을 만들지 않았기 때문에 404 에러가 뜨지만 차차 만들어 갈 예정이다.
- 프로젝트 Models 디렉토리에 'UserViewModel.cs' 클래스 파일을 생성하고 코드는 다음과 같이 입력한다.
public class UserViewModel
{
public int ID { get; set; }
public string userID { get; set; }
public string password { get; set; }
}
- 프로젝트 루트에 'Repositories' 라는 디렉토리를 생성해준다. Repositories 폴더에 'UserRepository.cs' 클래스를 만들어주고 코드는 다음과 같이 입력한다.
using DevUser.Models;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Configuration;
namespace DevUser.Repositories
{
public class UserRepository
{
// 공통으로 사용될 커넥션 개체
private SqlConnection con;
public UserRepository ()
{
con = new SqlConnection();
con.ConnectionString = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
}
public void AddUser (string userID, string password)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "WriteUsers";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserID", userID);
cmd.Parameters.AddWithValue("@Password", password);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public UserViewModel GetUserByUserID (string userID)
{
UserViewModel r = new UserViewModel();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Users WHERE UserID = @UserID";
cmd.CommandType = System.Data.CommandType.Text;
cmd.Parameters.AddWithValue("@UserID", userID);
con.Open();
IDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
r.ID = dr.GetInt32(0);
r.userID = dr.GetString(1);
r.password = dr.GetString(2);
}
con.Close();
return r;
}
public void ModifyUser (int UID, string userID, string password)
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "ModifyUsers";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserID", userID);
cmd.Parameters.AddWithValue("@Password", password);
cmd.Parameters.AddWithValue("@UID", UID);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
public bool IsCorrectUser (string userID, string password)
{
bool result = false;
con.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "SELECT * FROM Users WHERE UserID = @UserID AND Password = @Password";
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@UserID", userID);
cmd.Parameters.AddWithValue("@Password", password);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
result = true;
dr.Close();
con.Close();
return result;
}
}
}
메서드 이름을 보면 어떤 역할을 하는 메서드인지 알 수 있을 것이다.
- 프로젝트 루트에 'Register.aspx' 웹 폼을 추가한다. 코드는 다음과 같이 입력한다.
< /Register.aspx >
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Register.aspx.cs" Inherits="DevUser.Register" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>회원 관리 - 회원 가입</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>회원 관리</h1>
<h2>회원 가입</h2>
아이디 : <asp:TextBox ID="txtUserID" runat="server"></asp:TextBox><br />
암호 : <asp:TextBox ID="txtPassword" runat="server" TextMode="Password"></asp:TextBox><br />
<asp:Button ID="btnRegister" runat="server" Text="회원가입" OnClick="btnRegister_Click" /><br />
</div>
</form>
</body>
</html>
< /Register.aspx.cs >
... 생략 ...
protected void btnRegister_Click(object sender, EventArgs e)
{
// 데이터 저장
UserRepository userRepo = new UserRepository();
userRepo.AddUser(txtUserID.Text, txtPassword.Text);
// 메시지 박스 출력 후 기본 페이지로 이동
string strJs = "<script>alert('가입완료'); location.href='Defalut.aspx';</script>";
Page.ClientScript.RegisterStartupScript(this.GetType(), "goDefault", strJs);
}
Page.ClientScript.RegisterStartupScript 메서드를 이용해서 특정 자바스크립트 코드를 바로 실행할 수도 있다.
반응형