멤버 자격 사용자 저장소에 대해 사용자 자격 증명의 유효성 검사(C#)Validating User Credentials Against the Membership User Store (C#)

Scott Mitchellby Scott Mitchell

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

이 자습서에서는 프로그래밍 방식 및 로그인 제어를 모두 사용 하 여 멤버 자격 사용자 저장소에 대해 사용자 자격 증명의 유효성을 검사 하는 방법을 설명 합니다.In this tutorial we will examine how to validate a user's credentials against the Membership user store using both programmatic means and the Login control. 로그인 컨트롤의 모양과 동작을 사용자 지정 하는 방법에 대해서도 살펴봅니다.We will also look at how to customize the login control's appearance and behavior.

소개Introduction

이전 자습서 에서는 멤버 자격 프레임 워크에서 새로운 사용자 계정을 만드는 방법에 대해 살펴보았습니다.In the preceding tutorial we looked at how to create a new user account in the Membership framework. 먼저 Membership 클래스의 메서드를 통해 사용자 계정을 만든 CreateUser 다음 CreateUserWizard 웹 컨트롤을 사용 하 여 검사 하는 방법에 대해 살펴보았습니다.We first looked at programmatically creating user accounts via the Membership class's CreateUser method, and then examined using the CreateUserWizard Web control. 그러나 로그인 페이지는 현재 하드 코드 된 사용자 이름 및 암호 쌍 목록에 대해 제공 된 자격 증명의 유효성을 검사 합니다.However, the login page currently validates the supplied credentials against a hard-coded list of username and password pairs. 멤버 프레임 워크의 사용자 저장소에 대 한 자격 증명의 유효성을 검사 하도록 로그인 페이지의 논리를 업데이트 해야 합니다.We need to update the login page's logic so that it validates credentials against the Membership framework's user store.

사용자 계정을 만드는 것과 매우 유사 하 게 자격 증명을 프로그래밍 방식으로 또는 선언적으로 확인할 수 있습니다.Much like with creating user accounts, credentials can be validated programmatically or declaratively. 멤버 자격 API에는 사용자 저장소에 대해 사용자의 자격 증명을 프로그래밍 방식으로 확인 하는 메서드가 포함 되어 있습니다.The Membership API includes a method for programmatically validating a user's credentials against the user store. 및 ASP.NET에는 사용자 이름 및 암호에 대 한 텍스트 상자와 로그인 단추를 사용 하 여 사용자 인터페이스를 렌더링 하는 로그인 웹 컨트롤이 함께 제공 됩니다.And ASP.NET ships with the Login Web control, which renders a user interface with textboxes for the username and password and a button to log in.

이 자습서에서는 프로그래밍 방식 및 로그인 제어를 모두 사용 하 여 멤버 자격 사용자 저장소에 대해 사용자 자격 증명의 유효성을 검사 하는 방법을 설명 합니다.In this tutorial we will examine how to validate a user's credentials against the Membership user store using both programmatic means and the Login control. 로그인 컨트롤의 모양과 동작을 사용자 지정 하는 방법에 대해서도 살펴봅니다.We will also look at how to customize the login control's appearance and behavior. 그럼 시작하겠습니다.Let's get started!

1 단계: 멤버 자격 사용자 저장소에 대 한 자격 증명 유효성 검사Step 1: Validating Credentials Against the Membership User Store

폼 인증을 사용 하는 웹 사이트의 경우 사용자는 로그인 페이지를 방문 하 고 자격 증명을 입력 하 여 웹 사이트에 로그온 합니다.For web sites that use forms authentication, a user logs on to the website by visiting a login page and entering their credentials. 그런 다음 이러한 자격 증명을 사용자 저장소와 비교 합니다.These credentials are then compared against the user store. 유효한 경우 방문자의 id와 신뢰성을 나타내는 보안 토큰 인 폼 인증 티켓이 사용자에 게 부여 됩니다.If they are valid, then the user is granted a forms authentication ticket, which is a security token that indicates the identity and authenticity of the visitor.

멤버 자격 프레임 워크에 대해 사용자의 유효성을 검사 하려면 Membership 클래스의 ValidateUser 메서드를 사용 합니다.To validate a user against the Membership framework, use the Membership class's ValidateUser method. ValidateUser메서드는 두 개의 입력 매개 변수 및을 사용 username password 하 고 자격 증명이 유효한 지 여부를 나타내는 부울 값을 반환 합니다.The ValidateUser method takes in two input parameters - username and password - and returns a Boolean value indicating whether the credentials were valid. CreateUser이전 자습서에서 검사 한 메서드와 마찬가지로 ValidateUser 메서드는 실제 유효성 검사를 구성 된 멤버 자격 공급자에 게 위임 합니다.Like with the CreateUser method we examined in the previous tutorial, the ValidateUser method delegates the actual validation to the configured Membership provider.

SqlMembershipProvider 저장 프로시저를 통해 지정 된 사용자의 암호를 가져와서 제공 된 자격 증명의 유효성을 검사 합니다 aspnet_Membership_GetPasswordWithFormat .The SqlMembershipProvider validates the supplied credentials by obtaining the specified user's password via the aspnet_Membership_GetPasswordWithFormat stored procedure. SqlMembershipProvider 세 가지 형식 (clear, encrypted 또는 해시 됨) 중 하나를 사용 하 여 사용자의 암호를 저장 합니다.Recall that the SqlMembershipProvider stores users' passwords using one of three formats: clear, encrypted, or hashed. aspnet_Membership_GetPasswordWithFormat저장 프로시저는 원시 형식으로 암호를 반환 합니다.The aspnet_Membership_GetPasswordWithFormat stored procedure returns the password in its raw format. 암호화 되거나 해시 된 암호의 경우는 SqlMembershipProvider password 메서드에 전달 된 값을 해당 하는 ValidateUser 암호화 또는 해시 된 상태로 변환한 다음 데이터베이스에서 반환 된 것과 비교 합니다.For encrypted or hashed passwords, the SqlMembershipProvider transforms the password value passed into the ValidateUser method into its equivalent encrypted or hashed state and then compares it with what was returned from the database. 데이터베이스에 저장 된 암호가 사용자가 입력 한 형식이 지정 된 암호와 일치 하는 경우 자격 증명이 유효 합니다.If the password stored in the database matches the formatted password entered by the user, the credentials are valid.

Login.aspx회원 프레임 워크 사용자 저장소에 대해 제공 된 자격 증명의 유효성을 검사 하도록 로그인 페이지 (~/)를 업데이트 해 보겠습니다.Let's update our login page (~/Login.aspx) so that it validates the supplied credentials against the Membership framework user store. 이 로그인 페이지 폼 인증 자습서 개요 로 돌아가, 사용자 이름 및 암호에 대해 두 개의 텍스트 상자를 사용 하 여 인터페이스를 만들고, 사용자 이름 및 로그인 단추를 선택 합니다 (그림 1 참조).We created this login page back in the An Overview of Forms Authentication tutorial, creating an interface with two TextBoxes for the username and password, a Remember Me checkbox, and a Login button (see Figure 1). 이 코드는 하드 코드 된 사용자 이름 및 암호 쌍의 하드 코드 된 목록에 대해 입력 한 자격 증명의 유효성을 검사 합니다 (Scott/password, Jisun/password 및 Sam/password).The code validates the entered credentials against a hard-coded list of username and password pairs (Scott/password, Jisun/password, and Sam/password). 폼 인증 구성 및 고급 항목 자습서에서는 폼 인증 티켓의 속성에 추가 정보를 저장 하도록 로그인 페이지의 코드를 업데이트 했습니다 UserData .In the Forms Authentication Configuration and Advanced Topics tutorial we updated the login page's code to store additional information in the forms authentication ticket's UserData property.

로그인 페이지의 인터페이스에는 두 개의 텍스트 상자, CheckBoxList 및 단추가 포함 됩니다.The Login Page's Interface Includes Two TextBoxes, a CheckBoxList, and a Button

그림 1: 로그인 페이지의 인터페이스에는 두 개의 텍스트 상자, CheckBoxList 및 단추가 포함 됩니다 (전체 크기 이미지를 보려면 클릭).Figure 1: The Login Page's Interface Includes Two TextBoxes, a CheckBoxList, and a Button (Click to view full-size image)

로그인 페이지의 사용자 인터페이스는 변경 되지 않은 상태로 유지 될 수 있지만 Click 사용자의 유효성을 검사 하는 코드를 사용 하 여 사용자의 멤버 프레임 워크 사용자 저장소에 대해 로그인 단추의 이벤트 처리기를 바꾸어야 합니다.The login page's user interface can remain unchanged, but we need to replace the Login button's Click event handler with code that validates the user against the Membership framework user store. 해당 코드가 다음과 같이 표시 되도록 이벤트 처리기를 업데이트 합니다.Update the event handler so that its code appears as follows:

protected void LoginButton_Click(object sender, EventArgs e)
{
    // Validate the user against the Membership framework user store
    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        // Log the user into the site
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

이 코드는 매우 간단 합니다.This code is remarkably simple. 메서드를 호출 하 여 제공 된 사용자 이름과 암호를 전달 하는 것부터 시작 Membership.ValidateUser 합니다.We start by calling the Membership.ValidateUser method, passing in the supplied username and password. 해당 메서드가 true를 반환 하는 경우 사용자는 FormsAuthentication 클래스의 RedirectFromLoginPage 메서드를 통해 사이트에 로그인 됩니다.If that method returns true, then the user is signed into the site via the FormsAuthentication class's RedirectFromLoginPage method. (에서 설명한 대로 폼 인증 자습서의 개요 에서는 FormsAuthentication.RedirectFromLoginPage 폼 인증 티켓을 만든 다음 사용자를 적절 한 페이지로 리디렉션합니다. 그러나 자격 증명이 유효 하지 않으면 InvalidCredentialsMessage 레이블이 표시 되어 사용자의 사용자 이름 또는 암호가 잘못 되었음을 사용자에 게 알립니다.(As we discussed in the An Overview of Forms Authentication tutorial, the FormsAuthentication.RedirectFromLoginPage creates the forms authentication ticket and then redirects the user to the appropriate page.) If the credentials are invalid, however, the InvalidCredentialsMessage Label is displayed, informing the user that their username or password was incorrect.

이것이 전부입니다!That's all there is to it!

로그인 페이지가 예상 대로 작동 하는지 테스트 하려면 이전 자습서에서 만든 사용자 계정 중 하나를 사용 하 여 로그인을 시도 합니다.To test that the login page works as expected, attempt to login with one of the user accounts you created in the preceding tutorial. 또는 계정을 아직 만들지 않은 경우 계속 진행 하 여 페이지에서 만듭니다 ~/Membership/CreatingUserAccounts.aspx .Or, if you have not yet created an account, go ahead and create one from the ~/Membership/CreatingUserAccounts.aspx page.

Note

사용자가 자신의 자격 증명을 입력 하 고 로그인 페이지 양식을 전송 하면 암호를 포함 한 자격 증명이 인터넷을 통해 웹 서버에 일반 텍스트로전송 됩니다.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.

멤버 자격 프레임 워크에서 잘못 된 로그인 시도를 처리 하는 방법How the Membership Framework Handles Invalid Login Attempts

방문자가 로그인 페이지에 도달 하 여 자격 증명을 전송 하면 브라우저에서 로그인 페이지에 대 한 HTTP 요청을 만듭니다.When a visitor reaches the login page and submits their credentials, their browser makes an HTTP request to the login page. 자격 증명이 유효 하면 HTTP 응답은 쿠키에 인증 티켓을 포함 합니다.If the credentials are valid, the HTTP response includes the authentication ticket in a cookie. 따라서 사이트에 침입 하려는 해커는 유효한 사용자 이름 및 암호 추측을 사용 하 여 로그인 페이지에 HTTP 요청을 철저히 보내는 프로그램을 만들 수 있습니다.Therefore, a hacker attempting to break into your site could create a program that exhaustively sends HTTP requests to the login page with a valid username and a guess at the password. 암호 추측이 올바르면 로그인 페이지는 인증 티켓 쿠키를 반환 합니다 .이 쿠키는 프로그램에서 유효한 사용자 이름/암호 쌍에 대 한 stumbled 있음을 알고 있습니다.If the password guess is correct, the login page will return the authentication ticket cookie, at which point the program knows it has stumbled upon a valid username/password pair. 무차별 암호 대입을 통해 이러한 프로그램은 사용자의 암호를 시 수 있습니다. 특히 암호가 취약 한 경우입니다.Through brute force, such a program might be able to stumble upon a user's password, especially if the password is weak.

이러한 무차별 암호 대입 공격을 방지 하기 위해 특정 기간 내에 로그인 시도가 실패 한 특정 횟수에 해당 하는 경우 멤버 자격 프레임 워크는 사용자를 잠급니다.To prevent such brute force attacks, the Membership framework locks out a user if there are a certain number of unsuccessful login attempts within a certain period of time. 정확한 매개 변수는 다음 두 멤버 자격 공급자 구성 설정을 통해 구성할 수 있습니다.The exact parameters are configurable through the following two Membership provider configuration settings:

  • maxInvalidPasswordAttempts -계정을 잠그기 전 기간 내에 사용자에 게 허용 되는 잘못 된 암호 시도 횟수를 지정 합니다. 기본값은 5입니다.maxInvalidPasswordAttempts - specifies how many invalid password attempts are allowed for the user within the time period before the account is locked out. The default value is 5.
  • passwordAttemptWindow -지정 된 수의 잘못 된 로그인 시도로 인해 계정이 잠기는 시간 (분)을 나타냅니다. 기본값은 10입니다.passwordAttemptWindow - indicates the time period in minutes during which the specified number of invalid login attempts will cause the account to be locked out. The default value is 10.

사용자가 잠긴 경우 관리자가 계정의 잠금을 해제할 때까지 로그인 할 수 없습니다.If a user has been locked out, she cannot login until an administrator unlocks her account. 사용자가 잠겨 있으면 ValidateUser always false 올바른 자격 증명이 제공 된 경우에도 메서드는 항상를 반환 합니다.When a user is locked out, the ValidateUser method will always return false, even if valid credentials are supplied. 이 동작으로 인해 해커가 무차별 암호 대입 방법을 통해 사이트에 침입 하 게 될 가능성이 낮아집니다. 그러나 암호를 잊어버린 경우 나 실수로 실수로 Caps Lock을 사용 하거나 잘못 입력 한 요일이 있는 유효한 사용자를 잠글 수 있습니다.While this behavior lessens the likelihood that a hacker will break into your site through brute force methods, it can end up locking out a valid user who has simply forgotten her password or accidentally has the Caps Lock on or is having a bad typing day.

아쉽게도 사용자 계정 잠금을 해제 하는 기본 제공 도구는 없습니다.Unfortunately, there is no built-in tool for unlocking a user account. 계정을 잠금 해제 하려면 데이터베이스를 수정할 수 있습니다 IsLockedOut aspnet_Membership . 적절 한 사용자 계정에 대 한 테이블의 필드를 직접 변경 하거나 잠금을 해제 하는 옵션을 사용 하 여 잠긴 계정을 나열 하는 웹 기반 인터페이스를 만들 수 있습니다.In order to unlock an account, you can modify the database directly - change the IsLockedOut field in the aspnet_Membership table for the appropriate user account - or create a web-based interface that lists locked out accounts with options to unlock them. 이후 자습서에서 일반적인 사용자 계정 및 역할 관련 작업을 수행 하기 위한 관리 인터페이스 만들기를 살펴보겠습니다.We will examine creating administrative interfaces for accomplishing common user account- and role-related tasks in a future tutorial.

Note

메서드의 한 가지 단점은 ValidateUser 제공 된 자격 증명이 유효 하지 않은 경우 이유에 대 한 설명을 제공 하지 않는다는 것입니다.One downside of the ValidateUser method is that when the supplied credentials are invalid, it does not provide any explanation as to why. 사용자 저장소에 일치 하는 사용자 이름/암호 쌍이 없거나 사용자가 아직 승인 되지 않았거나 사용자가 잠겨 있어서 자격 증명이 유효 하지 않을 수 있습니다. 4 단계에서는 로그인 시도가 실패할 때 사용자에 게 더 자세한 메시지를 표시 하는 방법을 알아봅니다.The credentials may be invalid because there is no matching username/password pair in the user store, or because the user has not yet been approved, or because the user has been locked out. In Step 4 we will see how to show a more detailed message to the user when their login attempt fails.

2 단계: 로그인 웹 컨트롤을 통해 자격 증명 수집Step 2: Collecting Credentials through the Login Web Control

로그인 웹 컨트롤 폼 인증 개요 자습서에서 만든 것과 매우 유사한 기본 사용자 인터페이스를 렌더링 합니다.The Login Web control renders a default user interface very similar to the one we created back in the An Overview of Forms Authentication tutorial. 로그인 컨트롤을 사용 하면 방문자의 자격 증명을 수집 하는 인터페이스를 만드는 작업을 저장 합니다.Using the Login control saves us the work of having to create the interface to collect the visitor's credentials. 또한 로그인 컨트롤이 사용자에 게 자동으로 로그인 하 여 (제출 된 자격 증명이 유효 하다 고 가정) 코드를 작성 하지 않아도 됩니다.Moreover, the Login control automatically signs in the user (assuming the submitted credentials are valid), thereby saving us from having to write any code.

Login.aspx수동으로 만든 인터페이스와 코드를 로그인 컨트롤로 바꿔서 업데이트 해 보겠습니다.Let's update Login.aspx, replacing the manually created interface and code with a Login control. 에서 기존 태그와 코드를 제거 하 여 시작 Login.aspx 합니다.Start by removing the existing markup and code in Login.aspx. 완전히 삭제 하거나 간단히 주석으로 처리할 수 있습니다. 선언적 태그를 주석으로 처리 하려면 <%-- 및 구분 기호를 사용 하 여 묶습니다 --%> .You may delete it outright, or simply comment it out. To comment out declarative markup, surround it with the <%-- and --%> delimiters. 이러한 구분 기호를 수동으로 입력할 수도 있고, 그림 2에 표시 된 것 처럼 주석 처리할 텍스트를 선택한 다음 도구 모음에서 선택한 줄 주석 아이콘을 클릭할 수도 있습니다.You can enter these delimiters manually, or, as Figure 2 shows, you may select the text to comment out and then click the Comment out the selected lines icon in the Toolbar. 마찬가지로, 선택한 줄 주석 처리 아이콘을 사용 하 여 코드 숨김이 있는 클래스에서 선택한 코드를 주석으로 처리할 수 있습니다.Similarly, you can use the Comment out the selected lines icon to comment out the selected code in the code-behind class.

Login.aspx에서 기존 선언적 태그 및 소스 코드를 주석으로 처리 합니다.Comment Out the Existing Declarative Markup and Source Code in Login.aspx

그림 2:에서 기존 선언적 태그 및 소스 코드 주석 처리 Login.aspx (전체 크기 이미지를 보려면 클릭)Figure 2: Comment Out the Existing Declarative Markup and Source Code in Login.aspx (Click to view full-size image)

Note

Visual Studio 2005에서 선언 태그를 볼 때 선택한 줄 주석 주석 달기 아이콘을 사용할 수 없습니다.The Comment out the selected lines icon is not available when viewing the declarative markup in Visual Studio 2005. Visual Studio 2008을 사용 하지 않는 경우 <%-- 및 구분 기호를 수동으로 추가 해야 합니다 --%> .If you are not using Visual Studio 2008 you will need to manually add the <%-- and --%> delimiters.

그런 다음 로그인 컨트롤을 도구 상자에서 페이지로 끌고 해당 ID 속성을로 설정 myLogin 합니다.Next, drag a Login control from the Toolbox on to the page and set its ID property to myLogin. 이 시점에서 화면은 그림 3과 유사 하 게 표시 됩니다.At this point your screen should look similar to Figure 3. 로그인 컨트롤의 기본 인터페이스에는 사용자 이름 및 암호에 대 한 텍스트 상자 컨트롤, 나중에 암호 기억 확인란 및 로그인 단추가 포함 됩니다.Note that the Login control's default interface includes TextBox controls for the username and password, a Remember me next time CheckBox, and a Log In Button. 또한 RequiredFieldValidator 두 텍스트 상자에 대 한 컨트롤도 있습니다.There are also RequiredFieldValidator controls for the two TextBoxes.

페이지에 로그인 컨트롤 추가Add a Login Control to the Page

그림 3: 페이지에 로그인 컨트롤 추가 (전체 크기 이미지를 보려면 클릭)Figure 3: Add a Login Control to the Page (Click to view full-size image)

완료 되었습니다.And we're done! 로그인 컨트롤의 로그인 단추를 클릭 하면 포스트백이 발생 하 고 로그인 컨트롤이 메서드를 호출 Membership.ValidateUser 하 여 입력 한 사용자 이름과 암호를 전달 합니다.When the Login control's Log In button is clicked, a postback will occur and the Login control will call the Membership.ValidateUser method, passing in the entered username and password. 자격 증명이 유효 하지 않은 경우 로그인 컨트롤에 해당 메시지가 표시 됩니다.If the credentials are invalid, the Login control displays a message stating such. 그러나 자격 증명이 유효 하면 로그인 컨트롤이 폼 인증 티켓을 만들고 사용자를 적절 한 페이지로 리디렉션합니다.If, however, the credentials are valid, then the Login control creates the forms authentication ticket and redirects the user to the appropriate page.

로그인 컨트롤은 네 가지 요소를 사용 하 여 성공적으로 로그인 할 때 사용자를 리디렉션할 적절 한 페이지를 결정 합니다.The Login control uses four factors to determine the appropriate page to redirect the user to upon a successful login:

  • 로그인 컨트롤이 폼 인증 구성에서 설정 하 여 정의 된 로그인 페이지에 있는지 여부 loginUrl 입니다 .이 설정의 기본값은입니다. Login.aspxWhether the Login control is on the login page as defined by loginUrl setting in the forms authentication configuration; this setting's default value is Login.aspx
  • ReturnUrlQuerystring 매개 변수가 있는지 여부The presence of a ReturnUrl querystring parameter
  • 로그인 컨트롤의 DestinationUrl 속성 값입니다.The value of the Login control's DestinationUrl property
  • defaultUrl폼 인증 구성 설정에 지정 된 값입니다 .이 설정의 기본값은입니다.Default.aspxThe defaultUrl value specified in the forms authentication configuration settings; this setting's default value is Default.aspx

그림 4에서는 로그인 컨트롤에서 이러한 4 개의 매개 변수를 사용 하 여 적절 한 페이지 결정을 내리는 방법을 보여 줍니다.Figure 4 depicts the how the Login control uses these four parameters to arrive at its appropriate page decision.

페이지에 로그인 컨트롤 추가Add a Login Control to the Page

그림 4: 페이지에 로그인 컨트롤 추가 (전체 크기 이미지를 보려면 클릭)Figure 4: Add a Login Control to the Page (Click to view full-size image)

잠시 시간을 내 서 브라우저를 통해 사이트를 방문 하 고 멤버 자격 프레임 워크에서 기존 사용자로 로그인 하 여 로그인 컨트롤을 테스트 합니다.Take a moment to test out the Login control by visiting the site through a browser and logging in as an existing user in the Membership framework.

로그인 컨트롤의 렌더링 된 인터페이스는 매우 구성 가능 합니다.The Login control's rendered interface is highly configurable. 모양에 영향을 주는 속성은 여러 가지가 있습니다. 자세히, 사용자 인터페이스 요소 레이아웃에 대 한 정확한 제어를 위해 로그인 컨트롤을 템플릿으로 변환할 수 있습니다.There are a number of properties that influence its appearance; what's more, the Login control can be converted into a template for precise control over the layout the user interface elements. 이 단계의 나머지 부분에서는 모양 및 레이아웃을 사용자 지정 하는 방법을 살펴봅니다.The remainder of this step examines how to customize the appearance and layout.

로그인 컨트롤의 모양 사용자 지정Customizing the Login Control's Appearance

로그인 컨트롤의 기본 속성 설정은 제목 (로그인), 사용자 이름 및 암호 입력을 위한 텍스트 상자 및 레이블 컨트롤, 사용자 이름 및 암호 입력을 위한 레이블 컨트롤, 로그인 단추를 사용 하 여 사용자 인터페이스를 렌더링 합니다.The Login control's default property settings render a user interface with a title ( Log In ), TextBox and Label controls for the username and password inputs, a Remember me next time CheckBox, and a Log In button. 이러한 요소의 모양은 모두 로그인 컨트롤의 다양 한 속성을 통해 구성할 수 있습니다.The appearances of these elements are all configurable through the Login control's numerous properties. 또한 새 사용자 계정을 만들기 위해 페이지에 대 한 링크와 같은 추가 사용자 인터페이스 요소를 추가 하 여 속성을 하나 또는 두 개 설정할 수 있습니다.Furthermore, additional user interface elements - such as a link to a page to create a new user account - can be added by setting a property or two.

로그인 컨트롤의 모양을 gussy 하는 데 몇 분 정도 걸립니다.Let's spend a few moments to gussy up the appearance of our Login control. 페이지의 Login.aspx 페이지 맨 위에 login 이라는 텍스트가 이미 있으므로 로그인 컨트롤의 제목은 불필요 합니다.Since the Login.aspx page already has text at the top of the page that says Login, the Login control's title is superfluous. 따라서 로그인 컨트롤의 제목을 제거 하려면 TitleText 속성 값을 지우십시오.Therefore, clear out the TitleText property value in order to remove the Login control's title.

두 TextBox 컨트롤의 왼쪽에 있는 사용자 이름: 및 암호: 레이블은 UserNameLabelText 각각 및 PasswordLabelText 속성을 통해 사용자 지정할 수 있습니다.The User Name: and Password: Labels to the left of the two TextBox controls can be customized through the UserNameLabelText and PasswordLabelText properties, respectively. 사용자 이름: Label을 변경 하 여 사용자 이름:을 읽습니다.Let's change the User Name: Label to read Username:. 레이블 및 텍스트 상자 스타일은 LabelStyle 각각 및 TextBoxStyle 속성을 통해 구성할 수 있습니다.The Label and TextBox styles are configurable through the LabelStyle and TextBoxStyle properties, respectively.

다음 시간 후 암호 확인란의 Text 속성은 로그인 컨트롤의를 통해 설정할 수 RememberMeText property 있으며, 기본 선택 된 상태는 RememberMeSet property (기본값은 False)을 통해 구성할 수 있습니다.The Remember me next time CheckBox's Text property can be set through the Login control's RememberMeText property, and its default checked state is configurable through the RememberMeSet property (which defaults to False). 계속 해 서 속성을 True로 설정 하 여 나중에 나중에 RememberMeSet 암호 지정 확인란을 선택 합니다.Go ahead and set the RememberMeSet property to True so that the Remember me next time CheckBox will be checked by default.

로그인 컨트롤은 사용자 인터페이스 컨트롤의 레이아웃을 조정 하기 위한 두 가지 속성을 제공 합니다.The Login control offers two properties for adjusting the layout of its user interface controls. TextLayout property Username: 및 Password: 레이블이 해당 하는 텍스트 상자 (기본값)의 왼쪽에 표시 되는지 여부를 나타냅니다.The TextLayout property indicates whether the Username: and Password: Labels appear to the left of their corresponding TextBoxes (the default), or above them. Orientation property 사용자 이름 및 암호 입력이 세로 (다른 하나 위에 있는 경우) 또는 가로로 배치 되었는지 여부를 나타냅니다.The Orientation property indicates whether the username and password inputs are situated vertically (one above the other) or horizontally. 이러한 두 가지 속성을 기본값으로 설정 하지만 이러한 두 속성을 기본값이 아닌 값으로 설정 하 여 결과 효과를 확인 하는 것이 좋습니다.I am going to leave these two properties set to their defaults, but I encourage you to try setting these two properties to their non-default values to see the resulting effect.

Note

다음 섹션 로그인 컨트롤의 레이아웃 구성에서 템플릿 사용을 살펴보고 레이아웃 컨트롤의 사용자 인터페이스 요소에 대 한 정확한 레이아웃을 정의 합니다.In the next section, Configuring the Login Control's Layout, we will look at using templates to define the precise layout of the Layout control's user interface elements.

CreateUserText CreateUserUrl 속성 을 아직 등록 하지 않음으로 설정 하 여 로그인 컨트롤의 속성 설정을 래핑합니다.Wrap up the Login control's property settings by setting the CreateUserText and CreateUserUrl properties to Not registered yet? 계정 만들기Create an account! ~/Membership/CreatingUserAccounts.aspx각각에 해당 합니다.and ~/Membership/CreatingUserAccounts.aspx, respectively. 그러면 이전 자습서에서 만든 페이지를 가리키는 하이퍼링크가 로그인 컨트롤의 인터페이스에 추가 preceding tutorial됩니다.This adds a hyperlink to the Login control's interface pointing to the page we created in the preceding tutorial. 로그인 컨트롤의 HelpPageText 및 속성과 HelpPageUrl PasswordRecoveryText PasswordRecoveryUrl 속성 은 동일한 방식으로 작동 하며, 도움말 페이지 및 암호 복구 페이지에 대 한 링크를 렌더링 합니다.The Login control's HelpPageText and HelpPageUrl properties and PasswordRecoveryText and PasswordRecoveryUrl properties work in the same manner, rendering links to a help page and a password recovery page.

이러한 속성을 변경한 후에는 로그인 컨트롤의 선언적 태그와 모양이 그림 5에 표시 된 것과 유사 하 게 표시 됩니다.After making these property changes, your Login control's declarative markup and appearance should look similar to that shown in Figure 5.

로그인 컨트롤의 속성 값이 모양을 지시 합니다.The Login Control's Properties' Values Dictate Its Appearance

그림 5: 로그인 컨트롤의 속성 값이 모양을 지시 (전체 크기 이미지를 보려면 클릭)Figure 5: The Login Control's Properties' Values Dictate Its Appearance (Click to view full-size image)

로그인 컨트롤의 레이아웃 구성Configuring the Login Control's Layout

로그인 웹 컨트롤의 기본 사용자 인터페이스는 HTML에서 인터페이스를 배치 합니다 <table> .The Login Web control's default user interface lays out the interface in an HTML <table>. 그러나 렌더링 된 출력을 보다 세부적으로 제어 해야 하는 경우는 어떻게 되나요?But what if we need finer control over the rendered output? <table> 일련의 태그로 바꿀 수도 <div> 있습니다.Maybe we want to replace the <table> with a series of <div> tags. 또는 응용 프로그램에 인증을 위해 추가 자격 증명이 필요한 경우 어떻게 하나요?Or what if our application requires additional credentials for authentication? 예를 들어 많은 금융 웹 사이트에서 사용자는 사용자 이름 및 암호 뿐만 아니라 개인 식별 번호 (PIN) 또는 기타 식별 정보를 제공 해야 합니다.Many financial websites, for instance, require users to supply not only a username and password, but also a Personal Identification Number (PIN), or other identifying information. 이유가 무엇이 든, 로그인 컨트롤을 템플릿으로 변환 하 여 인터페이스의 선언 태그를 명시적으로 정의할 수 있습니다.Whatever the reasons may be, it is possible to convert the Login control into a template, from which we can explicitly define the interface's declarative markup.

추가 자격 증명을 수집 하도록 로그인 컨트롤을 업데이트 하기 위해 다음 두 가지 작업을 수행 해야 합니다.We need to do two things in order to update the Login control to collect additional credentials:

  1. 추가 자격 증명을 수집 하는 웹 컨트롤을 포함 하도록 로그인 컨트롤의 인터페이스를 업데이트 합니다.Update the Login control's interface to include Web control(s) to collect the additional credentials.
  2. 사용자의 사용자 이름과 암호가 올바르고 추가 자격 증명이 유효한 경우에만 사용자가 인증 되도록 로그인 컨트롤의 내부 인증 논리를 재정의 합니다.Override the Login control's internal authentication logic so that a user is only authenticated if their username and password is valid and their additional credentials are valid, too.

첫 번째 작업을 수행 하려면 로그인 컨트롤을 템플릿으로 변환 하 고 필요한 웹 컨트롤을 추가 해야 합니다.To accomplish the first task, we need to convert the Login control into a template and add the necessary Web controls. 두 번째 작업의 경우, 컨트롤의 Authenticate 이벤트에 대 한 이벤트 처리기를 만들어 로그인 컨트롤의 인증 논리를 대체 시킬 수 있습니다.As for the second task, the Login control's authentication logic can be superseded by creating an event handler for the control's Authenticate event.

사용자의 사용자 이름, 암호 및 전자 메일 주소를 묻는 메시지를 표시 하 고 제공 된 전자 메일 주소가 파일의 전자 메일 주소와 일치 하는 경우에만 사용자를 인증 하도록 로그인 제어를 업데이트 해 보겠습니다.Let's update the Login control so that it prompts users for their username, password, and email address and only authenticates the user if the email address supplied matches their email address on file. 먼저 로그인 컨트롤의 인터페이스를 템플릿으로 변환 해야 합니다.We first need to convert the Login control's interface to a template. 로그인 컨트롤의 스마트 태그에서 템플릿으로 변환 옵션을 선택 합니다.From the Login control's Smart Tag, choose the Convert to template option.

로그인 컨트롤을 템플릿으로 변환Convert the Login Control to a Template

그림 6: 로그인 컨트롤을 템플릿으로 변환 (전체 크기 이미지를 보려면 클릭)Figure 6: Convert the Login Control to a Template (Click to view full-size image)

Note

로그인 컨트롤을 템플릿 이전 버전으로 되돌리려면 컨트롤의 스마트 태그에서 다시 설정 링크를 클릭 합니다.To revert the Login control to its pre-template version, click the Reset link from the control's Smart Tag.

로그인 컨트롤을 템플릿으로 변환 하면 LayoutTemplate HTML 요소 및 사용자 인터페이스를 정의 하는 웹 컨트롤을 사용 하 여 컨트롤의 선언 태그에를 추가 합니다.Converting the Login control to a template adds a LayoutTemplate to the control's declarative markup with HTML elements and Web controls defining the user interface. 그림 7에 표시 된 것 처럼 컨트롤을 템플릿으로 변환 하면, 등의 다양 한 속성이 속성 창에서 제거 됩니다 TitleText CreateUserUrl . 이러한 속성 값은 템플릿을 사용할 때 무시 되기 때문입니다.As Figure 7 shows, converting the control to a template removes a number of properties from the Properties window, such as TitleText, CreateUserUrl, and so forth, since these property values are ignored when using a template.

로그인 컨트롤이 템플릿으로 변환 될 때 사용할 수 있는 속성의 수를 줄입니다.Fewer Properties are Available When the Login Control is Converted to a Template

그림 7: 로그인 컨트롤이 템플릿으로 변환 될 때 사용할 수 있는 속성 (전체 크기 이미지를 보려면 클릭)Figure 7: Fewer Properties are Available When the Login Control is Converted to a Template (Click to view full-size image)

필요에 따라의 HTML 태그를 LayoutTemplate 수정할 수 있습니다.The HTML markup in the LayoutTemplate may be modified as needed. 마찬가지로 새 웹 컨트롤을 템플릿에 자유롭게 추가할 수 있습니다.Likewise, feel free to add any new Web controls to the template. 그러나 로그인 컨트롤의 핵심 웹 컨트롤은 템플릿에 유지 되 고 할당 된 값을 유지 하는 것이 중요 ID 합니다.However, it is important that Login control's core Web controls remain in the template and keep their assigned ID values. 특히 UserName 또는 Password 텍스트 상자, RememberMe 확인란, LoginButton 단추, FailureText 레이블 또는 RequiredFieldValidator 컨트롤을 제거 하거나 이름을 변경 하지 마십시오.In particular, do not remove or rename the UserName or Password TextBoxes, the RememberMe CheckBox, the LoginButton Button, the FailureText Label, or the RequiredFieldValidator controls.

방문자의 전자 메일 주소를 수집 하려면 템플릿에 텍스트 상자를 추가 해야 합니다.To collect the visitor's email address, we need to add a TextBox to the template. <tr>텍스트 상자를 포함 하는 테이블 행 () Password 과 다음 시간 후 저장 확인란을 포함 하는 테이블 행 사이에 다음 선언적 태그를 추가 합니다.Add the following declarative markup between the table row (<tr>) that contains the Password TextBox and the table row that holds the Remember me next time CheckBox:

<tr>
 <td align="right">
 <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
 </td>
 <td>
 <asp:TextBox ID="Email" runat="server"></asp:TextBox>
 <asp:RequiredFieldValidator ID="EmailRequired" runat="server" 
 ControlToValidate="Email" ErrorMessage="Email is required." 
 ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
 </td>
</tr>

텍스트 상자를 추가한 후 Email 브라우저를 통해 페이지를 방문 합니다.After adding the Email TextBox, visit the page through a browser. 그림 8에 나와 있는 것 처럼 로그인 컨트롤의 사용자 인터페이스에는 이제 세 번째 텍스트 상자가 포함 되어 있습니다.As Figure 8 shows, the Login control's user interface now includes a third textbox.

이제 로그인 컨트롤에 사용자 전자 메일 주소에 대 한 텍스트 상자가 포함 되어 있습니다.The Login Control Now Includes a Textbox for the User's Email Address

그림 8: 이제 로그인 컨트롤에 사용자 전자 메일 주소에 대 한 텍스트 상자가 포함 되어 있습니다 (전체 크기 이미지를 보려면 클릭).Figure 8: The Login Control Now Includes a Textbox for the User's Email Address (Click to view full-size image)

이 시점에서 로그인 컨트롤은 아직 메서드를 사용 하 여 Membership.ValidateUser 제공 된 자격 증명의 유효성을 검사 합니다.At this point, the Login control is still using the Membership.ValidateUser method to validate the supplied credentials. 마찬가지로 텍스트 상자에 입력 한 값은 Email 사용자가 로그인 할 수 있는지 여부에 관계 없이 사용 됩니다.Correspondingly, the value entered into the Email TextBox has no bearing on whether the user can log in. 3 단계에서는 사용자 이름과 암호가 올바르고 제공 된 전자 메일 주소가 파일의 전자 메일 주소와 일치 하는 경우에만 자격 증명을 유효한 것으로 간주 하도록 로그인 컨트롤의 인증 논리를 재정의 하는 방법을 살펴보겠습니다.In Step 3 we will look at how to override the Login control's authentication logic so that the credentials are only considered valid if the username and password are valid and the supplied email address matches up with the email address on file.

3 단계: 로그인 컨트롤의 인증 논리 수정Step 3: Modifying the Login Control's Authentication Logic

방문자가 자격 증명을 제공 하 고 로그인 단추를 클릭 하면 다시 게시 ensues 및 로그인 제어가 인증 워크플로를 통해 진행 됩니다.When a visitor supplies her credentials and clicks the Log In button, a postback ensues and the Login control progresses through its authentication workflow. LoggingIn 이벤트를 발생 시켜 워크플로를 시작 합니다.The workflow starts by raising the LoggingIn event. 이 이벤트와 연결 된 이벤트 처리기는 속성을로 설정 하 여 로그인 작업을 취소할 수 있습니다 e.Cancel true .Any event handlers associated with this event may cancel the log in operation by setting the e.Cancel property to true.

로그인 작업이 취소 되지 않으면 Authenticate 이벤트를 발생 시켜 워크플로가 진행 됩니다.If the log in operation is not cancelled, the workflow progresses by raising the Authenticate event. 이벤트에 대 한 이벤트 처리기가 있는 경우 Authenticate 제공 된 자격 증명이 유효한 지 여부를 확인 해야 합니다.If there is an event handler for the Authenticate event, then it is responsible for determining whether the supplied credentials are valid or not. 이벤트 처리기가 지정 되지 않은 경우 로그인 컨트롤은 메서드를 사용 하 여 Membership.ValidateUser 자격 증명의 유효성을 확인 합니다.If no event handler is specified, the Login control uses the Membership.ValidateUser method to determine the validity of the credentials.

제공 된 자격 증명이 유효 하면 폼 인증 티켓이 만들어지고 LoggedIn 이벤트가 발생 하며 사용자가 해당 페이지로 리디렉션됩니다.If the supplied credentials are valid, then the forms authentication ticket is created, the LoggedIn event is raised, and the user is redirected to the appropriate page. 그러나 자격 증명이 잘못 된 것으로 간주 되 면 LoginError 이벤트가 발생 하 고 사용자에 게 자격 증명이 잘못 되었음을 알리는 메시지가 표시 됩니다.If, however, the credentials are deemed invalid, then the LoginError event is raised and a message is displayed informing the user that their credentials were invalid. 기본적으로 실패 한 경우 로그인 컨트롤은 FailureText 레이블 컨트롤의 Text 속성을 오류 메시지로 설정 합니다. 로그인에 성공 하지 못했습니다.By default, on failure the Login control simply sets its FailureText Label control's Text property to a failure message ( Your login attempt was not successful. 다시 시도 하세요.)Please try again ). 그러나 Login 컨트롤의 FailureAction 속성이 로 설정 된 경우에는 로그인 RedirectToLoginPage 컨트롤이 Response.Redirect querystring 매개 변수를 추가 하는 로그인 페이지에를 발급 합니다 loginfailure=1 .이로 인해 로그인 컨트롤이 오류 메시지를 표시 합니다.However, if the Login control's FailureAction property is set to RedirectToLoginPage, then the Login control issues a Response.Redirect to the login page appending the querystring parameter loginfailure=1 (which causes the Login control to display the failure message).

그림 9에서는 인증 워크플로의 순서도를 제공 합니다.Figure 9 offers a flow chart of the authentication workflow.

로그인 컨트롤의 인증 워크플로The Login Control's Authentication Workflow

그림 9: 로그인 컨트롤의 인증 워크플로 (전체 크기 이미지를 보려면 클릭)Figure 9: The Login Control's Authentication Workflow (Click to view full-size image)

Note

FailureAction의 페이지 옵션을 사용 하는 경우 RedirectToLogin 다음 시나리오를 고려 하세요.If you are wondering when you would use the FailureAction's RedirectToLogin page option, consider the following scenario. Site.master현재 마스터 페이지에는 현재 익명 사용자가 방문 하는 경우 왼쪽 열에 표시 되는 텍스트, Hello, 낯선이 있지만 해당 텍스트를 로그인 컨트롤로 바꾸려고 한다고 가정 합니다.Right now our Site.master master page currently has the text, Hello, stranger displayed in the left column when visited by an anonymous user, but imagine that we wanted to replace that text with a Login control. 이렇게 하면 익명 사용자가 로그인 페이지를 직접 방문 하도록 요구 하지 않고 사이트의 모든 페이지에서 로그인 할 수 있습니다.This would allow an anonymous user to log in from any page on the site, instead of requiring them to visit the login page directly. 그러나 사용자가 마스터 페이지에서 렌더링 된 로그인 컨트롤을 통해 로그인 할 수 없는 경우에는 해당 Login.aspx 페이지에 추가 지침, 링크 및 기타 도움말 (예: 새 계정 만들기 또는 분실 한 암호 검색에 대 한 링크)이 포함 될 수 있으므로이 페이지를 로그인 페이지 ()로 리디렉션하는 것이 좋을 수 있습니다.However, if a user was unable to log in via the Login control rendered by the master page, it might make sense to redirect them to the login page (Login.aspx) because that page likely includes additional instructions, links, and other help - such as links to create a new account or retrieve a lost password - that were not added to the master page.

Authenticate이벤트 처리기 만들기Creating theAuthenticateEvent Handler

사용자 지정 인증 논리를 연결 하기 위해 로그인 컨트롤의 이벤트에 대 한 이벤트 처리기를 만들어야 Authenticate 합니다.In order to plug in our custom authentication logic, we need to create an event handler for the Login control's Authenticate event. 이벤트에 대 한 이벤트 처리기를 만들면 Authenticate 다음 이벤트 처리기 정의가 생성 됩니다.Creating an event handler for the Authenticate event will generate the following event handler definition:

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
}

여기에서 볼 수 있듯이 Authenticate 이벤트 처리기는 형식의 개체를 AuthenticateEventArgs 두 번째 입력 매개 변수로 전달 합니다.As you can see, the Authenticate event handler is passed an object of type AuthenticateEventArgs as its second input parameter. 클래스에는 AuthenticateEventArgs Authenticated 제공 된 자격 증명이 유효한 지 여부를 지정 하는 데 사용 되는 라는 부울 속성이 포함 되어 있습니다.The AuthenticateEventArgs class contains a Boolean property named Authenticated that is used to specify whether the supplied credentials are valid. 그런 다음 작업은 제공 된 자격 증명이 유효한 지 여부를 확인 하 고이에 따라 속성을 설정 하는 코드를 작성 하는 것입니다 e.Authenticate .Our task, then, is to write code here that determines whether the supplied credentials are valid or not, and to set the e.Authenticate property accordingly.

제공 된 자격 증명 확인 및 유효성 검사Determining and Validating the Supplied Credentials

로그인 컨트롤의 UserName Password 속성 을 사용 하 여 사용자가 입력 한 사용자 이름 및 암호 자격 증명을 확인 합니다.Use the Login control's UserName and Password properties to determine the username and password credentials entered by the user. 이전 단계에서 추가한 텍스트 상자와 같은 추가 웹 컨트롤에 입력 된 값을 확인 하려면 Email LoginControlID .FindControl ("")를 사용 하 여 속성이 인 controlID 템플릿의 웹 컨트롤에 대 한 프로그래밍 참조를 가져옵니다 ID controlID .In order to determine the values entered into any additional Web controls (such as the Email TextBox we added in the previous step), use LoginControlID.FindControl("controlID") to obtain a programmatic reference to the Web control in the template whose ID property is equal to controlID. 예를 들어 텍스트 상자에 대 한 참조를 가져오려면 Email 다음 코드를 사용 합니다.For example, to get a reference to the Email TextBox, use the following code:

TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;

사용자 자격 증명의 유효성을 검사 하기 위해 다음 두 가지 작업을 수행 해야 합니다.In order to validate the user's credentials we need to do two things:

  1. 제공 된 사용자 이름 및 암호가 유효한 지 확인 합니다.Ensure that the provided username and password are valid
  2. 입력 한 전자 메일 주소가 로그인을 시도 하는 사용자의 파일에 있는 전자 메일 주소와 일치 하는지 확인 합니다.Ensure that email address entered matches the email address on file for the user attempting to log in

첫 번째 검사를 수행 하려면 Membership.ValidateUser 1 단계에서 본 것 처럼 메서드를 사용 하면 됩니다.To accomplish the first check we can simply use the Membership.ValidateUser method like we saw in Step 1. 두 번째 확인의 경우 사용자의 전자 메일 주소를 확인 하 여 TextBox 컨트롤에 입력 한 전자 메일 주소와 비교할 수 있도록 해야 합니다.For the second check, we need to determine the user's email address so that we can compare it to the email address they entered into the TextBox control. 특정 사용자에 대 한 정보를 가져오려면 Membership 클래스의 GetUser 메서드를 사용 합니다.To get information about a particular user, use the Membership class's GetUser method.

GetUser메서드에는 많은 오버 로드가 있습니다.The GetUser method has a number of overloads. 매개 변수를 전달 하지 않고 사용 하는 경우 현재 로그인 한 사용자에 대 한 정보를 반환 합니다.If used without passing in any parameters, it returns information about the currently logged in user. 특정 사용자에 대 한 정보를 가져오려면를 호출 하 여 사용자 GetUser 이름으로 전달 합니다.To get information about a particular user, call GetUser passing in their username. 어느 쪽이 든,,, GetUser 등과 같은 속성을 가진 MembershipUser 개체를 반환 UserName Email IsApproved IsOnline 합니다.Either way, GetUser returns a MembershipUser object, which has properties like UserName, Email, IsApproved, IsOnline, and so on.

다음 코드에서는 이러한 두 가지 검사를 구현 합니다.The following code implements these two checks. 둘 다 통과 하면 e.Authenticate 가로 설정 되 고, true 그렇지 않으면가 할당 됩니다 false .If both pass, then e.Authenticate is set to true, otherwise it is assigned false.

protected void myLogin_Authenticate(object sender, AuthenticateEventArgs e)
{
    // Get the email address entered
    TextBox EmailTextBox = myLogin.FindControl("Email") as TextBox;
    string email = EmailTextBox.Text.Trim();

    // Verify that the username/password pair is valid
    if (Membership.ValidateUser(myLogin.UserName, myLogin.Password))
    {
        // Username/password are valid, check email
        MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
        if (usrInfo != null && string.Compare(usrInfo.Email, email, true) == 0)
        {
            // Email matches, the credentials are valid
            e.Authenticated = true;
        }
        else
        {
            // Email address is invalid...
            e.Authenticated = false;
        }
    }
    else
    {
        // Username/password are not valid...
        e.Authenticated = false;
    }
}

이 코드를 그대로 사용 하 고 올바른 사용자 이름, 암호 및 전자 메일 주소를 입력 하 여 유효한 사용자로 로그인 합니다.With this code in place, attempt to log in as a valid user, entering the correct username, password, and email address. 다시 시도 하지만 이번에는 잘못 된 전자 메일 주소를 사용 합니다 (그림 10 참조).Try it again, but this time purposefully use an incorrect email address (see Figure 10). 마지막으로, 존재 하지 않는 사용자 이름을 사용 하 여 세 번째 시간을 시도 합니다.Finally, try it a third time using a non-existent username. 첫 번째 경우에는 사이트에 성공적으로 로그온 해야 하지만 마지막 두 경우에는 로그인 컨트롤의 잘못 된 자격 증명 메시지가 표시 되어야 합니다.In the first case you should be successfully logged on to the site, but in the last two cases you should see the Login control's invalid credentials message.

잘못 된 전자 메일 주소를 제공 하면 tito에 로그인 할 수 없습니다.Tito Cannot Log In When Supplying an Incorrect Email Address

그림 10: 잘못 된 전자 메일 주소를 제공 하는 경우 로그인 할 수 없음 (전체 크기 이미지를 보려면 클릭)Figure 10: Tito Cannot Log In When Supplying an Incorrect Email Address (Click to view full-size image)

Note

1 단계의 잘못 된 로그인 시도를 처리 하는 방법 섹션에 설명 된 대로 Membership.ValidateUser 메서드를 호출 하 고 잘못 된 자격 증명을 전달 하면 잘못 된 로그인 시도를 추적 하 고 지정 된 기간 내에 잘못 된 시도의 특정 임계값을 초과 하는 경우 사용자를 잠급니다.As discussed in the How the Membership Framework Handles Invalid Login Attempts section in Step 1, when the Membership.ValidateUser method is called and passed invalid credentials, it keeps track of the invalid login attempt and locks out the user if they exceed a certain threshold of invalid attempts within a specified time window. 사용자 지정 인증 논리가 메서드를 호출 하기 때문에 ValidateUser 유효한 사용자 이름에 대해 잘못 된 암호를 입력 하면 잘못 된 로그인 시도 카운터가 증가 하지만 사용자 이름과 암호가 유효 하지만 전자 메일 주소가 잘못 된 경우에는이 카운터가 증가 하지 않습니다.Since our custom authentication logic calls the ValidateUser method, an incorrect password for a valid username will increment the invalid login attempt counter, but this counter is not incremented in the case where the username and password are valid, but the email address is incorrect. 이 동작은 해커가 사용자 이름과 암호를 알고 있지만 무차별 암호 대입 기술을 사용 하 여 사용자의 이메일 주소를 확인 해야 하기 때문에 적합 합니다.Chances are, this behavior is suitable, since it's unlikely that a hacker will know the username and password, but have to use brute force techniques to determine the user's email address.

4 단계: 로그인 컨트롤의 잘못 된 자격 증명 메시지 개선Step 4: Improving the Login Control's Invalid Credentials Message

사용자가 잘못 된 자격 증명을 사용 하 여 로그온을 시도 하는 경우 로그인 컨트롤은 로그인 시도가 실패 했음을 설명 하는 메시지를 표시 합니다.When a user attempts to log on with invalid credentials, the Login control displays a message explaining that the login attempt was unsuccessful. 특히 사용자의 로그인 시도에 대 한 기본값을 포함 하는 FailureText 속성으로 지정 된 메시지를 컨트롤에 표시 합니다.In particular, the control displays the message specified by its FailureText property, which has a default value of Your login attempt was not successful. 다시 시도하세요.Please try again.

사용자의 자격 증명이 유효 하지 않은 이유는 여러 가지가 있습니다.Recall that there are many reasons why a user's credentials may be invalid:

  • 사용자 이름이 없을 수 있습니다.The username may not exist
  • 사용자 이름이 있지만 암호가 잘못 되었습니다.The username exists, but the password is invalid
  • 사용자 이름 및 암호가 올바르지만 사용자가 아직 승인 되지 않은 경우The username and password are valid, but the user is not yet approved
  • 사용자 이름 및 암호가 올바르지만 사용자가 잠겨 있습니다 (지정 된 시간 프레임 내에 잘못 된 로그인 시도 횟수를 초과 했기 때문일 수 있음).The username and password are valid, but the user is locked out (most likely because they exceeded the number of invalid login attempts within the specified time frame)

사용자 지정 인증 논리를 사용 하는 경우 다른 이유가 있을 수 있습니다.And there may be other reasons when using custom authentication logic. 예를 들어 3 단계에서 작성 한 코드를 사용 하는 경우 사용자 이름 및 암호는 유효 하지만 전자 메일 주소가 올바르지 않을 수 있습니다.For example, with the code we wrote in Step 3, the username and password may be valid, but the email address may be incorrect.

자격 증명이 유효 하지 않은 이유에 관계 없이 로그인 컨트롤은 같은 오류 메시지를 표시 합니다.Regardless of why the credentials are invalid, the Login control displays the same error message. 이러한 피드백이 아직 승인 되지 않았거나 잠긴 사용자의 경우 혼란 스 러 울 수 있습니다. 그러나 약간의 작업을 통해 로그인 컨트롤이 더 적절 한 메시지를 표시 하도록 할 수 있습니다.This lack of feedback can be confusing for a user whose account has not yet been approved or who has been locked out. With a little bit of work, though, we can have the Login control display a more appropriate message.

사용자가 잘못 된 자격 증명으로 로그인을 시도할 때마다 로그인 컨트롤이 해당 이벤트를 발생 시킵니다 LoginError .Whenever a user attempts to login with invalid credentials the Login control raises its LoginError event. 계속 해 서이 이벤트에 대 한 이벤트 처리기를 만들고 다음 코드를 추가 합니다.Go ahead and create an event handler for this event, and add the following code:

protected void myLogin_LoginError(object sender, EventArgs e)
{
    // Determine why the user could not login...
    myLogin.FailureText = "Your login attempt was not successful. Please try again.";

    // Does there exist a User account for this user?
    MembershipUser usrInfo = Membership.GetUser(myLogin.UserName);
    if (usrInfo != null)
    {
        // Is this user locked out?
        if (usrInfo.IsLockedOut)
        {
            myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked.";
        }
        else if (!usrInfo.IsApproved)
        {
            myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account.";
        }
    }
}

위의 코드는 로그인 컨트롤의 속성을 기본값으로 설정 하 여 시작 됩니다 FailureText (로그인 시도가 실패 했습니다.The above code starts by setting the Login control's FailureText property to the default value ( Your login attempt was not successful. 다시 시도 하세요.)Please try again ). 그런 다음 제공 된 사용자 이름이 기존 사용자 계정에 매핑되는지 여부를 확인 합니다.It then checks to see if the username supplied maps to an existing user account. 그럴 경우 결과 MembershipUser 개체의 IsLockedOutIsApproved 속성을 확인 하 여 계정이 잠겨 있거나 아직 승인 되지 않은 경우를 확인 합니다.If so, it consults the resulting MembershipUser object's IsLockedOut and IsApproved properties to determine if the account has been locked out or has not yet been approved. 두 경우 모두 속성은 FailureText 해당 값으로 업데이트 됩니다.In either case, the FailureText property is updated to a corresponding value.

이 코드를 테스트 하려면 의도적으로 기존 사용자로 로그인을 시도 하지만 잘못 된 암호를 사용 합니다.To test this code, purposefully attempt to log in as an existing user, but use an incorrect password. 10 분의 시간 프레임 내에 행에서이 작업을 5 번 수행 하면 계정이 잠깁니다. 그림 11에 표시 된 것 처럼 후속 로그인 시도는 항상 올바른 암호를 사용 하 여 실패 하지만 로그인 시도가 너무 많기 때문에 계정이 잠긴 것으로 표시 됩니다.Do this five times in a row within a 10 minute time frame and the account will be locked out. As Figure 11 shows, subsequent login attempts will always fail (even with the correct password), but will now display the more descriptive Your account has been locked out because of too many invalid login attempts. 관리자에 게 문의 하 여 계정 잠금이 해제 된 메시지를 확인 하세요.Please contact the administrator to have your account unlocked message.

잘못 된 로그인 시도를 너무 많이 수행 하 여 잠 궜 습니다.Tito Performed Too Many Invalid Login Attempts and Has Been Locked Out

그림 11: 잘못 된 로그인 시도를 너무 많이 수행 하 여 잠금 (전체 크기 이미지를 보려면 클릭)Figure 11: Tito Performed Too Many Invalid Login Attempts and Has Been Locked Out (Click to view full-size image)

요약Summary

이 자습서 이전에는 로그인 페이지에서 하드 코드 된 사용자 이름/암호 쌍 목록에 대해 제공 된 자격 증명의 유효성을 검사 했습니다.Prior this tutorial, our login page validated the supplied credentials against a hard-coded list of username/password pairs. 이 자습서에서는 멤버 자격 프레임 워크에 대 한 자격 증명의 유효성을 검사 하도록 페이지를 업데이트 했습니다.In this tutorial, we updated the page to validate credentials against the Membership framework. 1 단계에서는 Membership.ValidateUser 메서드를 프로그래밍 방식으로 사용 하는 방법을 살펴보았습니다.In Step 1 we looked at using the Membership.ValidateUser method programmatically. 2 단계에서 수동으로 만든 사용자 인터페이스와 코드를 로그인 컨트롤로 바꿨습니다.In Step 2 we replaced our manually created user interface and code with the Login control.

로그인 컨트롤은 표준 로그인 사용자 인터페이스를 렌더링 하 고 멤버 자격 프레임 워크에 대해 사용자 자격 증명의 유효성을 자동으로 검사 합니다.The Login control renders a standard login user interface and automatically validates the user's credentials against the Membership framework. 또한 유효한 자격 증명이 있는 경우 로그인 컨트롤은 폼 인증을 통해 사용자에 게 서명 합니다.Moreover, in the event of valid credentials, the Login control signs the user in via forms authentication. 간단히 말해서, 로그인 컨트롤을 페이지에 끌어서 추가 선언적 태그나 코드를 추가 하지 않아도 완전 한 기능의 로그인 사용자 환경을 사용할 수 있습니다.In short, a fully functional login user experience is available by simply dragging the Login control onto a page, no extra declarative markup or code necessary. 무엇 보다도 로그인 컨트롤은 사용자 지정이 가능 하므로 렌더링 된 사용자 인터페이스와 인증 논리를 세부적으로 제어할 수 있습니다.What's more, the Login control is highly customizable, allowing for a fine degree of control over both the rendered user interface and authentication logic.

이 시점에서 웹 사이트 방문자는 새 사용자 계정을 만들고 사이트에 로그인 할 수 있지만 인증 된 사용자를 기준으로 페이지에 대 한 액세스를 제한 하는 것을 확인 해야 합니다.At this point visitors to our website can create a new user account and log into the site, but we have yet to look at restricting access to pages based on the authenticated user. 현재 인증 또는 익명의 모든 사용자는 사이트의 모든 페이지를 볼 수 있습니다.Currently, any user, authenticated or anonymous, can view any page on our site. 사용자를 기준으로 사이트 페이지에 대 한 액세스를 제어 하는 것과 함께 해당 기능이 사용자에 따라 달라 지는 특정 페이지가 있을 수 있습니다.Along with controlling access to our site's pages on a user-by-user basis, we might have certain pages whose functionality depends on the user. 다음 자습서에서는 로그인 한 사용자에 따라 액세스 및 페이지 내 기능을 제한 하는 방법을 보여 줍니다.The next tutorial looks at how to limit access and in-page functionality based on the logged in user.

행복 한 프로그래밍Happy Programming!

추가 정보Further Reading

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

저자 정보About the Author

Scott Mitchell는 여러 ASP/ASP. NET books의 작성자와 4GuysFromRolla.com의 창립자가 1998부터 Microsoft 웹 기술을 사용 하 여 작업 했습니다.Scott Mitchell, author of multiple 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. Scott은에서 또는의 블로그를 통해 연결할 수 있습니다 mitchell@4guysfromrolla.com http://ScottOnWriting.NET .Scott can be reached at mitchell@4guysfromrolla.com or via his blog at http://ScottOnWriting.NET.

특별히 감사 합니다.Special Thanks To

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