본문 바로가기

WEB/ASP.NET

[ASP.NET 공부] ASP.NET 로그인 컨트롤과 회원 관리 (1) - 짱우의 코딩일기 - 티스토리

반응형

  '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 메서드를 이용해서 특정 자바스크립트 코드를 바로 실행할 수도 있다.


 

반응형