Share via


사용자 계정 잠금 해제 및 승인(C#)

작성자 : Scott Mitchell

참고

이 문서가 작성된 이후 ASP.NET 멤버 자격 공급자는 ASP.NET ID로 대체되었습니다. 이 문서를 작성할 때 추천하는 멤버 자격 공급자가 아닌 ASP.NET ID 플랫폼을 사용하도록 앱을 업데이트하는 것이 좋습니다. ASP.NET ID는 를 포함하여 ASP.NET 멤버 자격 시스템에 비해 여러 가지 이점이 있습니다.

  • 성능 향상
  • 향상된 확장성 및 테스트 용이성
  • OAuth, OpenID Connect 및 2단계 인증 지원
  • 클레임 기반 ID 지원
  • ASP.Net Core와의 상호 운용성 향상

이 자습서에서는 관리자가 사용자의 잠긴 상태 및 승인된 상태를 관리할 수 있도록 웹 페이지를 빌드하는 방법을 보여 줍니다. 또한 새 사용자가 이메일 주소를 확인한 후에만 승인하는 방법도 확인할 수 있습니다.

소개

사용자 이름, 암호 및 전자 메일과 함께 각 사용자 계정에는 사용자가 사이트에 로그인할 수 있는지 여부를 결정하는 두 개의 상태 필드(잠김 및 승인됨)가 있습니다. 사용자가 지정된 시간(분) 내에 지정된 횟수만큼 잘못된 자격 증명을 제공하면 자동으로 잠깁니다(기본 설정은 10분 이내에 5번의 잘못된 로그인 시도 후 사용자를 잠급니다). 승인된 상태 새 사용자가 사이트에 로그온하기 전에 일부 작업이 수행되어야 하는 시나리오에서 유용합니다. 예를 들어 사용자는 로그인하기 전에 먼저 전자 메일 주소를 확인하거나 관리자의 승인을 받아야 할 수 있습니다.

잠겨 있거나 승인되지 않은 사용자는 로그인할 수 없으므로 이러한 상태를 다시 설정할 수 있는 방법을 궁금해하는 것은 당연한 일입니다. ASP.NET 사용자의 잠긴 상태 및 승인된 상태를 관리하기 위한 기본 제공 기능 또는 웹 컨트롤을 포함하지 않습니다. 이러한 결정은 사이트별로 처리되어야 하기 때문입니다. 일부 사이트에서는 모든 새 사용자 계정(기본 동작)을 자동으로 승인할 수 있습니다. 다른 사용자는 관리자가 새 계정을 승인하거나 사용자가 등록할 때 제공된 이메일 주소로 전송된 링크를 방문할 때까지 사용자를 승인하지 않습니다. 마찬가지로 관리자가 상태 재설정할 때까지 일부 사이트에서는 사용자를 잠글 수 있으며, 다른 사이트는 계정 잠금을 해제하기 위해 방문할 수 있는 URL을 사용하여 잠긴 사용자에게 이메일을 보냅니다.

이 자습서에서는 관리자가 사용자의 잠긴 상태 및 승인된 상태를 관리할 수 있도록 웹 페이지를 빌드하는 방법을 보여 줍니다. 또한 새 사용자가 이메일 주소를 확인한 후에만 승인하는 방법도 확인할 수 있습니다.

1단계: 사용자의 잠긴 상태 및 승인된 상태 관리

여러 자습서에서 하나의 사용자 계정을 선택하기 위한 인터페이스 빌드 자습서에서는 필터링된 페이징된 GridView에 각 사용자 계정을 나열하는 페이지를 생성했습니다. 표에는 각 사용자의 이름과 이메일, 승인 및 잠긴 상태, 현재 온라인 상태인지 여부, 사용자에 대한 메모가 나열됩니다. 사용자의 승인 및 잠긴 상태를 관리하기 위해 이 그리드를 편집할 수 있도록 할 수 있습니다. 사용자의 승인된 상태 변경하려면 관리자가 먼저 사용자 계정을 찾은 다음 해당 GridView 행을 편집하여 승인된 확인란을 선택하거나 선택 취소합니다. 또는 별도의 ASP.NET 페이지를 통해 승인되고 잠긴 상태를 관리할 수 있습니다.

이 자습서에서는 및 UserInformation.aspx의 두 ASP.NET 페이지를 ManageUsers.aspx 사용하겠습니다. 여기서는 관리자가 ManageUsers.aspx 특정 사용자에 대해 승인되고 잠긴 상태를 관리할 수 있도록 하면서 UserInformation.aspx 시스템의 사용자 계정을 나열하는 것이 좋습니다. 첫 번째 비즈니스 순서는 링크 열로 렌더링되는 HyperLinkField를 포함하도록 GridView ManageUsers.aspx 를 확대하는 것입니다. 각 링크가 를 가리키 UserInformation.aspx?user=UserName도록 합니다. 여기서 UserName 은 편집할 사용자의 이름입니다.

참고

암호 복구 및 변경 자습서의 코드를 다운로드한 경우 페이지에 이미 "관리" 링크 집합이 ManageUsers.aspx 포함되어 있고 UserInformation.aspx 페이지에서 선택한 사용자의 암호를 변경하기 위한 인터페이스를 제공하는 것을 확인할 수 있습니다. 멤버 자격 API를 우회하고 SQL Server 데이터베이스와 직접 작동하여 사용자의 암호를 변경하여 작동했기 때문에 이 자습서와 연결된 코드에서 해당 기능을 복제하지 않기로 결정했습니다. 이 자습서는 페이지를 사용하여 처음부터 시작합니다 UserInformation.aspx .

ManageUsers.aspx 페이지를 열고 GridView에 HyperLinkField를 UserAccounts 추가합니다. HyperLinkField의 Text 속성을 "관리"로 설정하고 해당 DataNavigateUrlFieldsDataNavigateUrlFormatString 속성을 UserName 각각 및 "UserInformation.aspx?user="로{0} 설정합니다. 이러한 설정은 모든 하이퍼링크가 "관리" 텍스트를 표시하지만 각 링크가 적절한 UserName 값을 querystring에 전달되도록 HyperLinkField를 구성합니다.

GridView에 HyperLinkField를 추가한 후 잠시 시간을 내어 브라우저를 ManageUsers.aspx 통해 페이지를 봅니다. 그림 1에서 볼 수 있듯이 각 GridView 행에는 이제 "관리" 링크가 포함됩니다. Bruce의 "관리" 링크는 를 가리키는 반면 Dave의 "관리" 링크는 를 UserInformation.aspx?user=Dave가리킵니UserInformation.aspx?user=Bruce다.

HyperLinkField는

그림 1: HyperLinkField에서 각 사용자 계정에 대한 "관리" 링크를 추가합니다(전체 크기 이미지를 보려면 클릭).

잠시 후에 페이지에 대한 UserInformation.aspx 사용자 인터페이스와 코드를 만들지만, 먼저 사용자의 잠긴 상태와 승인된 상태를 프로그래밍 방식으로 변경하는 방법에 대해 살펴보겠습니다. 클래스에는 MembershipUser 및 속성이 IsLockedOut 있습니다IsApproved. IsLockedOut 속성은 읽기 전용입니다. 프로그래밍 방식으로 사용자를 잠그는 메커니즘은 없습니다. 사용자의 잠금을 해제하려면 클래스의 UnlockUser 메서드MembershipUser 사용합니다. 속성은 IsApproved 읽을 수 있고 쓸 수 있습니다. 이 속성에 대한 변경 내용을 저장하려면 클래스의 UpdateUser 메서드Membership 호출하여 수정된 MembershipUser 개체를 전달해야 합니다.

속성은 IsApproved 읽기 가능하고 쓰기 가능하기 때문에 CheckBox 컨트롤은 이 속성을 구성하는 데 가장 적합한 사용자 인터페이스 요소일 것입니다. 그러나 관리자가 사용자를 잠글 수 없기 때문에 CheckBox는 IsLockedOut 속성에 대해 작동하지 않으며, 사용자는 잠금을 해제할 수 있습니다. 속성에 IsLockedOut 적합한 사용자 인터페이스는 클릭할 때 사용자 계정의 잠금을 해제하는 단추입니다. 이 단추는 사용자가 잠겨 있는 경우에만 사용하도록 설정해야 합니다.

UserInformation.aspx페이지 만들기

이제 에서 사용자 인터페이스를 구현할 준비가 되었습니다 UserInformation.aspx. 이 페이지를 열고 다음 웹 컨트롤을 추가합니다.

  • 클릭할 때 관리자를 페이지로 반환하는 ManageUsers.aspx HyperLink 컨트롤입니다.
  • 선택한 사용자의 이름을 표시하기 위한 레이블 웹 컨트롤입니다. 이 레이블을 IDUserNameLabel 설정하고 해당 Text 속성을 지웁합니다.
  • 라는 IsApprovedCheckBox 컨트롤입니다. 해당 AutoPostBack 속성을 true로 설정합니다.
  • 사용자의 마지막 잠긴 날짜를 표시하기 위한 레이블 컨트롤입니다. 이 레이블 LastLockedOutDateLabel 의 이름을 지정하고 해당 Text 속성을 지웁합니다.
  • 사용자의 잠금을 해제하기 위한 단추입니다. 이 단추 UnlockUserButton 의 이름을 지정하고 해당 Text 속성을 "사용자 잠금 해제"로 설정합니다.
  • "사용자의 승인된 상태 업데이트되었습니다."와 같은 상태 메시지를 표시하기 위한 레이블 컨트롤입니다. 이 컨트롤StatusMessage의 이름을 로 지정하고 해당 Text 속성을 지우고 속성을 CssClassImportant설정합니다. (은(는 Important ) CSS 클래스는 스타일시트 파일에 정의 Styles.css 되어 있으며, 해당 텍스트를 큰 빨간색 글꼴로 표시합니다.)

이러한 컨트롤을 추가한 후 Visual Studio의 디자인 보기는 그림 2의 스크린샷과 유사하게 표시됩니다.

UserInformation.aspx에 대한 사용자 인터페이스 만들기

그림 2: 에 대한 UserInformation.aspx 사용자 인터페이스 만들기(전체 크기 이미지를 보려면 클릭)

사용자 인터페이스가 완료되면 다음 작업은 선택한 사용자의 정보에 따라 CheckBox 및 기타 컨트롤을 설정하는 IsApproved 것입니다. 페이지의 Load 이벤트에 대한 이벤트 처리기를 만들고 다음 코드를 추가합니다.

protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
     {

          // If querystring value is missing, send the user to ManageUsers.aspx
          string userName = Request.QueryString["user"];
          if (string.IsNullOrEmpty(userName))
               Response.Redirect("ManageUsers.aspx");

          // Get information about this user
          MembershipUser usr = Membership.GetUser(userName);
          if (usr == null)
               Response.Redirect("ManageUsers.aspx");

          UserNameLabel.Text = usr.UserName;
          IsApproved.Checked = usr.IsApproved;
          if (usr.LastLockoutDate.Year < 2000)

               LastLockoutDateLabel.Text = string.Empty;
          else
               LastLockoutDateLabel.Text = usr.LastLockoutDate.ToShortDateString();

          UnlockUserButton.Enabled = usr.IsLockedOut;
     }
}

위의 코드는 이 페이지가 후속 포스트백이 아닌 첫 번째 페이지 방문인지 확인하는 것으로 시작합니다. 그런 다음 querystring 필드를 통해 user 전달된 사용자 이름을 읽고 메서드를 통해 Membership.GetUser(username) 해당 사용자 계정에 대한 정보를 검색합니다. querystring을 통해 사용자 이름을 제공하지 않았거나 지정된 사용자를 찾을 수 없는 경우 관리자는 페이지로 ManageUsers.aspx 다시 전송됩니다.

MembershipUser 그런 다음 개체의 UserName 값이 에 UserNameLabel 표시되고 IsApproved 속성 값에 따라 CheckBox가 IsApproved 선택됩니다.

개체의 LastLockoutDate 속성MembershipUser 사용자가 마지막으로 잠겼을 때를 나타내는 값을 반환 DateTime 합니다. 사용자가 잠근 적이 없는 경우 반환되는 값은 멤버 자격 공급자에 따라 달라집니다. 새 계정을 만들 때 는 SqlMembershipProvider 테이블의 LastLockoutDate 필드를 로 설정합니다.aspnet_Membership1754-01-01 12:00:00 AM 위의 코드는 속성이 2000년 이전에 발생하는 경우 LastLockoutDateLastLockoutDateLabel 빈 문자열을 표시하고, 그렇지 않으면 속성의 LastLockoutDate 날짜 부분이 Label에 표시됩니다. UnlockUserButton'Enabled 속성은 사용자의 잠긴 상태 설정됩니다. 즉, 이 단추는 사용자가 잠겨 있는 경우에만 사용하도록 설정됩니다.

잠시 시간을 내어 브라우저를 UserInformation.aspx 통해 페이지를 테스트합니다. 물론 에서 시작하여 ManageUsers.aspx 관리할 사용자 계정을 선택해야 합니다. 에 UserInformation.aspxIsApproved 도착하면 사용자가 승인된 경우에만 CheckBox가 선택됩니다. 사용자가 잠근 경우 마지막으로 잠긴 날짜가 표시됩니다. 사용자 잠금 해제 단추는 사용자가 현재 잠겨 있는 경우에만 사용하도록 설정됩니다. CheckBox를 선택하거나 선택 IsApproved 취소하거나 사용자 잠금 해제 단추를 클릭하면 포스트백이 발생하지만 이러한 이벤트에 대한 이벤트 처리기를 아직 만들지 않았기 때문에 사용자 계정을 수정하지 않습니다.

Visual Studio로 돌아가 CheckBox의 CheckedChanged 이벤트 및 UnlockUser Button Click 이벤트에 대한 IsApproved 이벤트 처리기를 만듭니다. CheckedChanged 이벤트 처리기에서 사용자의 속성을 CheckBox의 IsApproved 속성으로 Checked 설정한 다음 에 대한 호출Membership.UpdateUser을 통해 변경 내용을 저장합니다. 이벤트 처리기 Click 에서 개체의 UnlockUser 메서드를 MembershipUser 호출하기만 하면됩니다. 두 이벤트 처리기에서 레이블에 StatusMessage 적합한 메시지를 표시합니다.

protected void IsApproved_CheckedChanged(object sender, EventArgs e)
{
     // Toggle the user's approved status
     string userName = Request.QueryString["user"];
     MembershipUser usr = Membership.GetUser(userName);
     usr.IsApproved = IsApproved.Checked;
     Membership.UpdateUser(usr);
     StatusMessage.Text = "The user's approved status has been updated.";
}

protected void UnlockUserButton_Click(object sender, EventArgs e)
{
     // Unlock the user account
     string userName = Request.QueryString["user"];
     MembershipUser usr = Membership.GetUser(userName);

     usr.UnlockUser();
     UnlockUserButton.Enabled = false;
     StatusMessage.Text = "The user account has been unlocked.";
}

UserInformation.aspx페이지 테스트

이러한 이벤트 처리기가 준비되면 페이지를 다시 방문하고 사용자를 승인하지 않습니다. 그림 3에서 볼 수 있듯이 사용자의 IsApproved 속성이 성공적으로 수정되었음을 나타내는 간단한 메시지가 페이지에 표시됩니다.

Chris가 승인되지 않았습니다.

그림 3: Chris가 승인되지 않음(전체 크기 이미지를 보려면 클릭)

다음으로, 로그아웃하고 계정이 승인되지 않은 사용자로 로그인하려고 합니다. 사용자가 승인되지 않았기 때문에 로그인할 수 없습니다. 기본적으로 로그인 컨트롤은 사용자가 로그인할 수 없는 경우 이유와 관계없이 동일한 메시지를 표시합니다. 그러나 멤버 자격 사용자 저장소에 대한 사용자 자격 증명 유효성 검사 자습서에서는 더 적절한 메시지를 표시하도록 로그인 컨트롤을 향상시키는 방법을 살펴보았습니다. 그림 4에서 알 수 있듯이 Chris는 계정이 아직 승인되지 않았기 때문에 로그인할 수 없다는 메시지를 표시합니다.

Chris는 계정이 승인되지 않아 로그인할 수 없습니다.

그림 4: 계정이 승인되지 않아 Chris가 로그인할 수 없음(전체 크기 이미지를 보려면 클릭)

잠긴 기능을 테스트하려면 승인된 사용자로 로그인을 시도하지만 잘못된 암호를 사용합니다. 사용자의 계정이 잠기기 전까지 필요한 횟수만큼 이 프로세스를 반복합니다. 잠긴 계정에서 로그인을 시도하는 경우 사용자 지정 메시지를 표시하도록 로그인 컨트롤도 업데이트되었습니다. 로그인 페이지에서 다음 메시지가 표시되면 계정이 잠겼습니다. "잘못된 로그인 시도가 너무 많아 계정이 잠겼습니다. 계정 잠금을 해제하려면 관리자에게 문의하세요."

페이지로 돌아가 ManageUsers.aspx 서 잠긴 사용자의 관리 링크를 클릭합니다. 그림 5에서 볼 수 있듯이 사용자 잠금 해제 단추에 LastLockedOutDateLabel 값을 사용하도록 설정해야 합니다. 사용자 잠금 해제 단추를 클릭하여 사용자 계정의 잠금을 해제합니다. 사용자의 잠금을 해제하면 다시 로그인할 수 있습니다.

데이브는 시스템에서 잠겨있다

그림 5: Dave가 시스템에서 잠겼습니다(전체 크기 이미지를 보려면 클릭).

2단계: 새 사용자의 승인된 상태 지정

승인된 상태 새 사용자가 사이트의 사용자별 기능에 로그인하고 액세스하기 전에 일부 작업을 수행하려는 시나리오에서 유용합니다. 예를 들어 로그인 및 등록 페이지를 제외한 모든 페이지가 인증된 사용자만 액세스할 수 있는 프라이빗 웹 사이트를 실행할 수 있습니다. 그러나 낯선 사람이 웹 사이트에 도달하고 등록 페이지를 찾아 계정을 만들면 어떻게 되나요? 이러한 일이 발생하지 않도록 하려면 등록 페이지를 폴더로 Administration 이동하고 관리자가 각 계정을 수동으로 만들어야 합니다. 또는 관리자가 사용자 계정을 승인할 때까지 누구나 등록할 수 있지만 사이트 액세스를 금지할 수 있습니다.

기본적으로 CreateUserWizard 컨트롤은 새 계정을 승인합니다. 컨트롤의 DisableCreatedUser 속성을 사용하여 이 동작을 구성할 수 있습니다. 새 사용자 계정을 승인하지 않도록 이 속성을 true 로 설정합니다.

참고

기본적으로 CreateUserWizard 컨트롤은 새 사용자 계정에 자동으로 로그합니다. 이 동작은 컨트롤의 LoginCreatedUser 속성에 의해 결정됩니다. 승인되지 않은 사용자는 사이트에 DisableCreatedUser 로그인할 수 없으므로 이 true 면 속성 값 LoginCreatedUser 에 관계없이 새 사용자 계정이 사이트에 로그인되지 않습니다.

메서드를 통해 Membership.CreateUser 프로그래밍 방식으로 새 사용자 계정을 만드는 경우 승인되지 않은 사용자 계정을 만들려면 새 사용자의 IsApproved 속성 값을 입력 매개 변수로 허용하는 오버로드 중 하나를 사용합니다.

3단계: Email 주소를 확인하여 사용자 승인

사용자 계정을 지원하는 많은 웹 사이트는 등록 시 제공한 이메일 주소를 확인할 때까지 새 사용자를 승인하지 않습니다. 이 확인 프로세스는 일반적으로 고유하고 검증된 이메일 주소가 필요하고 등록 프로세스에 추가 단계를 추가하므로 봇, 스팸 및 기타 ne'er-do-wells를 저지하는 데 사용됩니다. 이 모델을 사용하면 새 사용자가 등록하면 확인 페이지에 대한 링크가 포함된 전자 메일 메시지가 전송됩니다. 링크를 방문하여 사용자가 전자 메일을 수신했음을 입증했으며, 따라서 제공된 이메일 주소가 유효하다는 것을 입증했습니다. 확인 페이지는 사용자를 승인해야 합니다. 이 작업은 자동으로 수행되어 이 페이지에 도달하는 모든 사용자를 승인하거나 사용자가 CAPTCHA와 같은 몇 가지 추가 정보를 제공한 후에만 승인할 수 있습니다.

이 워크플로를 수용하려면 먼저 새 사용자가 승인되지 않도록 계정 만들기 페이지를 업데이트해야 합니다. 폴더에서 EnhancedCreateUserWizard.aspxMembership 페이지를 열고 CreateUserWizard 컨트롤의 DisableCreatedUser 속성을 로 true설정합니다.

다음으로, 계정을 확인하는 방법에 대한 지침과 함께 새 사용자에게 이메일을 보내도록 CreateUserWizard 컨트롤을 구성해야 합니다. 특히, 쿼리 문자열을 통해 새 사용자의 UserId 페이지를 전달하는 링크(아직 만들지 않은 페이지)에 대한 링크를 전자 메일 Verification.aspx 에 포함합니다. 페이지에서 Verification.aspx 지정된 사용자를 조회하고 승인된 사용자를 표시합니다.

새 사용자에게 확인 Email 보내기

CreateUserWizard 컨트롤에서 전자 메일을 보내려면 해당 MailDefinition 속성을 적절하게 구성합니다. 이전 자습서에서 설명한 것처럼 ChangePassword 및 PasswordRecovery 컨트롤에는 CreateUserWizard 컨트롤과 동일한 방식으로 작동하는 속성이 포함 MailDefinition 됩니다.

참고

속성을 사용하려면 에서 MailDefinitionWeb.config메일 배달 옵션을 지정해야 합니다. 자세한 내용은 ASP.NET Email 보내기를 참조하세요.

먼저 폴더에 라는 CreateUserWizard.txt 새 전자 메일 템플릿을 EmailTemplates 만듭니다. 템플릿에 다음 텍스트를 사용합니다.

Hello <%UserName%>! Welcome aboard.

Your new account is almost ready, but before you can login you must first visit:
<%VerificationUrl%>

Once you have visited the verification URL you will be redirected to the login page.

If you have any problems or questions, please reply to this email.

Thanks!

MailDefinition' s BodyFileName 속성을 "~/EmailTemplates/CreateUserWizard.txt"로 설정하고 해당 Subject 속성을 "내 웹 사이트에 오신 것을 환영합니다! 계정을 활성화하세요."

전자 메일 템플릿에는 CreateUserWizard.txt 자리 표시자가 포함되어 <%VerificationUrl%> 있습니다. 페이지의 URL이 Verification.aspx 배치되는 위치입니다. CreateUserWizard는 및 <%Password%> 자리 표시자를 새 계정의 사용자 이름 및 암호로 자동으로 대체 <%UserName%> 하지만 기본 제공 <%VerificationUrl%> 자리 표시자는 없습니다. 수동으로 적절한 확인 URL로 바꿔야 합니다.

이렇게 하려면 CreateUserWizard의 SendingMail 이벤트에 대한 이벤트 처리기를 만들고 다음 코드를 추가합니다.

protected void NewUserWizard_SendingMail(object sender, MailMessageEventArgs e)
{
     // Get the UserId of the just-added user
     MembershipUser newUser = Membership.GetUser(NewUserWizard.UserName);

     Guid newUserId = (Guid)newUser.ProviderUserKey;

     // Determine the full verification URL (i.e., http://yoursite.com/Verification.aspx?ID=...)
     string urlBase = Request.Url.GetLeftPart(UriPartial.Authority) + 
          Request.ApplicationPath;

     string verifyUrl = "/Verification.aspx?ID=" + newUserId.ToString();
     string fullUrl = urlBase + verifyUrl;

     // Replace <%VerificationUrl%> with the appropriate URL and querystring
     e.Message.Body = e.Message.Body.Replace("<%VerificationUrl%>", fullUrl);
}

이벤트 SendingMail 이후에 CreatedUser 이벤트가 발생합니다. 즉, 위의 이벤트 처리기가 실행되면 새 사용자 계정이 이미 생성되었습니다. 메서드를 호출 Membership.GetUser 하고 CreateUserWizard 컨트롤에 UserName 입력된 을 전달하여 새 사용자의 UserId 값에 액세스할 수 있습니다. 다음으로 확인 URL이 형성됩니다. 문 Request.Url.GetLeftPart(UriPartial.Authority) 은 URL의 부분을 반환 http://yourserver.com 하고 Request.ApplicationPath 애플리케이션이 루팅된 경로를 반환합니다. 그런 다음 확인 URL이 로 정의됩니다 Verification.aspx?ID=userId. 그런 다음 이 두 문자열이 연결되어 전체 URL을 형성합니다. 마지막으로 전자 메일 메시지 본문(e.Message.Body)에는 의 모든 항목이 <%VerificationUrl%> 전체 URL로 대체됩니다.

그 결과 새 사용자가 승인되지 않으므로 사이트에 로그인할 수 없습니다. 또한 확인 URL에 대한 링크가 있는 전자 메일이 자동으로 전송됩니다(그림 6 참조).

새 사용자가 확인 URL에 대한 링크가 있는 Email 받습니다.

그림 6: 새 사용자가 확인 URL에 대한 링크가 있는 Email 받습니다(전체 크기 이미지를 보려면 클릭).

참고

CreateUserWizard 컨트롤의 기본 CreateUserWizard 단계는 사용자에게 계정이 생성되었음을 알리는 메시지를 표시하고 계속 단추를 표시합니다. 이 옵션을 클릭하면 사용자가 컨트롤의 ContinueDestinationPageUrl 속성에 지정된 URL로 이동합니다. 의 CreateUserWizard EnhancedCreateUserWizard.aspx 는 새 사용자를 에 보내도록 ~/Membership/AdditionalUserInfo.aspx구성되며, 이 경우 사용자에게 고향, 홈페이지 URL 및 서명을 묻는 메시지가 표시됩니다. 이 정보는 로그온한 사용자만 추가할 수 있으므로 이 속성을 업데이트하여 사용자를 사이트의 홈페이지(~/Default.aspx)로 다시 보내는 것이 좋습니다. 또한 EnhancedCreateUserWizard.aspx 사용자에게 확인 전자 메일이 전송되었음을 알리기 위해 페이지 또는 CreateUserWizard 단계를 보강해야 하며, 이 전자 메일의 지침을 따를 때까지 해당 계정이 활성화되지 않습니다. 나는 독자를위한 연습으로 이러한 수정을 떠난다.

확인 페이지 만들기

마지막 작업은 페이지를 만드는 것입니다 Verification.aspx . 루트 폴더에 이 페이지를 추가하여 master 페이지와 Site.master 연결합니다. 사이트에 추가된 대부분의 이전 콘텐츠 페이지에서 수행한 것처럼 콘텐츠 페이지에서 master 페이지의 기본 콘텐츠를 사용하도록 ContentPlaceHolder를 참조 LoginContent 하는 콘텐츠 컨트롤을 제거합니다.

페이지에 레이블 웹 컨트롤을 Verification.aspx 추가하고, 해당 컨트롤을 IDStatusMessage 설정하고, 텍스트 속성을 지웁다. 다음으로, 이벤트 처리기를 Page_Load 만들고 다음 코드를 추가합니다.

protected void Page_Load(object sender, EventArgs e)
{
     if (string.IsNullOrEmpty(Request.QueryString["ID"]))
          StatusMessage.Text = "The UserId was not included in the querystring...";
     else
     {
          Guid userId;
          try
          {
               userId = new Guid(Request.QueryString["ID"]);
          }

          catch
          {
               StatusMessage.Text = "The UserId passed into the querystring is not in the
                    proper format...";
               return;
          }

          MembershipUser usr = Membership.GetUser(userId);
          if (usr == null)
               StatusMessage.Text = "User account could not be found...";
          else
          {
               // Approve the user
               usr.IsApproved = true;

               Membership.UpdateUser(usr);
               StatusMessage.Text = "Your account has been approved. 
                    Please <a href=\"Login.aspx\">login</a> to the site.";
          }
     }
}

위의 코드의 대부분은 쿼리 문자열을 통해 제공된 가 UserId 있는지, 유효한 Guid 값인지, 기존 사용자 계정을 참조하는지 확인합니다. 이러한 검사를 모두 통과하면 사용자 계정이 승인됩니다. 그렇지 않으면 적절한 상태 메시지가 표시됩니다.

그림 7은 브라우저를 Verification.aspx 통해 방문한 페이지를 보여줍니다.

새 사용자의 계정이 승인됨

그림 7: 새 사용자의 계정이 승인되었습니다(전체 크기 이미지를 보려면 클릭).

요약

모든 멤버 자격 사용자 계정에는 사용자가 사이트에 IsLockedOut 로그인할 수 있는지 여부를 결정하는 두 가지 상태( 및 IsApproved)가 있습니다. 이러한 두 속성은 모두 사용자가 로그인할 수 있어야 합니다 true .

사용자의 잠긴 상태 무차별 암호 대입 방법을 통해 해커가 사이트에 침입할 가능성을 줄이기 위한 보안 조치로 사용됩니다. 특히 특정 기간 내에 특정 수의 잘못된 로그인 시도가 있는 경우 사용자가 잠깁니다. 이러한 범위는 의 멤버 자격 공급자 설정을 통해 구성할 수 있습니다 Web.config.

승인된 상태 일반적으로 일부 작업이 시작될 때까지 새 사용자가 로그인하는 것을 금지하는 수단으로 사용됩니다. 아마도 사이트에서는 관리자가 새 계정을 먼저 승인해야 하거나, 3단계에서 보았듯이 전자 메일 주소를 확인하여 승인해야 할 수 있습니다.

행복한 프로그래밍!

저자 정보

여러 ASP/ASP.NET 책의 저자이자 4GuysFromRolla.com 설립자인 Scott Mitchell은 1998년부터 Microsoft 웹 기술을 사용하고 있습니다. Scott은 독립 컨설턴트, 트레이너 및 작가로 일합니다. 그의 최신 책은 샘스 자신을 가르친다 ASP.NET 2.0 24 시간. Scott은 에서 mitchell@4guysfromrolla.com 또는 에서 자신의 블로그 http://ScottOnWriting.NET를 통해 연락할 수 있습니다.

특별한 감사...

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 예정된 MSDN 문서를 검토하시겠습니까? 그렇다면 에서 줄을 놓습니다. mitchell@4GuysFromRolla.com