폼 인증 개요 (C#)An Overview of Forms Authentication (C#)

Scott Mitchellby Scott Mitchell

코드 다운로드 또는 PDF 다운로드Download Code or Download PDF

이 자습서에서는 구현에 대 한 단순한 토론을 사용 합니다. 특히 폼 인증을 구현 하는 방법을 살펴보겠습니다.In this tutorial we will turn from mere discussion to implementation; in particular, we will look at implementing forms authentication. 이 자습서에서 생성 하기 시작 하는 웹 응용 프로그램은 간단한 폼 인증에서 멤버 자격 및 역할로 이동 하는 이후 자습서에서 계속 빌드됩니다.The web application we start constructing in this tutorial will continue to be built upon in subsequent tutorials, as we move from simple forms authentication to membership and roles.

이 항목에 대 한 자세한 내용은 ASP.NET에서 기본 폼 인증 사용을 참조 하세요.Please see this video for more information on this topic: Using Basic Forms Authentication in ASP.NET.

소개Introduction

이전 자습서 에서는 ASP.NET에서 제공 하는 다양 한 인증, 권한 부여 및 사용자 계정 옵션에 대해 설명 했습니다.In the preceding tutorial we discussed the various authentication, authorization, and user account options provided by ASP.NET. 이 자습서에서는 구현에 대 한 단순한 토론을 사용 합니다. 특히 폼 인증을 구현 하는 방법을 살펴보겠습니다.In this tutorial we will turn from mere discussion to implementation; in particular, we will look at implementing forms authentication. 이 자습서에서 생성 하기 시작 하는 웹 응용 프로그램은 간단한 폼 인증에서 멤버 자격 및 역할로 이동 하는 이후 자습서에서 계속 빌드됩니다.The web application we start constructing in this tutorial will continue to be built upon in subsequent tutorials, as we move from simple forms authentication to membership and roles.

이 자습서는 이전 자습서에서 다루는 토픽 인 forms 인증 워크플로를 자세히 살펴보는 것으로 시작 합니다.This tutorial begins with an in-depth look at the forms authentication workflow, a topic we touched upon in the previous tutorial. 다음으로 폼 인증의 개념을 시연 하는 데 사용할 ASP.NET 웹 사이트를 만들게 됩니다.Following that, we will create an ASP.NET website through which to demo the concepts of forms authentication. 다음으로 폼 인증을 사용 하 고, 간단한 로그인 페이지를 만들고, 사용자가 인증 되었는지 여부를 확인 하는 방법 및 사용자가 로그인 한 사용자 이름을 코드에서 확인 하는 방법을 확인 합니다.Next, we will configure the site to use forms authentication, create a simple login page, and see how to determine, in code, whether a user is authenticated and, if so, the username they logged in with.

웹 응용 프로그램에서 폼 인증 워크플로를 사용 하도록 설정 하 고 로그인 및 로그 오프 페이지를 만드는 것은 사용자 계정을 지원 하 고 웹 페이지를 통해 사용자를 인증 하는 ASP.NET 응용 프로그램을 구축 하는 모든 중요 한 단계입니다.Understanding the forms authentication workflow, enabling it in a web application, and creating the login and logoff pages are all vital steps in building an ASP.NET application that supports user accounts and authenticates users through a web page. 이로 인해 이러한 자습서는 서로를 기반으로 하기 때문에 이전 프로젝트에서 폼 인증을 구성 하는 경험이 이미 있는 경우에도이 자습서를 계속 진행 하기 전에 전체에서이 자습서를 진행 하는 것이 좋습니다.Because of this – and because these tutorials build upon one another - I would encourage you to work through this tutorial in full before moving on to the next one even if you already have had experience configuring forms authentication in past projects.

폼 인증 워크플로 이해Understanding the Forms Authentication Workflow

ASP.NET 런타임이 ASP.NET 페이지 또는 ASP.NET 웹 서비스와 같은 ASP.NET 리소스에 대 한 요청을 처리 하는 경우 요청은 수명 주기 동안 여러 이벤트를 발생 시킵니다.When the ASP.NET runtime processes a request for an ASP.NET resource, such as an ASP.NET page or ASP.NET Web service, the request raises a number of events during its lifecycle. 요청의 시작 및 최소 끝에서 발생 하는 이벤트, 요청이 인증 되 고 권한이 부여 되 면 발생 하는 이벤트, 처리 되지 않은 예외 발생 시 발생 한 이벤트 등이 있습니다.There are events raised at the very beginning and very end of the request, ones raised when the request is being authenticated and authorized, an event raised in the case of an unhandled exception, and so forth. 이벤트의 전체 목록을 보려면 HttpApplication 개체의 이벤트를 참조 하세요.To see a complete listing of the events, refer to the HttpApplication object's events.

HTTP 모듈 은 요청 수명 주기의 특정 이벤트에 대 한 응답으로 코드가 실행 되는 관리 되는 클래스입니다.HTTP Modules are managed classes whose code is executed in response to a particular event in the request lifecycle. ASP.NET는 백그라운드에서 필수 작업을 수행 하는 다양 한 HTTP 모듈과 함께 제공 됩니다.ASP.NET ships with a number of HTTP Modules that perform essential tasks behind the scenes. 특히 논의와 관련 된 두 가지 기본 제공 HTTP 모듈은 다음과 같습니다.Two built-in HTTP Modules that are especially relevant to our discussion are:

  • FormsAuthenticationModule – 일반적으로 사용자의 쿠키 컬렉션에 포함 되는 폼 인증 티켓을 검사 하 여 사용자를 인증 합니다.FormsAuthenticationModule – authenticates the user by inspecting the forms authentication ticket, which is typically included in the user's cookies collection. 폼 인증 티켓이 없는 경우 사용자는 익명입니다.If no forms authentication ticket is present, the user is anonymous.
  • UrlAuthorizationModule – 현재 사용자에 게 요청 된 URL에 액세스할 수 있는 권한이 있는지 여부를 확인 합니다.UrlAuthorizationModule – determines whether or not the current user is authorized to access the requested URL. 이 모듈은 응용 프로그램의 구성 파일에 지정 된 권한 부여 규칙을 확인 하 여 권한을 확인 합니다.This module determines the authority by consulting the authorization rules specified in the application's configuration files. ASP.NET에는 요청 된 파일 Acl을 참조 하 여 권한을 결정 하는 FileAuthorizationModule 포함 되어 있습니다.ASP.NET also includes the FileAuthorizationModule that determines authority by consulting the requested file(s) ACLs.

FormsAuthenticationModuleUrlAuthorizationModule (및 FileAuthorizationModule)를 실행 하기 전에 사용자를 인증 하려고 시도 합니다.The FormsAuthenticationModule attempts to authenticate the user prior to the UrlAuthorizationModule (and FileAuthorizationModule) executing. 요청 하는 사용자에 게 요청 된 리소스에 대 한 액세스 권한이 없는 경우 권한 부여 모듈은 요청을 종료 하 고 HTTP 401 권한 없음 상태를 반환 합니다.If the user making the request is not authorized to access the requested resource, the authorization module terminates the request and returns an HTTP 401 Unauthorized status. Windows 인증 시나리오에서 HTTP 401 상태가 브라우저에 반환 됩니다.In Windows authentication scenarios, the HTTP 401 status is returned to the browser. 이 상태 코드를 사용 하면 브라우저에서 모달 대화 상자를 통해 사용자에 게 자격 증명을 입력 하 라는 메시지를 표시 합니다.This status code causes the browser to prompt the user for their credentials via a modal dialog box. 그러나 폼 인증을 사용 하는 경우 FormsAuthenticationModule에서이 상태를 검색 하 고이를 수정 하 여 사용자를 대신 로그인 페이지로 리디렉션하도록 ( http 302 리디렉션 상태를 통해) Http 401 권한 없음 상태가 브라우저로 전송 되지 않습니다.With forms authentication, however, the HTTP 401 Unauthorized status is never sent to the browser because the FormsAuthenticationModule detects this status and modifies it to redirect the user to the login page instead (via an HTTP 302 Redirect status).

로그인 페이지의 책임은 사용자의 자격 증명이 유효한 지 확인 하 고, 그렇다면 폼 인증 티켓을 만들고 사용자를 방문 하려고 했던 페이지로 다시 리디렉션하는 것입니다.The login page's responsibility is to determine if the user's credentials are valid and, if so, to create a forms authentication ticket and redirect the user back to the page they were attempting to visit. 인증 티켓은 FormsAuthenticationModule에서 사용자를 식별 하는 데 사용 하는 웹 사이트의 페이지에 대 한 후속 요청에 포함 됩니다.The authentication ticket is included in subsequent requests to the pages on the website, which the FormsAuthenticationModule uses to identify the user.

폼 인증 워크플로

그림 1: 폼 인증 워크플로Figure 1: The Forms Authentication Workflow

페이지 방문 간 인증 티켓 기억Remembering the Authentication Ticket Across Page Visits

로그인 한 후에는 사용자가 사이트를 찾아볼 때 로그인 상태를 유지 하도록 각 요청에서 폼 인증 티켓을 웹 서버로 다시 전송 해야 합니다.After logging in, the forms authentication ticket must be sent back to the web server on each request so that the user remains logged in as they browse the site. 이는 일반적으로 사용자의 쿠키 컬렉션에 인증 티켓을 배치 하 여 수행 됩니다.This is typically accomplished by placing the authentication ticket in the user's cookies collection. 쿠키 는 사용자의 컴퓨터에 상주 하며 쿠키를 만든 웹 사이트에 대 한 각 요청에서 HTTP 헤더에 전송 되는 작은 텍스트 파일입니다.Cookies are small text files that reside on the user's computer and are transmitted in the HTTP headers on each request to the website that created the cookie. 따라서 폼 인증 티켓을 만들어 브라우저의 쿠키에 저장 한 후에는 해당 사이트에 대 한 각 후속 방문에서 요청과 함께 인증 티켓을 전송 하 여 사용자를 식별 합니다.Therefore, once the forms authentication ticket has been created and stored in the browser's cookies, each subsequent visit to that site sends the authentication ticket along with the request, thereby identifying the user.

쿠키의 한 가지 측면은 브라우저에서 쿠키를 삭제 하는 날짜와 시간인 만료입니다.One aspect of cookies is their expiration, which is the date and time at which the browser discards the cookie. 폼 인증 쿠키가 만료 되 면 사용자는 더 이상 인증할 수 없으므로 익명이 됩니다.When the forms authentication cookie expires, the user can no longer be authenticated and therefore become anonymous. 사용자가 공용 터미널에서 방문 하는 경우 브라우저를 닫을 때 인증 티켓이 만료 되 게 할 수 있습니다.When a user is visiting from a public terminal, chances are they want their authentication ticket to expire when they close their browser. 그러나 홈에서 방문할 때 동일한 사용자가 사이트를 방문할 때마다 다시 로그인 하지 않아도 되도록 브라우저를 다시 시작 하는 동안 인증 티켓이 기억 되도록 할 수 있습니다.When visiting from home, however, that same user might want the authentication ticket to be remembered across browser restarts so that they do not have to re-log in each time they visit the site. 이러한 결정은 사용자가 로그인 페이지에서 "사용자 이름" 확인란을 선택 하는 경우가 많습니다.This decision is often made by the user in the form of a "Remember me" checkbox on the login page. 3 단계에서는 로그인 페이지에서 "암호 기억을" 확인란을 구현 하는 방법을 살펴봅니다.In Step 3 we will examine how to implement a "Remember me" checkbox in the login page. 다음 자습서에서는 인증 티켓 시간 제한 설정을 자세히 다룹니다.The following tutorial addresses the authentication ticket timeout settings in detail.

Note

웹 사이트에 로그온 하는 데 사용 된 사용자 에이전트가 쿠키를 지원 하지 않을 수 있습니다.It is possible that the user agent used to log on to the website may not support cookies. 이러한 경우 ASP.NET은 쿠키 없는 폼 인증 티켓을 사용할 수 있습니다.In such a case, ASP.NET can use cookieless forms authentication tickets. 이 모드에서 인증 티켓은 URL로 인코딩됩니다.In this mode, the authentication ticket is encoded into the URL. 다음 자습서에서 쿠키 없는 인증 티켓이 사용 되는 경우와 이러한 티켓이 만들어지고 관리 되는 방식을 살펴보겠습니다.We will look at when cookieless authentication tickets are used and how they are created and managed in the next tutorial.

폼 인증의 범위The Scope of Forms Authentication

FormsAuthenticationModule는 ASP.NET 런타임의 일부인 관리 코드입니다.The FormsAuthenticationModule is managed code that is part of the ASP.NET runtime. Microsoft의 인터넷 정보 서비스 (iis) 웹 서버 버전 7 이전에는 IIS의 HTTP 파이프라인과 ASP.NET 런타임의 파이프라인 사이에 별도의 장애가 있었습니다.Prior to version 7 of Microsoft's Internet Information Services (IIS) web server, there was a distinct barrier between IIS's HTTP pipeline and the ASP.NET runtime's pipeline. 간단히 말해서 IIS 6 및 이전 버전에서 FormsAuthenticationModule는 요청이 IIS에서 ASP.NET 런타임으로 위임 된 경우에만 실행 됩니다.In short, in IIS 6 and earlier, the FormsAuthenticationModule only executes when a request is delegated from IIS to the ASP.NET runtime. 기본적으로 IIS는 HTML 페이지와 CSS 및 이미지 파일과 같은 정적 콘텐츠 자체를 처리 하 고 .aspx, .asmx 또는 .ashx의 확장명이 있는 페이지가 요청 될 때 ASP.NET 런타임에 대 한 요청만 전달 합니다.By default, IIS processes static content itself – like HTML pages and CSS and image files – and only hands off requests to the ASP.NET runtime when a page with an extension of .aspx, .asmx, or .ashx is requested.

그러나 IIS 7에서는 통합 IIS 및 ASP.NET 파이프라인을 사용할 수 있습니다.IIS 7, however, allows for integrated IIS and ASP.NET pipelines. 몇 가지 구성 설정을 사용 하 여 IIS 7을 설치 하 여 모든 요청에 대해 FormsAuthenticationModule를 호출할 수 있습니다.With a few configuration settings you can setup IIS 7 to invoke the FormsAuthenticationModule for all requests. 또한 IIS 7에서는 모든 형식의 파일에 대해 URL 권한 부여 규칙을 정의할 수 있습니다.Furthermore, with IIS 7 you can define URL authorization rules for files of any type. 자세한 내용은 IIS6와 Iis7 보안 간의 변경 내용, 웹 플랫폼 보안IIS7 URL 권한 부여 이해를 참조 하세요.For more information, see Changes Between IIS6 and IIS7 Security, Your Web Platform Security, and Understanding IIS7 URL Authorization.

긴 스토리는 IIS 7 이전의 버전에서 폼 인증만 사용 하 여 ASP.NET 런타임에 의해 처리 되는 리소스를 보호할 수 있습니다.Long story short, in versions prior to IIS 7, you can only use forms authentication to protect resources handled by the ASP.NET runtime. 마찬가지로 URL 권한 부여 규칙도 ASP.NET 런타임에 의해 처리 되는 리소스에만 적용 됩니다.Likewise, URL authorization rules are only applied to resources handled by the ASP.NET runtime. 그러나 IIS 7에서는 FormsAuthenticationModule 및 UrlAuthorizationModule을 IIS의 HTTP 파이프라인에 통합 하 여이 기능을 모든 요청으로 확장할 수 있습니다.But with IIS 7 it is possible to integrate the FormsAuthenticationModule and UrlAuthorizationModule into IIS's HTTP pipeline, thereby extending this functionality to all requests.

1 단계:이 자습서 시리즈에 대 한 ASP.NET 웹 사이트 만들기Step 1: Creating an ASP.NET Website for this Tutorial Series

가장 광범위 한 대상 그룹에 도달 하기 위해이 시리즈 전체에 구축 될 ASP.NET 웹 사이트는 Microsoft의 무료 버전인 Visual Studio 2008, Visual Web Developer 2008를 사용 하 여 생성 됩니다.In order to reach the widest possible audience, the ASP.NET website we will be building throughout this series will be created with Microsoft's free version of Visual Studio 2008, Visual Web Developer 2008. Microsoft SQL Server 2005 Express Edition 데이터베이스에서 SqlMembershipProvider 사용자 저장소를 구현 합니다.We will implement the SqlMembershipProvider user store in a Microsoft SQL Server 2005 Express Edition database. Visual Studio 2005 또는 Visual Studio 2008 또는 SQL Server의 다른 버전을 사용 하는 경우에는 걱정 하지 마세요. 단계가 거의 동일 하 고 사소한 차이점을 지적 하지 않습니다.If you are using Visual Studio 2005 or a different edition of Visual Studio 2008 or SQL Server, don't worry - the steps will be nearly identical and any non-trivial differences will be pointed out.

Note

각 자습서에서 사용 되는 데모 웹 응용 프로그램은 다운로드로 제공 됩니다.The demo web application used in each tutorial is available as a download. 다운로드 가능한이 응용 프로그램은 .NET Framework 버전 3.5을 대상으로 하는 Visual Web Developer 2008를 사용 하 여 만들어졌습니다.This downloadable application was created with Visual Web Developer 2008 targeted for the .NET Framework version 3.5. 응용 프로그램은 .NET 3.5를 대상으로 하기 때문에 Web.config 파일에는 3.5 관련 추가 구성 요소가 포함 됩니다.Since the application is targeted for .NET 3.5, its Web.config file includes additional, 3.5-specific configuration elements. 긴 스토리는 컴퓨터에 .NET 3.5을 설치 해야 하는 경우 먼저 Web.config에서 3.5 관련 태그를 제거 하지 않으면 다운로드할 수 있는 웹 응용 프로그램이 작동 하지 않습니다.Long story short, if you have yet to install .NET 3.5 on your computer then the downloadable web application will not work without first removing the 3.5-specific markup from Web.config.

폼 인증을 구성 하기 전에 먼저 ASP.NET 웹 사이트가 필요 합니다.Before we can configure forms authentication, we first need an ASP.NET website. 먼저 새 파일 시스템 기반 ASP.NET 웹 사이트를 만듭니다.Start by creating a new file system-based ASP.NET website. 이렇게 하려면 Visual Web Developer를 시작한 다음 파일 메뉴로 이동 하 여 새 웹 사이트를 선택 하 고 새 웹 사이트 대화 상자를 표시 합니다.To accomplish this, launch Visual Web Developer and then go to the File menu and choose New Web Site, displaying the New Web Site dialog box. ASP.NET 웹 사이트 템플릿을 선택 하 고, 위치 드롭다운 목록을 파일 시스템으로 설정 하 고, 웹 사이트를 저장할 폴더를 선택 하 고, 언어를로 C#설정 합니다.Choose the ASP.NET Web Site template, set the Location drop-down list to File System, choose a folder to place the web site, and set the language to C#. Default.aspx ASP.NET 페이지, 앱_데이터 폴더 및 Web.config 파일을 사용 하 여 새 웹 사이트를 만듭니다.This will create a new web site with a Default.aspx ASP.NET page, an App_Data folder, and a Web.config file.

Note

Visual Studio는 웹 사이트 프로젝트와 웹 응용 프로그램 프로젝트의 두 가지 모드의 프로젝트 관리를 지원 합니다.Visual Studio supports two modes of project management: Web Site Projects and Web Application Projects. 웹 사이트 프로젝트는 프로젝트 파일을 포함 하지 않지만, 웹 응용 프로그램 프로젝트는 Visual Studio .NET 2002/2003의 프로젝트 아키텍처를 모방 합니다. 즉, 프로젝트 파일을 포함 하 고 프로젝트의 소스 코드를 단일 어셈블리로 컴파일합니다 .이는 기능 폴더에 배치 됩니다.Web Site Projects lack a project file, whereas Web Application Projects mimic the project architecture in Visual Studio .NET 2002/2003 – they include a project file and compile the project's source code into a single assembly, which is placed in the /bin folder. 웹 응용 프로그램 프로젝트 모델은 서비스 팩 1로 다시 도입 되었지만 Visual Studio 2005는 처음에만 지원 되는 웹 사이트 프로젝트입니다. Visual Studio 2008는 두 프로젝트 모델을 제공 합니다.Visual Studio 2005 initially only supported Web Site Projects, although the Web Application Project model was reintroduced with Service Pack 1; Visual Studio 2008 offers both project models. 그러나 Visual Web Developer 2005 및 2008 버전은 웹 사이트 프로젝트만 지원 합니다.The Visual Web Developer 2005 and 2008 editions, however, only support Web Site Projects. 웹 사이트 프로젝트 모델을 사용 합니다.I will be using the Web Site Project model. Express 이외의 버전을 사용 중이 고 웹 응용 프로그램 프로젝트 모델 을 대신 사용 하려는 경우에는 자유롭게 수행할 수 있지만 화면에 표시 되는 내용과 이러한 자습서에서 제공 하는 스크린 샷 및 지침과 함께 수행 해야 하는 단계에 약간의 차이가 있을 수 있습니다.If you are using a non-Express edition and want to use the Web Application Project model instead, feel free to do so but be aware that there may be some discrepancies between what you see on your screen and the steps you must take versus the screen shots shown and instructions provided in these tutorials.

새 파일 시스템 기반 웹 사이트 만들기Create a New File System-Based Web Site

그림 2: 새 파일 시스템 기반 웹 사이트 만들기 (전체 크기 이미지를 보려면 클릭)Figure 2: Create a New File System-Based Web Site (Click to view full-size image)

마스터 페이지 추가Adding a Master Page

그런 다음, 루트 디렉터리의 site. master에 새 마스터 페이지를 추가 합니다.Next, add a new Master Page to the site in the root directory named Site.master. 마스터 페이지 를 사용 하면 페이지 개발자가 ASP.NET 페이지에 적용할 수 있는 사이트 전체 템플릿을 정의할 수 있습니다.Master pages enable a page developer to define a site-wide template that can be applied to ASP.NET pages. 마스터 페이지의 주요 혜택은 사이트의 전반적인 모양을 단일 위치에 정의 하 여 사이트의 레이아웃을 쉽게 업데이트 하거나 수정할 수 있다는 것입니다.The main benefit of master pages is that the site's overall appearance can be defined in a single location, thereby making it easy to update or tweak the site's layout.

Site .master 라는 마스터 페이지를 웹 사이트에 추가 Add a Master Page Named Site.master to the Website

그림 3: Site.master 라는 마스터 페이지를 웹 사이트에 추가 (전체 크기 이미지를 보려면 클릭)Figure 3: Add a Master Page Named Site.master to the Website (Click to view full-size image)

마스터 페이지에서 사이트 전체 페이지 레이아웃을 정의 합니다.Define the site-wide page layout here in the master page. 디자인 뷰를 사용 하 여 필요한 모든 레이아웃 또는 웹 컨트롤을 추가 하거나 소스 뷰에서 직접 태그를 추가할 수 있습니다.You can use the Design view and add whatever Layout or Web controls you need, or you can manually add the markup by hand in the Source view. ASP.NET 2.0 tutorial 시리즈의 데이터로 작업 하는 데 사용 되는 레이아웃이 모방 되도록 마스터 페이지의 레이아웃을 구성 했습니다 (그림 4 참조).I structured my master page's layout to mimic the layout used in my Working with Data in ASP.NET 2.0 tutorial series (see Figure 4). 마스터 페이지는 파일 스타일 (이 자습서의 관련 다운로드에 포함 됨)에 정의 된 css 설정을 사용 하 여 위치를 지정 하 고 스타일을 지정 하기 위해 css 스타일 시트 를 사용 합니다.The master page uses cascading style sheets for positioning and styles with the CSS settings defined in the file Style.css (which is included in this tutorial's associated download). 아래 표시 된 태그를 알 수 없는 경우에도 CSS 규칙은 <div>콘텐츠의 위치가 왼쪽에 표시 되 고 너비가 200 픽셀인 고정 너비를 갖도록 정의 됩니다.While you cannot tell from the markup shown below, the CSS rules are defined such that the navigation <div>'s content is absolutely positioned so that it appears on the left and has a fixed width of 200 pixels.

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" Inherits="Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Forms Authentication, Authorization, and User Accounts</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <div id="wrapper">
        <form id="form1" runat="server">
        
            <div id="header">
                <span class="title">User Account Tutorials</span>
            </div>
        
            <div id="content">
                <asp:contentplaceholder id="MainContent" runat="server">
                  <!-- Page-specific content will go here... -->
                </asp:contentplaceholder>
            </div>
            
            <div id="navigation">
                TODO: Menu will go here...
            </div>
        </form>
    </div>
</body>
</html>

마스터 페이지는 정적 페이지 레이아웃 및 마스터 페이지를 사용 하는 ASP.NET 페이지에서 편집할 수 있는 영역을 모두 정의 합니다.A master page defines both the static page layout and the regions that can be edited by the ASP.NET pages that use the master page. 이러한 콘텐츠 편집 가능한 영역은 ContentPlaceHolder 컨트롤로 표시 됩니다 .이 컨트롤은 콘텐츠 <div>내에서 볼 수 있습니다.These content editable regions are indicated by the ContentPlaceHolder control, which can be seen within the content <div>. 마스터 페이지에는 단일 ContentPlaceHolder (MainContent)가 있지만 마스터 페이지의 ContentPlaceHolders 표시자는 여러 개 있을 수 있습니다.Our master page has a single ContentPlaceHolder (MainContent), but master page's may have multiple ContentPlaceHolders.

위에 입력 된 태그를 사용 하 여 디자인 뷰로 전환 하면 마스터 페이지의 레이아웃이 표시 됩니다.With the markup entered above, switching to the Design view shows the master page's layout. 이 마스터 페이지를 사용 하는 모든 ASP.NET 페이지는 MainContent 영역에 대 한 태그를 지정 하는 기능과 함께이 균일 한 레이아웃을 갖게 됩니다.Any ASP.NET pages that use this master page will have this uniform layout, with the ability to specify the markup for the MainContent region.

디자인 뷰를 통해 볼 때 마스터 페이지 The Master Page, When Viewed Through the Design View

그림 4: 디자인 뷰를 통해 볼 때 마스터 페이지 (전체 크기 이미지를 보려면 클릭)Figure 4: The Master Page, When Viewed Through the Design View (Click to view full-size image)

콘텐츠 페이지 만들기Creating Content Pages

이 시점에서 웹 사이트에 default.aspx 페이지가 있지만 방금 만든 마스터 페이지를 사용 하지 않습니다.At this point we have a Default.aspx page in our website, but it does not use the master page we just created. 웹 페이지의 선언적 태그를 조작 하 여 마스터 페이지를 사용할 수 있지만 페이지에 콘텐츠가 포함 되어 있지 않으면 페이지를 삭제 하 고 프로젝트에 다시 추가 하 여 사용할 마스터 페이지를 지정 하는 것이 더 쉽습니다.While it is possible to manipulate the declarative markup of a web page to use a master page, if the page doesn't contain any content yet it is easier to just delete the page and re-add it to the project, specifying the master page to use. 따라서 프로젝트에서 default.aspx를 삭제 하 여 시작 합니다.Therefore, start by deleting Default.aspx from the project.

그런 다음 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭 하 고 Default.aspx 라는 새 Web Form을 추가 하도록 선택 합니다.Next, right-click on the project name in the Solution Explorer and choose to add a new Web Form named Default.aspx. 이번에는 "마스터 페이지 선택" 확인란을 선택 하 고 목록에서 site.master 마스터 페이지를 선택 합니다.This time, check the "Select master page" checkbox and choose the Site.master master page from the list.

새 default.aspx 페이지를 추가 마스터 페이지를 선택 하도록 선택Add a New Default.aspx Page Choosing to Select a Master Page

그림 5: 마스터 페이지를 선택 하도록 선택 하는 새 Default.aspx 페이지 추가 (전체 크기 이미지를 보려면 클릭)Figure 5: Add a New Default.aspx Page Choosing to Select a Master Page (Click to view full-size image)

사이트 마스터 마스터 페이지 사용

그림 6: Site.master 마스터 페이지 사용Figure 6: Use the Site.master Master Page

Note

웹 응용 프로그램 프로젝트 모델을 사용 하는 경우 새 항목 추가 대화 상자에는 "마스터 페이지 선택" 확인란이 포함 되지 않습니다.If you are using the Web Application Project Model the Add New Item dialog box does not include a "Select master page" checkbox. 대신 "웹 콘텐츠 폼" 형식의 항목을 추가 해야 합니다.Instead, you need to add an item of type "Web Content Form." "웹 콘텐츠 폼" 옵션을 선택 하 고 추가를 클릭 하면 Visual Studio는 그림 6에 표시 된 것과 동일한 마스터 선택 대화 상자를 표시 합니다.After choosing the "Web Content Form" option and clicking Add, Visual Studio will display the same Select a Master dialog box shown in Figure 6.

새 default.aspx 페이지의 선언적 태그에는 마스터 페이지 파일의 경로 및 마스터 페이지의 MainContent ContentPlaceHolder에 대 한 콘텐츠 컨트롤을 지정 하는 @Page 지시문만 포함 되어 있습니다.The new Default.aspx page's declarative markup includes just a @Page directive specifying the path to the master page file and a Content control for the master page's MainContent ContentPlaceHolder.

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>

지금은 default.aspx를 비워 둡니다.For now, leave Default.aspx empty. 이 자습서의 뒷부분에서 콘텐츠를 추가 하는 것으로 돌아갑니다.We will return to it later in this tutorial to add content.

Note

마스터 페이지에는 메뉴 또는 다른 탐색 인터페이스에 대 한 섹션이 포함 되어 있습니다.Our master page includes a section for a menu or some other navigation interface. 이후 자습서에서 이러한 인터페이스를 만들게 됩니다.We will create such an interface in a future tutorial.

2 단계: 폼 인증 사용Step 2: Enabling Forms Authentication

ASP.NET 웹 사이트를 만든 후 다음 작업은 폼 인증을 사용 하도록 설정 하는 것입니다.With the ASP.NET website created, our next task is to enable forms authentication. 응용 프로그램의 인증 구성은 Web.config의 <authentication> 요소 를 통해 지정 됩니다. <authentication> 요소는 응용 프로그램에서 사용 하는 인증 모델을 지정 하는 mode 라는 단일 특성을 포함 합니다.The application's authentication configuration is specified through the <authentication> element in Web.config. The <authentication> element contains a single attribute named mode that specifies the authentication model used by the application. 이 특성에는 다음 네 가지 값 중 하나를 사용할 수 있습니다.This attribute can have one of the following four values:

  • Windows – 이전 자습서에서 설명한 대로 응용 프로그램이 Windows 인증을 사용 하는 경우 방문자를 인증 하는 것은 웹 서버의 책임 이며 일반적으로 기본, 다이제스트 또는 windows 통합 인증을 통해 수행 됩니다.Windows – as discussed in the preceding tutorial, when an application uses Windows authentication it is the web server's responsibility to authenticate the visitor, and this is usually done through Basic, Digest, or Integrated Windows authentication.
  • 양식– 사용자가 웹 페이지의 양식을 통해 인증 됩니다.Forms– users are authenticated via a form on a web page.
  • Passport– 사용자는 Microsoft passport 네트워크를 사용 하 여 인증 됩니다.Passport– users are authenticated using Microsoft's Passport Network.
  • 없음– 인증 모델이 사용 되지 않습니다. 모든 방문자는 익명입니다.None– no authentication model is used; all visitors are anonymous.

기본적으로 ASP.NET 응용 프로그램은 Windows 인증을 사용 합니다.By default, ASP.NET applications use Windows authentication. 인증 유형을 폼 인증으로 변경 하려면 <authentication> 요소의 mode 특성을 Forms로 수정 해야 합니다.To change the authentication type to forms authentication, then, we need to modify the <authentication> element's mode attribute to Forms.

프로젝트에 Web.config 파일이 아직 포함 되어 있지 않은 경우 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭 하 고 새 항목 추가를 선택한 다음 웹 구성 파일을 추가 하 여 지금 프로젝트를 추가 합니다.If your project does not yet contain a Web.config file, add one now by right-clicking on the project name in the Solution Explorer, choosing Add New Item, and then adding a Web Configuration file.

프로젝트에 Web.config가 아직 포함 되지 않은 경우 지금 추가 합니다.If Your Project Does Not Yet Include Web.config, Add It Now

그림 7: 프로젝트에 Web.config가 아직 포함 되지 않은 경우 지금 추가 (전체 크기 이미지를 보려면 클릭)Figure 7: If Your Project Does Not Yet Include Web.config, Add It Now (Click to view full-size image)

그런 다음 <authentication> 요소를 찾아 폼 인증을 사용 하도록 업데이트 합니다.Next, locate the <authentication> element and update it to use forms authentication. 이렇게 변경 하면 Web.config 파일의 태그가 다음과 같이 표시 됩니다.After this change, your Web.config file's markup should look similar to the following:

<configuration>
    <system.web>
        ... Unrelated configuration settings and comments removed for brevity ...
        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Forms" />
    </system.web>
</configuration>

Note

Web.config는 XML 파일 이므로 대/소문자를 구분 하는 것이 중요 합니다.Since Web.config is an XML file, casing is important. Mode 특성을 대문자 "F"를 사용 하 여 양식으로 설정 해야 합니다.Make sure that you set the mode attribute to Forms, with a capital "F". "Forms"와 같은 다른 대/소문자 구분을 사용 하는 경우 브라우저를 통해 사이트를 방문할 때 구성 오류가 표시 됩니다.If you use a different casing, such as "forms", you'll receive a configuration error when visiting the site through a browser.

<authentication> 요소는 폼 인증 관련 설정이 포함 된 <forms> 자식 요소를 선택적으로 포함할 수 있습니다.The <authentication> element may optionally include a <forms> child element that contains forms authentication-specific settings. 지금은 기본 폼 인증 설정만 사용 하겠습니다.For now, let's just use the default forms authentication settings. 다음 자습서에서 <forms> 자식 요소에 대해 좀 더 자세히 살펴보겠습니다.We will explore the <forms> child element in more detail in the next tutorial.

3 단계: 로그인 페이지 빌드Step 3: Building the Login Page

폼 인증을 지원 하기 위해 웹 사이트에 로그인 페이지가 필요 합니다.In order to support forms authentication our website needs a login page. "폼 인증 워크플로 이해" 섹션에서 설명한 대로 FormsAuthenticationModule는 사용자가 볼 수 있는 권한이 없는 페이지에 액세스 하려고 시도 하는 경우 사용자를 로그인 페이지로 자동으로 리디렉션합니다.As discussed in the "Understanding the Forms Authentication Workflow" section, the FormsAuthenticationModule will automatically redirect the user to the login page if they attempt to access a page that they are not authorized to view. 또한 로그인 페이지에 대 한 링크를 익명 사용자에 게 표시 하는 웹 컨트롤 ASP.NET 있습니다.There are also ASP.NET Web controls that will display a link to the login page to anonymous users. 이는 "로그인 페이지의 URL은 무엇 인가요?" 라는 질문을 그렇다면.This begs the question, "What is the URL of the login page?"

기본적으로 폼 인증 시스템은 로그인 페이지의 이름을 login.aspx로 지정 하 고 웹 응용 프로그램의 루트 디렉터리에 배치 합니다.By default, the forms authentication system expects the login page to be named Login.aspx and placed in the root directory of the web application. 다른 로그인 페이지 URL을 사용 하려면 web.config에 해당 URL을 지정 하면 됩니다. 다음 자습서에서이 작업을 수행 하는 방법을 알아봅니다.If you want to use a different login page URL, you can do so by specifying it in Web.config. We will see how to do this in the subsequent tutorial.

로그인 페이지에는 세 가지 책임이 있습니다.The login page has three responsibilities:

  1. 방문자가 자격 증명을 입력할 수 있도록 허용 하는 인터페이스를 제공 합니다.Provide an interface that allows the visitor to enter their credentials.
  2. 제출 된 자격 증명이 유효한 지 확인 합니다.Determine if the submitted credentials are valid.
  3. 폼 인증 티켓을 만들어 사용자를 "로그인" 합니다."Log in" the user by creating the forms authentication ticket.

로그인 페이지의 사용자 인터페이스 만들기Creating the Login Page's User Interface

첫 번째 작업을 시작 해 보겠습니다.Let's get started with the first task. ASP.NET 라는 사이트의 루트 디렉터리에 새 페이지를 추가 하 고이 페이지를 사이트. 마스터 마스터 페이지에 연결 합니다.Add a new ASP.NET page to the site's root directory named Login.aspx and associate it with the Site.master master page.

ASP.NET 라는 새 페이지를 추가 합니다. Add a New ASP.NET Page Named Login.aspx

그림 8: Login.aspx 라는 새 ASP.NET 페이지 추가 (전체 크기 이미지를 보려면 클릭)Figure 8: Add a New ASP.NET Page Named Login.aspx (Click to view full-size image)

일반적인 로그인 페이지 인터페이스는 두 개의 텍스트 상자, 즉 사용자 이름, 암호 및 양식을 전송 하는 단추 등으로 구성 됩니다.The typical login page interface consists of two textboxes – one for the user's name, one for their password – and a button to submit the form. 웹 사이트에는 "me me" 확인란이 포함 되어 있습니다 .이 확인란을 선택 하면 브라우저 다시 시작 전체에서 결과 인증 티켓이 지속 됩니다.Websites oftentimes include a "Remember me" checkbox that, if checked, persists the resulting authentication ticket across browser restarts.

Login.aspx에 두 개의 텍스트 상자를 추가 하 고 해당 ID 속성을 각각 사용자 이름 및 암호로 설정 합니다.Add two TextBoxes to Login.aspx and set their ID properties to UserName and Password, respectively. 또한 암호의 TextMode 속성을 Password로 설정 합니다.Also set Password's TextMode property to Password. 다음으로 CheckBox 컨트롤을 추가 하 고 해당 ID 속성을 RememberMe로 설정 하 고 Text 속성을 "기억을 Me"로 설정 합니다.Next, add a CheckBox control, setting its ID property to RememberMe and its Text property to "Remember Me". 그런 다음 Text 속성이 "로그인"으로 설정 된 LoginButton 이라는 단추를 추가 합니다.Following that, add a Button named LoginButton whose Text property is set to "Login". 마지막으로 Label 웹 컨트롤을 추가 하 고 해당 ID 속성을 InvalidCredentialsMessage로 설정 하 고, 해당 Text 속성을 "사용자 이름 또는 암호가 잘못 되었습니다.And finally, add a Label Web control and set its ID property to InvalidCredentialsMessage, its Text property to "Your username or password is invalid. 다시 시도 하세요. ", ForeColor 속성을 Red로, Visible 속성을 False로 설정 하십시오.Please try again.", its ForeColor property to Red, and its Visible property to False.

이 시점에서 화면은 그림 9의 화면과 유사 하 게 표시 되 고 페이지의 선언적 구문은 다음과 같아야 합니다.At this point your screen should look similar to the screen shot in Figure 9, and your page's declarative syntax should like the following:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
    <h1>
        Login</h1>
    <p>
        Username:
        <asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
    <p>
        Password:
        <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox></p>
    <p>
        <asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me" /> </p>
    <p>
        <asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" /> </p>
    <p>
        <asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again."
            Visible="False"></asp:Label> </p>
</asp:Content>

로그인 페이지에는 두 개의 텍스트 상자, 확인란, 단추 및 레이블이 포함 됩니다 The Login Page Contains Two TextBoxes, a CheckBox, a Button, and a Label

그림 9: 로그인 페이지에는 두 개의 텍스트 상자, 확인란, 단추 및 레이블 (전체 크기 이미지를 보려면 클릭)이 포함 되어 있습니다.Figure 9: The Login Page Contains Two TextBoxes, a CheckBox, a Button, and a Label (Click to view full-size image)

마지막으로 LoginButton의 Click 이벤트에 대 한 이벤트 처리기를 만듭니다.Finally, create an event handler for the LoginButton's Click event. 디자이너에서 단추 컨트롤을 두 번 클릭 하 여이 이벤트 처리기를 만듭니다.From the Designer, simply double-click the Button control to create this event handler.

제공 된 자격 증명이 유효한 지 확인 하는 중Determining If the Supplied Credentials are Valid

이제 단추의 Click 이벤트 처리기에서 작업 2를 구현 해야 합니다. 제공 된 자격 증명이 유효한 지 여부를 확인 합니다.We now need to implement task 2 in the Button's Click event handler – determining whether the supplied credentials are valid. 이를 위해서는 제공 된 자격 증명이 알려진 자격 증명과 일치 하는지 확인할 수 있도록 모든 사용자 자격 증명을 보유 하는 사용자 저장소가 있어야 합니다.In order to do this there needs to be a user store that holds all of the users' credentials so that we can determine if the supplied credentials match up with any known credentials.

ASP.NET 2.0 이전에는 개발자가 자체 사용자 저장소를 구현 하 고 코드를 작성 하 여 저장소에 대해 제공 된 자격 증명의 유효성을 검사 했습니다.Prior to ASP.NET 2.0, developers were responsible for implementing both their own user stores and writing the code to validate the supplied credentials against the store. 대부분의 개발자는 데이터베이스에서 사용자 저장소를 구현 하 여 사용자 이름, 암호, 전자 메일, LastLoginDate 등의 열이 있는 사용자 라는 테이블을 만듭니다.Most developers would implement the user store in a database, creating a table named Users with columns like UserName, Password, Email, LastLoginDate, and so forth. 이 테이블에는 사용자 계정 마다 하나의 레코드가 포함 됩니다.This table, then, would have one record per user account. 사용자가 제공한 자격 증명을 확인 하려면 데이터베이스에 일치 하는 사용자 이름을 쿼리하고 데이터베이스의 암호가 제공 된 암호를 속하는지를 확인 해야 합니다.Verifying a user's supplied credentials would involve querying the database for a matching username and then ensuring that the password in the database corresponded to the supplied password.

ASP.NET 2.0를 사용 하는 개발자는 멤버 자격 공급자 중 하나를 사용 하 여 사용자 저장소를 관리 해야 합니다.With ASP.NET 2.0, developers should use one of the Membership providers to manage the user store. 이 자습서 시리즈에서는 사용자 저장소에 SQL Server 데이터베이스를 사용 하는 SqlMembershipProvider를 사용 합니다.In this tutorial series we will be using the SqlMembershipProvider, which uses a SQL Server database for the user store. SqlMembershipProvider를 사용 하는 경우 공급자가 필요로 하는 테이블, 뷰 및 저장 프로시저를 포함 하는 특정 데이터베이스 스키마를 구현 해야 합니다.When using the SqlMembershipProvider we need to implement a specific database schema that includes the tables, views, and stored procedures expected by the provider. SQL Server의 멤버 자격 스키마 만들기 자습서에서이 스키마를 구현 하는 방법을 살펴보겠습니다.We will examine how to implement this schema in the Creating the Membership Schema in SQL Server tutorial. 멤버 자격 공급자를 사용 하는 경우 사용자 자격 증명의 유효성을 검사 하는 것은 사용자 이름암호 조합의 유효성을 나타내는 부울 값을 반환 하는 멤버 자격 클래스validateuser (username, password) 메서드를 호출 하는 것 만큼 간단 합니다.With the Membership provider in place, validating the user's credentials is as simple as calling the Membership class's ValidateUser(username, password) method, which returns a Boolean value indicating whether the validity of the username and password combination. SqlMembershipProvider의 사용자 저장소를 아직 구현 하지 않았으므로 지금은 멤버 자격 클래스의 ValidateUser 메서드를 사용할 수 없습니다.Seeing as we have not yet implemented the SqlMembershipProvider's user store, we cannot use the Membership class's ValidateUser method at this time.

사용자 지정 사용자 데이터베이스 테이블 (SqlMembershipProvider를 구현한 후에는 사용 되지 않음)을 빌드하는 대신 로그인 페이지 내에서 유효한 자격 증명을 하드 코딩 하겠습니다.Rather than take the time to build our own custom Users database table (which would be obsolete once we implemented the SqlMembershipProvider), let's instead hard-code the valid credentials within the login page itself. LoginButton의 Click 이벤트 처리기에서 다음 코드를 추가 합니다.In the LoginButton's Click event handler, add the following code:

protected void LoginButton_Click(object sender, EventArgs e)
{
    // Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
    string[] users = { "Scott", "Jisun", "Sam" };
    string[] passwords = { "password", "password", "password" };
    for (int i = 0; i < users.Length; i++)
    {
        bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
        bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
        if (validUsername && validPassword)
        {
            // TODO: Log in the user...
            // TODO: Redirect them to the appropriate page
        }
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

여기에서 볼 수 있듯이 세 개의 유효한 사용자 계정 (Scott, Jisun 및 Sam)과 세 가지 모두 동일한 암호 ("암호")가 있습니다.As you can see, there are three valid user accounts – Scott, Jisun, and Sam – and all three have the same password ("password"). 이 코드는 사용자 및 암호 배열을 반복 하 여 유효한 사용자 이름과 암호를 찾습니다.The code loops through the users and passwords arrays looking for a valid username and password match. 사용자 이름과 암호가 모두 유효한 경우 사용자에 게 로그인 한 후 해당 페이지로 리디렉션해야 합니다.If both the username and password are valid, we need to login the user and then redirect them to the appropriate page. 자격 증명이 유효 하지 않은 경우 InvalidCredentialsMessage 레이블을 표시 합니다.If the credentials are invalid, then we display the InvalidCredentialsMessage Label.

사용자가 유효한 자격 증명을 입력 하면 "적절 한 페이지"로 리디렉션됩니다.When a user enters valid credentials, I mentioned that they are then redirected to the "appropriate page." 하지만 적절 한 페이지는 무엇 인가요?What is the appropriate page, though? 사용자가 볼 수 있는 권한이 없는 페이지를 방문 하면 FormsAuthenticationModule가 자동으로 로그인 페이지로 리디렉션됩니다.Recall that when a user visits a page they are not authorized to view, the FormsAuthenticationModule automatically redirects them to the login page. 이렇게 하면 ReturnUrl 매개 변수를 통해 querystring에 요청 된 URL이 포함 됩니다.In doing so, it includes the requested URL in the querystring via the ReturnUrl parameter. 즉, 사용자가 ProtectedPage를 방문 하려고 했 고이 작업을 수행할 수 있는 권한이 없는 경우 FormsAuthenticationModule는 다음으로 리디렉션됩니다.That is, if a user attempted to visit ProtectedPage.aspx, and they were not authorized to do so, the FormsAuthenticationModule would redirect them to:

Login.aspx?ReturnUrl=ProtectedPage.aspxLogin.aspx?ReturnUrl=ProtectedPage.aspx

성공적으로 로그인 되 면 사용자는 ProtectedPage로 다시 리디렉션됩니다.Upon successfully logging in, the user should be redirected back to ProtectedPage.aspx. 또는 사용자가 자신의 volition의 로그인 페이지를 방문할 수도 있습니다.Alternatively, users may visit the login page on their own volition. 이 경우 사용자를 로그인 한 후 루트 폴더의 Default.aspx 페이지로 보내야 합니다.In that case, after logging in the user they should be sent to the root folder's Default.aspx page.

사용자 로그인Logging In the User

제공 된 자격 증명이 유효 하다 고 가정 하면 폼 인증 티켓을 만들어 사용자에 게 사이트에 로그인 해야 합니다.Assuming that the supplied credentials are valid, we need to create a forms authentication ticket, thereby logging in the user to the site. FormsAuthentication 네임 스페이스클래스 는 폼 인증 시스템을 통해 사용자를 로그인 및 로그 아웃 하는 다양 한 메서드를 제공 합니다.The FormsAuthentication class in the System.Web.Security namespace provides assorted methods for logging in and logging out users via the forms authentication system. FormsAuthentication 클래스에는 몇 가지 메서드가 있지만이 분기 시점에 관심이 있는 세 가지는 다음과 같습니다.While there are several methods in the FormsAuthentication class, the three we are interested in at this juncture are:

  • GetAuthCookie (username, persistcookie) – 제공 된 이름 사용자 이름에 대 한 폼 인증 티켓을 만듭니다.GetAuthCookie(username, persistCookie) – creates a forms authentication ticket for the supplied name username. 그런 다음,이 메서드는 인증 티켓의 콘텐츠를 포함 하는 되어 개체를 만들고 반환 합니다.Next, this method creates and returns an HttpCookie object that holds the contents of the authentication ticket. Persistcookie 가 true 이면 영구 쿠키가 생성 됩니다.If persistCookie is true, a persistent cookie is created.
  • SetAuthCookie (username, persistcookie) – getauthcookie (username, persistcookie) 메서드를 호출 하 여 폼 인증 쿠키를 생성 합니다.SetAuthCookie(username, persistCookie) – calls the GetAuthCookie(username, persistCookie) method to generate the forms authentication cookie. 그런 다음이 메서드는 GetAuthCookie에서 반환 된 쿠키를 쿠키 컬렉션에 추가 합니다 (쿠키 기반 폼 인증이 사용 되는 경우). 그렇지 않으면이 메서드는 쿠키 없는 티켓 논리를 처리 하는 내부 클래스를 호출 합니다.This method then adds the cookie returned by GetAuthCookie to the Cookies collection (assuming cookies-based forms authentication is being used; otherwise, this method calls an internal class that handles the cookieless ticket logic).
  • RedirectFromLoginPage (username, persistcookie) –이 메서드는 setauthcookie (username, persistcookie)를 호출한 다음 해당 페이지로 사용자를 리디렉션합니다.RedirectFromLoginPage(username, persistCookie) – this method calls SetAuthCookie(username, persistCookie), and then redirects the user to the appropriate page.

GetAuthCookie는 쿠키 컬렉션에 쿠키를 쓰기 전에 인증 티켓을 수정 해야 하는 경우에 유용 합니다.GetAuthCookie is handy when you need to modify the authentication ticket before writing the cookie out to the Cookies collection. SetAuthCookie는 폼 인증 티켓을 만들고 쿠키 컬렉션에 추가 하지만 사용자를 적절 한 페이지로 리디렉션하지 않으려는 경우에 유용 합니다.SetAuthCookie is useful if you want to create the forms authentication ticket and add it to the Cookies collection, but do not want to redirect the user to the appropriate page. 로그인 페이지에 보관 하거나 일부 대체 페이지로 보낼 수 있습니다.Perhaps you want to keep them on the login page or send them to some alternate page.

사용자를 로그인 하 여 적절 한 페이지로 리디렉션하도록 했으므로 RedirectFromLoginPage을 사용 하겠습니다.Since we want to log in the user and redirect them to the appropriate page, let's use RedirectFromLoginPage. LoginButton의 Click 이벤트 처리기를 업데이트 하 여 주석 처리 된 두 개의 TODO 줄을 다음 코드 줄로 바꿉니다.Update the LoginButton's Click event handler, replacing the two commented TODO lines with the following line of code:

FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);

폼 인증 티켓을 만들 때 폼 인증 티켓 사용자 이름 매개 변수에 대 한 사용자 이름 텍스트 상자 텍스트 속성과 persistcookie 매개 변수에 대 한 rememberme 확인란의 선택 됨 상태를 사용 합니다.When creating the forms authentication ticket we use the UserName TextBox's Text property for the forms authentication ticket username parameter, and the checked state of the RememberMe CheckBox for the persistCookie parameter.

로그인 페이지를 테스트 하려면 브라우저에서 방문해 보세요.To test the login page, visit it in a browser. "맞습니다"의 사용자 이름 및 "잘못 된" 암호와 같은 잘못 된 자격 증명을 입력 하 여 시작 합니다.Start by entering invalid credentials, such as a username of "Nope" and a password of "wrong". 로그인 단추를 클릭 하면 다시 게시가 발생 하 고 InvalidCredentialsMessage 레이블이 표시 됩니다.Upon clicking the Login button a postback will occur and the InvalidCredentialsMessage Label will be displayed.

잘못 된 자격 증명을 입력할 때 InvalidCredentialsMessage 레이블이 표시 The InvalidCredentialsMessage Label is Displayed When Entering Invalid Credentials

그림 10: 잘못 된 자격 증명을 입력할 때 InvalidCredentialsMessage 레이블 표시 (전체 크기 이미지를 보려면 클릭)Figure 10: The InvalidCredentialsMessage Label is Displayed When Entering Invalid Credentials (Click to view full-size image)

그런 다음 유효한 자격 증명을 입력 하 고 로그인 단추를 클릭 합니다.Next, enter valid credentials and click the Login button. 이번에는 포스트백이 발생할 때 폼 인증 티켓이 만들어지고 Default.aspx로 다시 자동으로 리디렉션됩니다.This time when the postback occurs a forms authentication ticket is created and you are automatically redirected back to Default.aspx. 현재 로그인 되어 있음을 나타낼 수 있는 시각적 단서가 없지만이 시점에서 웹 사이트에 로그인 했습니다.At this point you have logged in to the website, although there are no visual cues to indicate that you are currently logged in. 4 단계에서는 사용자가 로그인 했는지 여부를 프로그래밍 방식으로 확인 하는 방법 및 페이지를 방문 하는 사용자를 식별 하는 방법을 알아봅니다.In Step 4 we will see how to programmatically determine whether a user is logged in or not as well as how to identify the user visiting the page.

5 단계에서는 사용자를 웹 사이트에서 로그 아웃 하는 기술을 살펴봅니다.Step 5 examines techniques for logging a user out of the website.

로그인 페이지 보안Securing the Login Page

사용자가 자격 증명을 입력 하 고 로그인 페이지 양식을 전송 하면 암호를 포함 한 자격 증명은 인터넷을 통해 웹 서버에 일반 텍스트로전송 됩니다.When the user enters her credentials and submits the login page form, the credentials – including her password – are transmitted over the Internet to the web server in plain text. 즉, 네트워크 트래픽이 사용자 이름 및 암호를 볼 수 있음을 의미 합니다.That means any hacker sniffing the network traffic can see the username and password. 이를 방지 하기 위해서는 SSL (Secure Socket 레이어)을 사용 하 여 네트워크 트래픽을 암호화 해야 합니다.To prevent this, it is essential to encrypt the network traffic by using Secure Socket Layers (SSL). 이렇게 하면 웹 서버에서 받을 때까지 브라우저를 떠날 때 자격 증명 (전체 페이지의 HTML 태그)이 암호화 됩니다.This will ensure that the credentials (as well as the entire page's HTML markup) are encrypted from the moment they leave the browser until they are received by the web server.

웹 사이트에 중요 한 정보가 포함 되어 있지 않으면 로그인 페이지 및 사용자 암호를 일반 텍스트로 전송 하 여 전송 하는 다른 페이지에서 SSL을 사용 해야 합니다.Unless your website contains sensitive information, you will only need to use SSL on the login page and on other pages where the user's password would otherwise be sent over the wire in plain text. 기본적으로 암호화 되 고 디지털 서명 되어 변조를 방지 하기 때문에 폼 인증 티켓의 보안을 걱정할 필요가 없습니다.You do not need to worry about securing the forms authentication ticket since, by default, it is both encrypted and digitally signed (to prevent tampering). 폼 인증 티켓 보안에 대 한 자세한 설명은 다음 자습서에서 제공 됩니다.A more thorough discussion on forms authentication ticket security is presented in the following tutorial.

Note

많은 금융 및 의료 websites는 인증 된 사용자가 액세스할 수 있는 모든 페이지에서 SSL을 사용 하도록 구성 됩니다.Many financial and medical websites are configured to use SSL on all pages accessible to authenticated users. 이러한 웹 사이트를 빌드하는 경우 폼 인증 티켓이 보안 연결을 통해서만 전송 되도록 폼 인증 시스템을 구성할 수 있습니다.If you are building such a website you can configure the forms authentication system so that the forms authentication ticket is only transmitted over a secure connection. 다음 자습서, 폼 인증 구성 및 고급 항목 에서 다양 한 폼 인증 구성 옵션을 살펴보겠습니다.We will look at the various forms authentication configuration options in the next tutorial, Forms Authentication Configuration and Advanced Topics.

4 단계: 인증 된 방문자 검색 및 Id 확인Step 4: Detecting Authenticated Visitors and Determining Their Identity

이 시점에서 폼 인증을 사용 하도록 설정 하 고 기초적인 로그인 페이지를 만들었지만 사용자의 인증 여부를 확인 하는 방법을 아직 확인 하지 않았습니다.At this point we have enabled forms authentication and created a rudimentary login page, but we have yet to examine how we can determine whether a user is authenticated or anonymous. 특정 시나리오에서는 인증 된 사용자 또는 익명 사용자가 페이지를 방문 하 고 있는지 여부에 따라 다른 데이터 또는 정보를 표시 하려고 할 수 있습니다.In certain scenarios we may wish to display different data or information depending on whether an authenticated or anonymous user is visiting the page. 또한 인증 된 사용자의 id를 알고 있어야 합니다.Moreover, we oftentimes need to know the identity of the authenticated user.

기존 default.aspx 페이지를 확대 하 여 이러한 기술을 설명 해 보겠습니다.Let's augment the existing Default.aspx page to illustrate these techniques. Default.aspx에서 이름이 AuthenticatedMessagePanel이 고 이름이 AnonymousMessagePanel 인 두 개의 패널 컨트롤을 추가 합니다.In Default.aspx add two Panel controls, one named AuthenticatedMessagePanel and another named AnonymousMessagePanel. 첫 번째 패널에 WelcomeBackMessage 라는 레이블 컨트롤을 추가 합니다.Add a Label control named WelcomeBackMessage in the first Panel. 두 번째 패널에서 HyperLink 컨트롤을 추가 하 고 Text 속성을 "로그인"으로 설정 하 고 해당 NavigateUrl 속성을 "~/Login.aspx"로 설정 합니다.In the second Panel add a HyperLink control, set its Text property to "Log In" and its NavigateUrl property to "~/Login.aspx". 이 시점에서 default.aspx의 선언 태그는 다음과 같이 표시 됩니다.At this point the declarative markup for Default.aspx should look similar to the following:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
    <asp:Panel runat="server" ID="AuthenticatedMessagePanel">
        <asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
    </asp:Panel>
    
    <asp:Panel runat="Server" ID="AnonymousMessagePanel">
        <asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
    </asp:Panel>
</asp:Content>

지금까지 짐작할 수 있듯이, 여기서의 아이디어는 인증 된 방문자에 게 AuthenticatedMessagePanel을 표시 하 고 익명 방문자에 게 AnonymousMessagePanel만 표시 하는 것입니다.As you have probably guessed by now, the idea here is to display just the AuthenticatedMessagePanel to authenticated visitors and just the AnonymousMessagePanel to anonymous visitors. 이를 수행 하려면 사용자의 로그인 여부에 따라 이러한 패널의 표시 속성을 설정 해야 합니다.To accomplish this we need to set these Panels' Visible properties depending on whether the user is logged in or not.

요청. IsAuthenticated 속성 은 요청이 인증 되었는지 여부를 나타내는 부울 값을 반환 합니다.The Request.IsAuthenticated property returns a Boolean value indicating whether the request has been authenticated. _Load 이벤트 처리기 코드 페이지에 다음 코드를 입력 합니다.Enter the following code into the Page_Load event handler code:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.IsAuthenticated)
    {
        WelcomeBackMessage.Text = "Welcome back!";
    
        AuthenticatedMessagePanel.Visible = true;
        AnonymousMessagePanel.Visible = false;
    }
    else
    {
        AuthenticatedMessagePanel.Visible = false;
        AnonymousMessagePanel.Visible = true;
    }
}

이 코드가 준비 되 면 브라우저를 통해 default.aspx를 방문 합니다.With this code in place, visit Default.aspx through a browser. 아직 로그인 하지 않은 경우 로그인 페이지에 대 한 링크가 표시 됩니다 (그림 11 참조).Assuming that you have yet to log in, you will see a link to the login page (see Figure 11). 이 링크를 클릭 하 고 사이트에 로그인 합니다.Click this link and log in to the site. 3 단계에서 확인 한 것 처럼 자격 증명을 입력 한 후에는 default.aspx로 돌아갑니다. 하지만 이번에는 페이지에 "환영 합니다."가 표시 됩니다.As we saw in Step 3, after entering your credentials you will be returned to Default.aspx, but this time the page shows the "Welcome back!" 메시지 (그림 12 참조).message (see Figure 12).

익명으로 방문할 때 로그인 링크가 표시 됩니다.

그림 11: 익명으로 방문할 때 로그인 링크가 표시 됩니다.Figure 11: When Visiting Anonymously, a Log In Link is Displayed

인증 된 사용자에 게 표시 됩니다.

그림 12: 인증 된 사용자에 게는 "환영 합니다."가 표시 됩니다.Figure 12: Authenticated Users are Shown the "Welcome back!" 메시지Message

현재 로그온 한 사용자의 id를 HttpContext 개체user 속성을 통해 확인할 수 있습니다.We can determine the currently logged on user's identity via the HttpContext object's User property. HttpContext 개체는 현재 요청에 대 한 정보를 나타내며, 응답, 요청 및 세션과 같은 일반적인 ASP.NET 개체의 홈입니다.The HttpContext object represents information about the current request, and is the home for such common ASP.NET objects as Response, Request, and Session, among others. User 속성은 현재 HTTP 요청의 보안 컨텍스트를 나타내며 IPrincipal 인터페이스를 구현 합니다.The User property represents the security context of the current HTTP request and implements the IPrincipal interface.

사용자 속성은 FormsAuthenticationModule에 의해 설정 됩니다.The User property is set by the FormsAuthenticationModule. 특히 FormsAuthenticationModule가 들어오는 요청에서 폼 인증 티켓을 찾으면 새 GenericPrincipal 개체를 만들어 사용자 속성에 할당 합니다.Specifically, when the FormsAuthenticationModule finds a forms authentication ticket in the incoming request, it creates a new GenericPrincipal object and assigns it to the User property.

보안 주체 개체 (예: GenericPrincipal)는 사용자의 id와 해당 id가 속한 역할에 대 한 정보를 제공 합니다.Principal objects (like GenericPrincipal) provide information on the user's identity and the roles to which they belong. IPrincipal 인터페이스는 두 개의 구성원을 정의 합니다.The IPrincipal interface defines two members:

다음 코드를 사용 하 여 현재 방문자의 이름을 확인할 수 있습니다.We can determine the name of the current visitor using the following code:

string currentUsersName = User.Identity.Name;string currentUsersName = User.Identity.Name;

폼 인증을 사용 하는 경우 GenericPrincipal의 Identity 속성에 대해 FormsIdentity 개체가 생성 됩니다.When using forms authentication, a FormsIdentity object is created for the GenericPrincipal's Identity property. FormsIdentity 클래스는 항상 AuthenticationType 속성에 대해 "Forms" 문자열을 반환 하 고 IsAuthenticated 속성에 대해 true를 반환 합니다.The FormsIdentity class always returns the string "Forms" for its AuthenticationType property and true for its IsAuthenticated property. Name 속성은 폼 인증 티켓을 만들 때 지정 된 사용자 이름을 반환 합니다.The Name property returns the username specified when creating the forms authentication ticket. FormsIdentity는 이러한 세 가지 속성 외에도 티켓 속성을 통해 기본 인증 티켓에 대 한 액세스를 포함 합니다.In addition to these three properties, FormsIdentity includes access to the underlying authentication ticket via its Ticket property. 티켓 속성은 양식 Authenticationticket형식의 개체를 반환 합니다. 여기에는 만료, Ispersistent, IssueDate, Name 등의 속성이 있습니다.The Ticket property returns an object of type FormsAuthenticationTicket, which has properties like Expiration, IsPersistent, IssueDate, Name, and so on.

여기에서 중요 한 점은 FormsAuthentication (username, Persistcookie), FormsAuthentication. setauthcookie (username, persistcookie) 및 FormsAuthentication (username, persistcookie) 메서드에 지정 된 username 매개 변수가 User.Identity.Name에서 반환 하는 값과 동일 하다는 것입니다.The important point to take away here is that the username parameter specified in the FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie), and FormsAuthentication.RedirectFromLoginPage(username, persistCookie) methods is the same value returned by User.Identity.Name. 또한 이러한 메서드에서 만든 인증 티켓은 FormsIdentity 개체로 캐스팅 한 후 티켓 속성에 액세스 하 여 사용할 수 있습니다.Moreover, the authentication ticket created by these methods is available by casting User.Identity to a FormsIdentity object and then accessing the Ticket property:

FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;

Default.aspx에서 더 많은 개인 설정 된 메시지를 제공 하겠습니다.Let's provide a more personalized message in Default.aspx. WelcomeBackMessage 레이블의 Text 속성에 "환영 뒤로, username!" 문자열이 할당 되도록 페이지_Load 이벤트 처리기를 업데이트 합니다.Update the Page_Load event handler so that the WelcomeBackMessage Label's Text property is assigned the string "Welcome back, username!"

WelcomeBackMessage.Text = "Welcome back, " + User.Identity.Name + "!";WelcomeBackMessage.Text = "Welcome back, " + User.Identity.Name + "!";

그림 13에서는 사용자의 Scott로 로그인 할 때 이러한 수정의 영향을 보여 줍니다.Figure 13 shows the effect of this modification (when logging in as user Scott).

환영 메시지에는 현재 로그인 한 사용자의 이름이 포함 됩니다.

그림 13: 환영 메시지에는 현재 로그인 한 사용자의 이름이 포함 됩니다.Figure 13: The Welcome Message Includes the Currently Logged In User's Name

LoginView 및 LoginName 컨트롤 사용Using the LoginView and LoginName Controls

서로 다른 콘텐츠를 인증 된 사용자로 표시 하는 것이 일반적인 요구 사항입니다. 현재 로그온 한 사용자의 이름을 표시 합니다.Displaying different content to authenticated and anonymous users is a common requirement; so is displaying the name of the currently logged on user. 이러한 이유로 ASP.NET에는 그림 13에 표시 된 것과 동일한 기능을 제공 하지만 한 줄의 코드를 작성할 필요 없이 두 개의 웹 컨트롤이 포함 되어 있습니다.For that reason, ASP.NET includes two Web controls that provide the same functionality shown in Figure 13, but without the need to write a single line of code.

LoginView 컨트롤 은 인증 된 사용자와 익명 사용자에 게 서로 다른 데이터를 쉽게 표시할 수 있게 해 주는 템플릿 기반 웹 컨트롤입니다.The LoginView control is a template-based Web control that makes it easy to display different data to authenticated and anonymous users. LoginView에는 미리 정의 된 두 개의 템플릿이 포함 되어 있습니다.The LoginView includes two predefined templates:

  • AnonymousTemplate –이 템플릿에 추가 된 태그는 익명 방문자 에게만 표시 됩니다.AnonymousTemplate – any markup added to this template is only displayed to anonymous visitors.
  • LoggedInTemplate –이 템플릿의 태그는 인증 된 사용자 에게만 표시 됩니다.LoggedInTemplate – this template's markup is shown only to authenticated users.

사이트의 마스터 페이지인 site.master에 LoginView 컨트롤을 추가 해 보겠습니다.Let's add the LoginView control to our site's master page, Site.master. 그러나 LoginView 컨트롤을 추가 하는 대신 새 ContentPlaceHolder 컨트롤을 추가 하 고이 새 ContentPlaceHolder에 LoginView 컨트롤을 추가 해 보겠습니다.Rather than adding just the LoginView control, though, let's add both a new ContentPlaceHolder control and then put the LoginView control within that new ContentPlaceHolder. 이 결정에 대 한 근거는 곧 파악 될 것입니다.The rationale for this decision will become apparent shortly.

Note

AnonymousTemplate 및 LoggedInTemplate 외에도 LoginView 컨트롤에는 역할별 템플릿이 포함 될 수 있습니다.In addition to the AnonymousTemplate and LoggedInTemplate, the LoginView control can include role-specific templates. 역할 관련 템플릿은 지정 된 역할에 속하는 사용자 에게만 태그를 표시 합니다.Role-specific templates show markup only to those users that belong to a specified role. 이후 자습서에서 LoginView 컨트롤의 역할 기반 기능을 살펴보겠습니다.We will examine the role-based features of the LoginView control in a future tutorial.

LoginContent 라는 ContentPlaceHolder를 탐색 <div> 요소 내의 마스터 페이지에 추가 하 여 시작 합니다.Start by adding a ContentPlaceHolder named LoginContent into the master page within the navigation <div> element. 단순히 도구 상자에서 소스 뷰로 ContentPlaceHolder 컨트롤을 끌어와 "TODO: Menu to here ..." 바로 위에 결과 태그를 배치할 수 있습니다. 본문.You can simply drag a ContentPlaceHolder control from the Toolbox onto the Source view, placing the resulting markup right above the "TODO: Menu will go here…" text.

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

다음으로, LoginContent ContentPlaceHolder 내에 LoginView 컨트롤을 추가 합니다.Next, add a LoginView control within the LoginContent ContentPlaceHolder. 마스터 페이지의 ContentPlaceHolder 컨트롤에 배치 된 콘텐츠는 ContentPlaceHolder에 대 한 기본 콘텐츠로 간주 됩니다.Content placed into the master page's ContentPlaceHolder controls are considered default content for the ContentPlaceHolder. 즉,이 마스터 페이지를 사용 하는 ASP.NET 페이지는 각 ContentPlaceHolder에 대 한 고유한 콘텐츠를 지정 하거나 마스터 페이지의 기본 콘텐츠를 사용할 수 있습니다.That is, ASP.NET pages that use this master page can specify their own content for each ContentPlaceHolder or use the master page's default content.

LoginView 및 기타 로그인 관련 컨트롤은 도구 상자의 로그인 탭에 있습니다.The LoginView and other login-related controls are located in the Toolbox's Login tab.

도구 상자의 LoginView 컨트롤

그림 14: 도구 상자의 LoginView 컨트롤Figure 14: The LoginView Control in the Toolbox

다음으로 LoginView 컨트롤 바로 뒤에 두 개의 <br/> 요소를 추가 하지만 여전히 ContentPlaceHolder 내에 있습니다.Next, add two <br /> elements immediately after the LoginView control, but still within the ContentPlaceHolder. 이 시점에서 탐색 <div> 요소의 태그는 다음과 같습니다.At this point, the navigation <div> element's markup should look like the following:

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
        </asp:LoginView>
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

LoginView의 템플릿은 디자이너 또는 선언적 태그에서 정의할 수 있습니다.The LoginView's templates can be defined from the Designer or the declarative markup. Visual Studio의 디자이너에서 LoginView의 스마트 태그를 확장 합니다 .이 태그는 드롭다운 목록에서 구성 된 템플릿을 나열 합니다.From Visual Studio's Designer, expand the LoginView's smart tag, which lists the configured templates in a drop-down list. AnonymousTemplate에 "Hello, 낯선" 텍스트를 입력 합니다. 그런 다음 하이퍼링크 컨트롤을 추가 하 고 Text 및 NavigateUrl 속성을 각각 "로그인" 및 "~/Login.aspx"로 설정 합니다.Type in the text "Hello, stranger" into the AnonymousTemplate; next, add a HyperLink control and set its Text and NavigateUrl properties to "Log In" and "~/Login.aspx", respectively.

AnonymousTemplate을 구성한 후 LoggedInTemplate로 전환 하 고 "환영 back" 텍스트를 입력 합니다.After configuring the AnonymousTemplate, switch to the LoggedInTemplate and enter the text, "Welcome back, ". 그런 다음 도구 상자의 LoginName 컨트롤을 LoggedInTemplate로 끌어 "환영 뒤로" 텍스트 바로 뒤에 배치 합니다.Then drag a LoginName control from the Toolbox into the LoggedInTemplate, placing it immediately after the "Welcome back, " text. 이름을 암시 하는 LoginName 컨트롤은 현재 로그인 한 사용자의 이름을 표시 합니다.The LoginName control, as its name implies, displays the name of the currently logged in user. 내부적으로 LoginName 컨트롤은 단순히 User.Identity.Name 속성을 출력 합니다.Internally, the LoginName control simply outputs the User.Identity.Name property

LoginView의 템플릿 추가 후 태그는 다음과 유사 하 게 표시 됩니다.After making these additions to the LoginView's templates, the markup should look similar to the following:

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
            <LoggedInTemplate>
                Welcome back,
                <asp:LoginName ID="LoginName1" runat="server" />.
            </LoggedInTemplate>
            <AnonymousTemplate>
                Hello, stranger.
                <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
            </AnonymousTemplate>
        </asp:LoginView>
        
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

사이트. 마스터 마스터 페이지를 추가 하면 사용자가 인증 되었는지 여부에 따라 웹 사이트의 각 페이지에 다른 메시지가 표시 됩니다.With this addition to the Site.master master page, each page in our website will display a different message depending on whether the user is authenticated. 그림 15에서는 사용자 Jisun을 통해 브라우저를 통해 방문할 때 default.aspx 페이지를 보여 줍니다.Figure 15 shows the Default.aspx page when visited through a browser by user Jisun. "환영, Jisun" 메시지는 왼쪽에 있는 마스터 페이지의 탐색 섹션 (방금 추가한 LoginView 컨트롤을 통해) 및 Default.aspx의 콘텐츠 영역 (Panel 컨트롤 및 프로그래밍 논리를 통해)에서 한 번 반복 됩니다.The "Welcome back, Jisun" message is repeated twice: once in the master page's navigation section on the left (via the LoginView control we just added) and once in the Default.aspx's content area (via Panel controls and programmatic logic).

LoginView 컨트롤 표시

그림 15: LoginView 컨트롤은 "환영 뒤로, Jisun"를 표시 합니다.Figure 15: The LoginView Control Displays "Welcome back, Jisun."

마스터 페이지에 LoginView를 추가 했으므로 사이트의 모든 페이지에 표시 될 수 있습니다.Because we added the LoginView to the master page, it can appear in every page on our site. 그러나이 메시지를 표시 하지 않으려는 웹 페이지가 있을 수 있습니다.However, there may be web pages where we don't want to show this message. 로그인 페이지에 대 한 링크가 없는 것 처럼 보일 수 있으므로 이러한 페이지 중 하나는 로그인 페이지입니다.One such page is the login page, since a link to the login page seems out of place there. LoginView 컨트롤을 마스터 페이지의 ContentPlaceHolder에 배치 했으므로 콘텐츠 페이지에서이 기본 태그를 재정의할 수 있습니다.Since we placed the LoginView control in a ContentPlaceHolder in the master page, we can override this default markup in our content page. Login.aspx를 열고 디자이너로 이동 합니다.Open Login.aspx and go to the Designer. 마스터 페이지에서 LoginContent ContentPlaceHolder에 대 한 Login .aspx의 콘텐츠 컨트롤을 명시적으로 정의 하지 않았으므로 로그인 페이지에이 ContentPlaceHolder에 대 한 마스터 페이지의 기본 태그가 표시 됩니다.Since we have not explicitly defined a Content control in Login.aspx for the LoginContent ContentPlaceHolder in the master page, the login page will show the master page's default markup for this ContentPlaceHolder. 디자이너를 통해이를 확인할 수 있습니다. LoginContent ContentPlaceHolder는 기본 태그 (LoginView 컨트롤)를 표시 합니다.You can see this through the Designer – the LoginContent ContentPlaceHolder shows the default markup (the LoginView control).

로그인 페이지 마스터 페이지의 LoginContent ContentPlaceHolder에 대 한 기본 콘텐츠를 표시 합니다.The Login Page Shows the Default Content for the Master Page's LoginContent ContentPlaceHolder

그림 16: 로그인 페이지에 마스터 페이지의 LoginContent ContentPlaceHolder에 대 한 기본 내용이 표시 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 16: The Login Page Shows the Default Content for the Master Page's LoginContent ContentPlaceHolder (Click to view full-size image)

LoginContent ContentPlaceHolder에 대 한 기본 태그를 재정의 하려면 디자이너에서 해당 영역을 마우스 오른쪽 단추로 클릭 하 고 상황에 맞는 메뉴에서 사용자 지정 콘텐츠 만들기 옵션을 선택 하면 됩니다.To override the default markup for the LoginContent ContentPlaceHolder, simply right-click on the region in the Designer and choose the Create Custom Content option from the context menu. Visual Studio 2008을 사용 하는 경우 ContentPlaceHolder에는 스마트 태그가 포함 되어 있으며이 태그가 선택 되 면 동일한 옵션을 제공 합니다. 그러면 페이지의 태그에 새 콘텐츠 컨트롤이 추가 되므로이 페이지에 대 한 사용자 지정 콘텐츠를 정의할 수 있습니다.(When using Visual Studio 2008 the ContentPlaceHolder includes a smart tag that, when selected, offers the same option.) This adds a new Content control to the page's markup and thereby allows us to define custom content for this page. 여기에서 사용자 지정 메시지를 추가할 수 있습니다 (예: "로그인 ..."). 단,이 메시지는 비워 둡니다.You could add a custom message here, such as "Please log in…", but let's just leave this blank.

Note

Visual Studio 2005에서 사용자 지정 콘텐츠를 만들면 ASP.NET 페이지에 빈 콘텐츠 컨트롤이 생성 됩니다.In Visual Studio 2005, creating custom content creates an empty Content control in the ASP.NET page. 그러나 Visual Studio 2008에서 사용자 지정 콘텐츠를 만들면 마스터 페이지의 기본 콘텐츠가 새로 생성 된 콘텐츠 컨트롤에 복사 됩니다.In Visual Studio 2008, however, creating custom content copies the master page's default content into the newly created Content control. Visual Studio 2008을 사용 하는 경우 새 콘텐츠 컨트롤을 만든 후 마스터 페이지에서 복사 된 콘텐츠를 지워야 합니다.If you are using Visual Studio 2008, then, after creating the new Content control make sure to clear out the content copied over from the master page.

그림 17은 이러한 변경을 수행한 후 브라우저에서 방문할 때의 login.aspx 페이지를 보여 줍니다.Figure 17 shows the Login.aspx page when visited from a browser after making this change. Default.aspx를 방문할 때 처럼 왼쪽 탐색 <div>에는 "Hello, 낯선" 또는 "환영 뒤로, 사용자 이름" 메시지가 없습니다.Note that there is no "Hello, stranger" or "Welcome back, username" message in the left navigation <div> as there is when visiting Default.aspx.

로그인 페이지 기본 LoginContent ContentPlaceHolder의 태그를 숨깁니다.The Login Page Hides the Default LoginContent ContentPlaceHolder's Markup

그림 17: 로그인 페이지에서 기본 LoginContent ContentPlaceHolder의 태그를 숨깁니다 (전체 크기 이미지를 보려면 클릭).Figure 17: The Login Page Hides the Default LoginContent ContentPlaceHolder's Markup (Click to view full-size image)

5 단계: 로그 아웃Step 5: Logging Out

3 단계에서는 사용자를 사이트에 로그인 하기 위한 로그인 페이지를 작성 하는 방법을 알아보았습니다. 하지만 사용자를 로그 아웃 하는 방법을 아직 확인 하지 않았습니다. 사용자를 로그인 하는 데 사용 되는 메서드 외에도 FormsAuthentication 클래스는 SignOut 메서드를 제공 합니다.In Step 3 we looked at building a login page to log a user in to the site, but we have yet to see how to log a user out. In addition to methods for logging a user in, the FormsAuthentication class also provides a SignOut method. SignOut 메서드는 단순히 폼 인증 티켓을 제거 하 여 사용자를 사이트에서 로그 아웃 합니다.The SignOut method simply destroys the forms authentication ticket, thereby logging the user out of the site.

로그 아웃 링크를 제공 하는 것은 ASP.NET에서 사용자를 로그 아웃 하도록 특별히 디자인 된 컨트롤을 포함 하는 일반적인 기능입니다. LoginStatus 컨트롤 은 사용자의 인증 상태에 따라 "Login" LinkButton 또는 "Logout" LinkButton를 표시 합니다.Offering a log out link is such a common feature that ASP.NET includes a control specifically designed to log a user out. The LoginStatus control displays either a "Login" LinkButton or a "Logout" LinkButton, depending on the user's authentication status. "로그인" LinkButton는 익명 사용자에 대해 렌더링 되는 반면, 인증 된 사용자에 게는 "로그 아웃" LinkButton 표시 됩니다.A "Login" LinkButton is rendered for anonymous users, whereas a "Logout" LinkButton is displayed to authenticated users. "로그인" 및 "로그 아웃" Linkbutton 텍스트는 LoginStatus의 LoginText 및 Logintext 속성을 통해 구성할 수 있습니다.The text for the "Login" and "Logout" LinkButtons can be configured via the LoginStatus's LoginText and LogoutText properties.

"Login" LinkButton를 클릭 하면 다시 게시가 발생 하며,이는 로그인 페이지에 리디렉션이 실행 되는 것입니다.Clicking the "Login" LinkButton causes a postback, from which a redirect is issued to the login page. "Logout" LinkButton을 클릭 하면 LoginStatus 컨트롤이 FormsAuthentication 메서드를 호출한 다음 사용자를 페이지로 리디렉션합니다.Clicking the "Logout" LinkButton causes the LoginStatus control to invoke the FormsAuthentication.SignOff method and then redirects the user to a page. 로그 오프 한 사용자는 LogoutAction 속성에 따라 다음과 같은 세 가지 값 중 하나에 할당 될 수 있는 페이지를 리디렉션할 수 있습니다.The page the logged off user is redirected to depends on the LogoutAction property, which can be assigned to one of the three following values:

  • 새로 고침 – 기본값 사용자를 단지 방문한 페이지로 리디렉션합니다.Refresh – the default; redirects the user to the page they were just visiting. 방문한 페이지가 익명 사용자를 허용 하지 않는 경우 FormsAuthenticationModule는 자동으로 사용자를 로그인 페이지로 리디렉션합니다.If the page they were just visiting does not allow anonymous users, then the FormsAuthenticationModule will automatically redirect the user to the login page.

여기서 리디렉션이 수행 되는 이유에 대해 궁금한 점이 있을 수 있습니다.You may be curious as to why a redirect is performed here. 사용자가 동일한 페이지에 유지 하려는 경우 명시적 리디렉션이 필요한 이유는 무엇 인가요?If the user wants to remain on the same page, why the need for the explicit redirect? 그 이유는 "로그 오프" LinkButton 클릭 하면 사용자에 게 쿠키 컬렉션에 폼 인증 티켓이 남아 있기 때문입니다.The reason is because when the "Logoff" LinkButton is clicked, the user still has the forms authentication ticket in their cookies collection. 따라서 다시 게시 요청은 인증 된 요청입니다.Consequently, the postback request is an authenticated request. LoginStatus 컨트롤은 SignOut 메서드를 호출 하지만 FormsAuthenticationModule가 사용자를 인증 한 후에 발생 합니다.The LoginStatus control calls the SignOut method, but that happens after the FormsAuthenticationModule has authenticated the user. 따라서 명시적 리디렉션으로 인해 브라우저가 페이지를 다시 요청 합니다.Therefore, an explicit redirect causes the browser to re-request the page. 브라우저에서 페이지를 다시 요청 하는 시점에 폼 인증 티켓이 제거 되었으므로 들어오는 요청은 익명입니다.By the time the browser re-requests the page, the forms authentication ticket has been removed and therefore the incoming request is anonymous.

  • 리디렉션-사용자가 LoginStatus의 LogoutPageUrl 속성에 지정 된 URL로 리디렉션됩니다.Redirect – the user is redirected to the URL specified by the LoginStatus's LogoutPageUrl property.
  • RedirectToLoginPage – 사용자가 로그인 페이지로 리디렉션됩니다.RedirectToLoginPage – the user is redirected to the login page.

마스터 페이지에 LoginStatus 컨트롤을 추가 하 고 리디렉션 옵션을 사용 하도록 구성 하 여 로그 아웃 되었음을 확인 하는 메시지를 표시 하는 페이지로 사용자를 보냅니다. 먼저 Logout 이라는 루트 디렉터리에 페이지를 만듭니다.Let's add a LoginStatus control to the master page and configure it to use the Redirect option to send the user to a page that displays a message confirming that they have been signed out. Start by creating a page in the root directory named Logout.aspx. 이 페이지를 사이트 마스터 페이지와 연결 하는 것을 잊지 마세요.Don't forget to associate this page with the Site.master master page. 다음으로, 로그 아웃 되었음을 사용자에 게 설명 하는 메시지를 페이지 태그에 입력 합니다.Next, enter a message in the page's markup explaining to the user that they have been logged out.

그런 다음, Site. 마스터 마스터 페이지로 돌아가서 LoginContent ContentPlaceHolder의 LoginView 아래에 LoginStatus 컨트롤을 추가 합니다.Next, return to the Site.master master page and add a LoginStatus control beneath the LoginView in the LoginContent ContentPlaceHolder. LoginStatus 컨트롤의 LogoutAction 속성을 Redirect로 설정 하 고 LogoutPageUrl 속성을 "~/Logout.aspx"로 설정 합니다.Set the LoginStatus control's LogoutAction property to Redirect and its LogoutPageUrl property to "~/Logout.aspx".

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
        <asp:LoginView ID="LoginView1" runat="server">
            <LoggedInTemplate>
                Welcome back,
                <asp:LoginName ID="LoginName1" runat="server" />.
            </LoggedInTemplate>
            <AnonymousTemplate>
                Hello, stranger.
                <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
            </AnonymousTemplate>
        </asp:LoginView>
        <br />
        <asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
        
        <br /><br />
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

LoginStatus는 LoginView 컨트롤 외부에 있기 때문에 익명 및 인증 된 사용자 모두에 게 표시 되지만 LoginStatus가 "Login" 또는 "Logout" LinkButton를 올바르게 표시 하기 때문에이는 정상입니다.Since the LoginStatus is outside of the LoginView control, it will appear for both anonymous and authenticated users, but that's OK because the LoginStatus will correctly display a "Login" or "Logout" LinkButton. LoginStatus 컨트롤을 추가 하면 AnonymousTemplate의 "로그인" 하이퍼링크가 불필요 하므로 제거 합니다.With the addition of the LoginStatus control, the "Log In" HyperLink in the AnonymousTemplate is superfluous, so remove it.

그림 18은 Jisun을 취소 한 경우 default.aspx를 보여 줍니다.Figure 18 shows Default.aspx when Jisun visits. 왼쪽 열에는 로그 아웃 링크와 함께 "환영 back, Jisun" 메시지가 표시 됩니다. 로그 아웃 LinkButton을 클릭 하면 포스트백이 발생 하 고 시스템에서 Jisun이 취소 된 다음,이를 Logout으로 리디렉션합니다.Note that the left column displays the message, "Welcome back, Jisun" along with a link to log out. Clicking the log out LinkButton causes a postback, signs Jisun out of the system, and then redirects her to Logout.aspx. 그림 19에 나와 있는 것 처럼 Jisun이 이미 로그 아웃 되었으며 익명으로 인 한 것입니다.As Figure 19 shows, by the time Jisun reaches Logout.aspx she has already been signed out and is therefore anonymous. 따라서 왼쪽 열에는 "환영 합니다." 라는 텍스트와 로그인 페이지에 대 한 링크가 표시 됩니다.Consequently, the left column shows the text "Welcome, stranger" and a link to the login page.

default.aspx에 표시 되는 Default.aspx Shows

그림 18: default.aspx는 "LinkButton" (전체 크기 이미지를 보려면 클릭)와 함께 "시작, Jisun"을 표시 합니다.Figure 18: Default.aspx Shows "Welcome Back, Jisun" Along with a "Logout" LinkButton (Click to view full-size image)

로그 아웃 .aspx 표시Logout.aspx Shows

그림 19: LinkButton는 "로그인" (전체 크기 이미지를 보려면 클릭)과 함께 "환영 합니다."를 표시 합니다.Figure 19: Logout.aspx Shows "Welcome, stranger" Along with a "Login" LinkButton (Click to view full-size image)

Note

마스터 페이지의 LoginContent ContentPlaceHolder (예: 4 단계에서 login.aspx에 대해 했던 것 처럼)를 숨기도록 Logout 페이지를 사용자 지정 하는 것이 좋습니다.I encourage you to customize the Logout.aspx page to hide the master page's LoginContent ContentPlaceHolder (like we did for Login.aspx in Step 4). 그 이유는 LoginStatus 컨트롤에 의해 렌더링 된 "로그인" LinkButton ("Hello," 아래에 있는)가 사용자를 ReturnUrl querystring 매개 변수에 현재 URL을 전달 하는 로그인 페이지로 보내는 이유입니다.The reason is because the "Login" LinkButton rendered by the LoginStatus control (the one beneath "Hello, stranger") sends the user to the login page passing the current URL in the ReturnUrl querystring parameter. 즉, 로그 아웃 한 사용자가이 LoginStatus의 "Login" LinkButton를 클릭 한 다음 로그인 하면 사용자를 쉽게 혼동할 수 있도록 하는 Logout으로 다시 리디렉션됩니다.In short, if a user who has logged out clicks this LoginStatus's "Login" LinkButton, and then logs in, they will be redirected back to Logout.aspx, which could easily confuse the user.

요약Summary

이 자습서에서는 폼 인증 워크플로를 검사 한 다음 ASP.NET 응용 프로그램에서 폼 인증을 구현 하도록 시작 했습니다.In this tutorial we started with an examination of the forms authentication workflow and then turned to implementing forms authentication in an ASP.NET application. 폼 인증은 양식 인증 티켓을 기반으로 사용자를 식별 하 고 권한 없는 사용자를 로그인 페이지로 리디렉션하는 두 가지 책임이 있는 FormsAuthenticationModule에서 제공 합니다.Forms authentication is powered by the FormsAuthenticationModule, which has two responsibilities: identifying users based on their forms authentication ticket, and redirecting unauthorized users to the login page.

.NET Framework의 FormsAuthentication 클래스에는 폼 인증 티켓을 만들고, 검사 하 고, 제거 하는 메서드가 포함 되어 있습니다.The .NET Framework's FormsAuthentication class includes methods for creating, inspecting, and removing forms authentication tickets. IsAuthenticated 속성 및 User 개체는 요청이 인증 되었는지 여부를 확인 하는 추가 프로그래밍 기능을 제공 하 고 사용자 id에 대 한 정보를 제공 합니다.The Request.IsAuthenticated property and User object provide additional programmatic support for determining whether a request is authenticated and information about the user's identity. LoginView, LoginStatus 및 LoginName 웹 컨트롤도 있습니다 .이 컨트롤을 사용 하 여 개발자는 많은 일반적인 로그인 관련 작업을 빠르게 수행할 수 있습니다.There are also the LoginView, LoginStatus, and LoginName Web controls, which give developers a quick, code-free way for performing many common login-related tasks. 이러한 및 기타 로그인 관련 웹 컨트롤은 이후 자습서에서 더 자세히 살펴보겠습니다.We will examine these and other login-related Web controls in greater detail in future tutorials.

이 자습서에서는 폼 인증에 대 한 간단한 개요를 제공 했습니다.This tutorial provided a cursory overview of forms authentication. 다양 한 구성 옵션을 검토 하거나, 쿠키 없는 폼 인증 티켓이 작동 하는 방식을 확인 하거나, ASP.NET에서 폼 인증 티켓의 콘텐츠를 보호 하는 방법을 살펴보세요.We did not examine the assorted configuration options, look at how cookieless forms authentication tickets work, or explore how ASP.NET protects the contents of the forms authentication ticket. 다음 자습서에서는 이러한 항목과 기타 항목에 대해 설명 합니다.We will discuss these topics and more in the next tutorial.

행복 한 프로그래밍Happy Programming!

추가 참고 자료Further Reading

이 자습서에서 설명 하는 항목에 대 한 자세한 내용은 다음 리소스를 참조 하세요.For more information on the topics discussed in this tutorial, refer to the following resources:

이 자습서에 포함 된 항목에 대 한 비디오 학습Video Training on Topics Contained in this Tutorial

저자 정보About the Author

Scott Mitchell(7 개의 ASP/ASP. NET books 및 4GuysFromRolla.com창립자)은 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott은 독립 컨설턴트, 강사 및 기록기로 작동 합니다.Scott works as an independent consultant, trainer, and writer. 최신 책은 24 시간 이내에 ASP.NET 2.0을 sams teach yourself것입니다.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.com에 도달할 수 있습니다 .He can be reached at mitchell@4GuysFromRolla.com. 또는 블로그를 통해 http://ScottOnWriting.NET에서 찾을 수 있습니다.or via his blog, which can be found at http://ScottOnWriting.NET.

특별 해 주셔서 감사 합니다.Special Thanks To…

이 자습서 시리즈는 많은 유용한 검토자가 검토 했습니다.This tutorial series was reviewed by many helpful reviewers. 이 자습서에 대 한 잠재 고객 검토자는이 자습서 시리즈를 많은 유용한 검토자가 검토 했습니다.Lead reviewer for this tutorial was This tutorial series was reviewed by many helpful reviewers. 이 자습서의 선임 검토자는 Alicja Maziarz, John Suru 및 Teresa Murphy를 포함 합니다.Lead reviewers for this tutorial include Alicja Maziarz, John Suru, and Teresa Murphy. 예정 된 MSDN 문서를 검토 하는 데 관심이 있나요?Interested in reviewing my upcoming MSDN articles? 그렇다면mitchell@4GuysFromRolla.com에서 줄을 삭제 합니다.If so, drop me a line at mitchell@4GuysFromRolla.com.