다음을 통해 공유


암호 복구 및 변경(C#)

스콧 미첼

참고 항목

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

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

ASP.NET 암호 복구 및 변경을 지원하기 위한 두 개의 웹 컨트롤이 포함되어 있습니다. PasswordRecovery 컨트롤을 사용하면 방문자가 분실한 암호를 복구할 수 있습니다. ChangePassword 컨트롤을 사용하면 사용자가 암호를 업데이트할 수 있습니다. 이 자습서 시리즈 전체에서 살펴본 다른 로그인 관련 웹 컨트롤과 마찬가지로 PasswordRecovery 및 ChangePassword 컨트롤은 멤버 자격 프레임워크와 함께 작동하여 사용자의 암호를 재설정하거나 수정합니다.

소개

은행, 유틸리티 회사, 전화 회사, 전자 메일 계정 및 개인 설정된 웹 포털의 웹 사이트 사이에는 대부분의 사용자와 마찬가지로 기억해야 할 암호가 수십 개 있습니다. 요즘 기억해야 할 자격 증명이 너무 많기 때문에 사람들이 암호를 잊어 버리는 것은 드문 일이 아닙니다. 이를 고려하려면 사용자 계정을 제공하는 웹 사이트에 사용자가 암호를 복구하는 방법을 포함해야 합니다. 이 프로세스는 일반적으로 새로운 임의 암호를 생성하고 파일의 사용자의 전자 메일 주소로 전자 메일을 보냅니다. 새 암호를 받은 후 대부분의 사용자는 사이트로 돌아가 임의로 생성된 암호에서 더 기억에 남는 암호로 변경합니다.

ASP.NET 암호 복구 및 변경을 지원하기 위한 두 개의 웹 컨트롤이 포함되어 있습니다. PasswordRecovery 컨트롤을 사용하면 방문자가 분실한 암호를 복구할 수 있습니다. ChangePassword 컨트롤을 사용하면 사용자가 암호를 업데이트할 수 있습니다. 이 자습서 시리즈 전체에서 살펴본 다른 로그인 관련 웹 컨트롤과 마찬가지로 PasswordRecovery 및 ChangePassword 컨트롤은 멤버 자격 프레임워크와 함께 작동하여 사용자의 암호를 재설정하거나 수정합니다.

이 자습서에서는 이러한 두 컨트롤을 사용하는 것을 살펴봅니다. 또한 클래스 ChangePassword 및 메서드를 통해 사용자의 암호를 프로그래밍 방식으로 변경하고 ResetPassword 재설정하는 MembershipUser 방법도 알아봅니다.

1단계: 사용자가 분실한 암호를 복구할 수 있도록 지원

사용자 계정을 지원하는 모든 웹 사이트는 사용자에게 잊어버린 암호를 복구하기 위한 몇 가지 메커니즘을 제공해야 합니다. 좋은 소식은 ASP.NET 이러한 기능을 구현하는 것은 PasswordRecovery 웹 컨트롤 덕분에 부드러움입니다. PasswordRecovery 컨트롤은 사용자에게 사용자 이름과 필요한 경우 보안 질문에 대한 답변을 묻는 인터페이스를 렌더링합니다. 그런 다음 사용자에게 암호를 전자 메일로 보냅니다.

참고 항목

전자 메일 메시지는 일반 텍스트로 유선으로 전송되므로 전자 메일을 통해 사용자의 암호를 보내는 경우 보안 위험이 있습니다.

PasswordRecovery 컨트롤은 세 가지 보기로 구성됩니다.

  • UserName - 방문자에게 사용자 이름을 묻는 메시지를 표시합니다. 초기 보기입니다.
  • 질문 - 사용자의 사용자 이름 및 보안 질문을 텍스트로 표시하고 사용자가 보안 질문에 대한 답변을 입력할 수 있도록 TextBox를 표시합니다.
  • 성공 - 사용자에게 자신의 암호가 전자 메일로 전송되었음을 알리는 메시지를 표시합니다.

표시되는 보기 및 PasswordRecovery 컨트롤에서 수행하는 작업은 다음 멤버 자격 구성 설정에 따라 달라집니다.

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

멤버 자격 프레임워크의 RequiresQuestionAndAnswer 설정은 사용자가 계정에 등록할 때 보안 질문과 대답을 지정해야 하는지 여부를 나타냅니다. 사용자 계정 만들기 자습서에서 설명한 대로 True(기본값)이면 RequiresQuestionAndAnswer CreateUserWizard의 인터페이스에는 새 사용자의 보안 질문 및 답변에 대한 TextBox 컨트롤이 포함됩니다. False이면 RequiresQuestionAndAnswer 이러한 정보가 수집되지 않습니다. 마찬가지로 True이면 RequiresQuestionAndAnswer 사용자가 사용자 이름을 입력한 후에 PasswordRecovery 컨트롤에 질문 보기가 표시됩니다. 암호는 사용자가 올바른 보안 답변을 입력한 경우에만 복구됩니다. 그러나 False이면 RequiresQuestionAndAnswer PasswordRecovery 컨트롤이 사용자 이름 보기에서 성공 보기로 바로 이동합니다.

사용자가 자신의 사용자 이름 또는 사용자 이름 및 보안 답변을 제공한 후 True인 경우 RequiresQuestionAndAnswer PasswordRecovery는 사용자에게 암호를 전자 메일로 보냅니다. EnablePasswordRetrieval 이 옵션을 True로 설정하면 사용자에게 현재 암호가 전자 메일로 보내집니다. False로 설정되고 EnablePasswordReset True로 설정된 경우 PasswordRecovery 컨트롤은 사용자에 대한 임의의 새 암호를 생성하고 이 새 암호를 메일로 보냅니다. 둘 다 EnablePasswordRetrieval False EnablePasswordReset 이면 PasswordRecovery 컨트롤이 예외를 throw합니다.

참고 항목

사용자의 암호는 SqlMembershipProvider Clear, Hashed(기본값) 또는 Encrypted의 세 가지 형식 중 하나로 저장됩니다. 사용되는 스토리지 메커니즘은 멤버 자격 구성 설정에 따라 달라집니다. 데모 애플리케이션은 해시된 암호 형식을 사용합니다. 해시된 암호 형식 EnablePasswordRetrieval 을 사용하는 경우 시스템에서 데이터베이스에 저장된 해시된 버전에서 사용자의 실제 암호를 확인할 수 없으므로 옵션을 False로 설정해야 합니다.

그림 1에서는 PasswordRecovery의 인터페이스 및 동작이 멤버 자격 구성의 영향을 받는 방법을 보여 줍니다.

RequiresQuestionAndAnswer, EnablePasswordRetrieval 및 EnablePasswordReset이 PasswordRecovery 컨트롤의 모양 및 동작에 영향을 줍니다.

그림 1: EnablePasswordRetrievalRequiresQuestionAndAnswerPasswordRecovery 컨트롤의 모양 및 EnablePasswordReset 동작에 미치는 영향(전체 크기 이미지를 보려면 클릭)

참고 항목

SQL Server에서 멤버 자격 스키마 만들기 자습서에서는 True, False 및 EnablePasswordReset EnablePasswordRetrieval True로 설정 RequiresQuestionAndAnswer 하여 멤버 자격 공급자를 구성했습니다.

PasswordRecovery 컨트롤 사용

ASP.NET 페이지에서 PasswordRecovery 컨트롤 사용을 살펴보겠습니다. 도구 상자에서 디자이너 ID RecoverPwd로 PasswordRecovery 컨트롤을 열고 RecoverPassword.aspx 끌어서 놓습니다. 로그인 및 CreateUserWizard 웹 컨트롤과 마찬가지로 PasswordRecovery 컨트롤의 보기는 레이블, TextBoxes, 단추 및 유효성 검사 컨트롤을 포함하는 풍부한 복합 인터페이스를 렌더링합니다. 컨트롤의 스타일 속성을 통해 또는 보기를 템플릿으로 변환하여 보기의 모양을 사용자 지정할 수 있습니다. 나는 관심있는 독자를위한 운동으로 이것을 둡니다.

사용자가 이 페이지를 방문하면 사용자 이름을 입력하고 제출 단추를 클릭합니다. 멤버 자격 구성 설정에서 속성을 True로 설정 RequiresQuestionAndAnswer 했으므로 PasswordRecovery 컨트롤에 질문 보기가 표시됩니다. 사용자가 올바른 보안 답변을 입력하고 제출을 클릭하면 PasswordRecovery 컨트롤이 사용자의 암호를 임의로 생성된 암호로 업데이트하고 이 암호를 파일의 전자 메일 주소로 전자 메일로 보냅니다. 한 줄의 코드를 작성할 필요 없이 이 모든 것이 가능했습니다.

이 페이지를 테스트하기 전에 다음과 같은 구성의 마지막 부분이 있습니다. 여기서는 메일 배달 설정을 Web.config지정해야 합니다. PasswordRecovery 컨트롤은 전자 메일을 보내기 위해 이러한 설정을 사용합니다.

메일 배달 구성은 요소<mailSettings> 요소를 통해 <system.net> 지정됩니다. <smtp> 요소를 사용하여 배달 방법 및 기본 보낸 사람 주소를 나타냅니다. 다음 태그는 포트 25에 명명된 smtp.example.com 네트워크 SMTP 서버와 사용자 이름 및 암호의 사용자 이름/암호 자격 증명을 사용하도록 메일 설정을 구성합니다.

참고 항목

<system.net> 는 루트 <configuration> 요소의 자식 요소 및 의 형제 <system.web>입니다. 따라서 요소 내에 <system.web> 요소를 배치 <system.net> 하지 말고 동일한 수준에 배치합니다.

네트워크에서 SMTP 서버를 사용하는 것 외에도 전송할 전자 메일 메시지를 보관해야 하는 픽업 디렉터리를 지정할 수도 있습니다.

SMTP 설정을 구성한 후에는 브라우저를 RecoverPassword.aspx 통해 페이지를 방문합니다. 먼저 사용자 저장소에 없는 사용자 이름을 입력해 봅니다. 그림 2와 같이 PasswordRecovery 컨트롤은 사용자 정보에 액세스할 수 없음을 나타내는 메시지를 표시합니다. 컨트롤의 속성을 통해 UserNameFailureText 메시지 텍스트를 사용자 지정할 수 있습니다.

잘못된 사용자 이름을 입력하면 오류 메시지가 표시됩니다.

그림 2: 잘못된 사용자 이름을 입력하면 오류 메시지가 표시됩니다(전체 크기 이미지를 보려면 클릭).

이제 사용자 이름을 입력합니다. 액세스할 수 있는 전자 메일 주소와 사용자가 알고 있는 보안 답변이 포함된 시스템 내 계정의 사용자 이름을 사용합니다. 사용자 이름을 입력하고 제출을 클릭하면 PasswordRecovery 컨트롤에 질문 보기가 표시됩니다. 사용자 이름 보기와 마찬가지로 잘못된 대답을 입력하면 PasswordRecovery 컨트롤에 오류 메시지가 표시됩니다(그림 3 참조). 이 QuestionFailureText 오류 메시지를 사용자 지정하려면 이 속성을 사용합니다.

사용자가 잘못된 보안 답변을 입력하면 오류 메시지가 표시됩니다.

그림 3: 사용자가 잘못된 보안 답변을 입력하면 오류 메시지가 표시됩니다(전체 크기 이미지를 보려면 클릭).

마지막으로 올바른 보안 답변을 입력하고 제출을 클릭합니다. 백그라운드에서 PasswordRecovery 컨트롤은 임의의 암호를 생성하고, 사용자 계정에 할당하고, 사용자에게 새 암호를 알리는 전자 메일을 보내고(그림 4 참조) 성공 보기를 표시합니다.

사용자가 새 암호를 사용하여 전자 메일을 보냅니다.

그림 4: 사용자가 새 암호를 사용하여 전자 메일을 보냈습니다(전체 크기 이미지를 보려면 클릭).

전자 메일 사용자 지정

PasswordRecovery 컨트롤에서 보낸 기본 전자 메일은 다소 둔합니다(그림 4 참조). 메시지는 주체 암호 및 일반 텍스트 본문을 사용하여 요소의 from 특성에 지정된 <smtp> 계정에서 전송됩니다.

사이트로 돌아가서 다음 정보를 사용하여 로그인하세요.

사용자 이름: 사용자 이름

암호: 암호

이 메시지는 PasswordRecovery 컨트롤의 SendingMail이벤트에 대한 이벤트 처리기를 통해 프로그래밍 방식으로 사용자 지정하거나 속성을 통해 MailDefinition 선언적으로 사용자 지정할 수 있습니다. 이 두 옵션을 모두 살펴보겠습니다.

SendingMail 이벤트는 전자 메일 메시지를 보내기 직전에 발생하며 프로그래밍 방식으로 전자 메일 메시지를 조정할 수 있는 마지막 기회입니다. 이 이벤트가 발생하면 이벤트 처리기는 전송될 전자 메일에 대한 참조를 Message 포함하는 형식MailMessageEventArgs의 개체를 전달합니다.

이벤트에 대한 SendingMail 이벤트 처리기를 만들고 프로그래밍 방식으로 CC 목록에 추가하는 다음 코드를 추가합니다 webmaster@example.com .

protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

선언적 수단을 통해 전자 메일 메시지를 구성할 수도 있습니다. PasswordRecovery의 MailDefinition 속성은 형식 MailDefinition의 개체입니다. 클래스는 MailDefinition ,, IsBodyHtmlBodyFileNameCCSubjectPriority, 등 전자 메일 관련 속성From의 호스트를 제공합니다. 우선 기본값(암호)보다 더 자세한 설명으로 속성을 설정합니다Subject(예: 암호가 다시 설정됨).

전자 메일 메시지의 본문을 사용자 지정하려면 본문의 내용이 포함된 별도의 전자 메일 템플릿 파일을 만들어야 합니다. 먼저 웹 사이트에 새 폴더를 만듭니다 EmailTemplates. 다음으로 이 폴더 PasswordRecovery.txt 에 새 텍스트 파일을 추가하고 다음 콘텐츠를 추가합니다.

Your password has been reset, <%UserName%>!

According to our records, you have requested that your password be reset. Your new
password is: <%Password%>

If you have any questions or trouble logging on please contact a site administrator.

Thank you!

자리 표시자 <%UserName%><%Password%>. PasswordRecovery 컨트롤은 전자 메일을 보내기 전에 이러한 두 자리 표시자를 사용자의 사용자 이름과 복구된 암호로 자동으로 바꿉니다.

마지막으로, '의 BodyFileName 속성을 방금 만든 전자 메일 템플릿(~/EmailTemplates/PasswordRecovery.txt)을 가리킵니MailDefinition다.

이러한 변경 내용을 적용한 RecoverPassword.aspx 후 페이지를 다시 방문하고 사용자 이름 및 보안 답변을 입력합니다. 그림 5의 전자 메일과 같은 전자 메일이 수신됩니다. webmaster@example.com CC가 업데이트되었으며 주체와 본문이 업데이트되었습니다.

제목, 본문 및 CC 목록이 업데이트되었습니다.

그림 5: 제목, 본문 및 CC 목록이 업데이트되었습니다(전체 크기 이미지를 보려면 클릭).

HTML 형식 전자 메일 집합 IsBodyHtml 을 True(기본값은 False)로 보내고 HTML을 포함하도록 전자 메일 템플릿을 업데이트합니다.

MailDefinition 속성은 PasswordRecovery 클래스에 고유하지 않습니다. 2단계에서 볼 수 있듯이 ChangePassword 컨트롤도 속성을 제공합니다 MailDefinition . 또한 CreateUserWizard 컨트롤에는 새 사용자에게 환영 전자 메일 메시지를 자동으로 보내도록 구성할 수 있는 속성이 포함되어 있습니다.

참고 항목

현재 왼쪽 탐색 창에는 페이지에 도달하기 위한 링크가 RecoverPassword.aspx 없습니다. 사용자가 사이트에 성공적으로 로그온할 수 없는 경우에만 이 페이지를 방문하려고 합니다. 따라서 페이지에 대한 Login.aspx 링크를 포함하도록 페이지를 업데이트합니다 RecoverPassword.aspx .

프로그래밍 방식으로 사용자의 암호 다시 설정

사용자의 암호를 재설정할 때 PasswordRecovery 컨트롤은 개체의 ResetPassword 메서드MembershipUser 호출합니다. 이 메서드에는 두 개의 오버로드가 있습니다.

  • ResetPassword - 사용자의 암호를 다시 설정합니다. False인 경우 RequiresQuestionAndAnswer 이 오버로드를 사용합니다.
  • ResetPassword(securityAnswer) - 제공된 securityAnswer 가 올바른 경우에만 사용자의 암호를 다시 설정합니다. True인 경우 RequiresQuestionAndAnswer 이 오버로드를 사용합니다.

두 오버로드 모두 임의로 생성된 새 암호를 반환합니다.

멤버 자격 프레임워크의 다른 메서드와 마찬가지로 메서드는 ResetPassword 구성된 공급자에 위임합니다. 저장 SqlMembershipProvider 프로시저를 aspnet_Membership_ResetPassword 호출하여 사용자의 사용자 이름, 새 암호 및 제공된 암호 답변을 다른 필드 중에서 전달합니다. 저장 프로시저는 암호 응답이 일치하는지 확인하고 사용자의 암호를 업데이트합니다.

몇 가지 하위 수준 구현 정보:

  • 잠긴 사용자는 암호를 재설정할 수 없습니다. 그러나 승인되지 않은 사용자는 승인되지 않은 사용자일 수 있습니다. 사용자 계정 잠금 해제 및 승인 자습서에서 잠긴 상태와 승인된 상태에 대해 자세히 설명합니다.
  • 암호 대답이 올바르지 않으면 사용자의 실패한 암호 응답 시도 횟수가 증가합니다. 지정된 기간 내에 지정된 수의 잘못된 보안 응답 시도가 발생하면 사용자가 잠깁니다.

임의 암호 생성 방법에 대한 Word

그림 4와 5의 전자 메일 메시지에 표시된 임의로 생성된 암호는 멤버 자격 클래스의 GeneratePassword 메서드에 의해 생성됩니다. 이 메서드는 길이numberOfNonAlphanumericCharacters라는 두 개의 정수 입력 매개 변수를 허용하고 적어도 numberOfNonAlphanumericCharacters 수의 영숫자가 아닌 문자 수로 길이가 긴 문자열 을 반환합니다. 멤버 자격 클래스 또는 로그인 관련 웹 컨트롤 내에서이 메서드를 호출 하는 경우 이러한 두 매개 변수에 대 한 값 멤버 자격 구성 MinRequiredPasswordLengthMinRequiredNonalphanumericCharacters 속성에 의해 결정 됩니다 7 및 1로 각각 설정 합니다.

이 메서드는 GeneratePassword 암호화된 강력한 난수 생성기를 사용하여 선택된 임의 문자에 편향이 없도록 합니다. 또한 GeneratePassword public임의 문자열 또는 암호를 생성해야 하는 경우 ASP.NET 애플리케이션에서 직접 사용할 수 있습니다.

참고 항목

클래스는 SqlMembershipProvider 항상 최소 14자 이상의 임의 암호를 생성하므로 14보다 작으면 MinRequiredPasswordLength 해당 값이 무시됩니다.

2단계: 암호 변경

임의로 생성된 암호는 기억하기 어렵습니다. 그림 4 WWGUZv(f2yM:Bd에 표시된 암호를 고려합니다. 메모리에 커밋해 보세요! 말할 필요도 없이, 사용자가 이러한 종류의 임의로 생성 된 암호를 보낸 후, 그녀는 더 기억에 남는 무언가로 암호를 변경 하려는 거 야.

ChangePassword 컨트롤을 사용하여 사용자가 암호를 변경할 수 있는 인터페이스를 만듭니다. PasswordRecovery 컨트롤과 마찬가지로 ChangePassword 컨트롤은 암호 변경과 성공이라는 두 가지 보기로 구성됩니다. 암호 변경 보기는 사용자에게 이전 암호와 새 암호를 묻는 메시지를 표시합니다. 올바른 이전 암호와 최소 길이 및 영숫자가 아닌 문자 요구 사항을 충족하는 새 암호를 제공하면 ChangePassword 컨트롤은 사용자의 암호를 업데이트하고 성공 보기를 표시합니다.

참고 항목

ChangePassword 컨트롤은 개체 ChangePassword 의 메서드를 호출하여 사용자의 암호를 수정합니다MembershipUser. ChangePassword 메서드는 oldPassword와 newPassword라는 두 개의 string 입력 매개 변수를 허용하고 제공된 oldPassword가 올바르다고 가정하여 사용자의 계정을 newPassword업데이트합니다.

ChangePassword.aspx 페이지를 열고 페이지에 ChangePassword 컨트롤을 추가하여 이름을 지정합니다ChangePwd. 이때 디자인 보기에 암호 변경 보기가 표시됩니다(그림 6 참조). PasswordRecovery 컨트롤과 마찬가지로 컨트롤의 스마트 태그를 통해 보기 간에 전환할 수 있습니다. 또한 이러한 보기의 모양은 다양한 스타일 속성을 통해 또는 템플릿으로 변환하여 사용자 지정할 수 있습니다.

페이지에 ChangePassword 컨트롤 추가

그림 6: 페이지에 ChangePassword 컨트롤 추가(전체 크기 이미지를 보려면 클릭)

ChangePassword 컨트롤은 현재 로그인한 사용자의 암호 또는 지정된 다른 사용자의 암호를 업데이트할 수 있습니다. 그림 6에서 볼 수 있듯이 기본 암호 변경 보기는 세 개의 TextBox 컨트롤을 렌더링합니다. 하나는 이전 암호용이고 다른 하나는 새 암호용입니다. 이 기본 인터페이스는 현재 로그온한 사용자의 암호를 업데이트하는 데 사용됩니다.

ChangePassword 컨트롤을 사용하여 다른 사용자의 암호를 업데이트하려면 컨트롤의 DisplayUserName 속성을 True로 설정합니다. 이렇게 하면 페이지에 네 번째 TextBox가 추가되어 암호가 변경되는 사용자의 사용자 이름을 묻는 메시지가 표시됩니다.

True로 설정 DisplayUserName 하면 로그인하지 않고도 로그아웃한 사용자가 암호를 변경할 수 있게 하려는 경우에 유용합니다. 개인적으로, 나는 그녀의 암호를 변경하도록 허용하기 전에 사용자가 로그인하도록 요구하는 데 아무런 문제가 없다고 생각합니다. 따라서 False(기본값)로 설정된 상태로 둡니다 DisplayUserName . 그러나 이 결정을 내릴 때 익명 사용자가 이 페이지에 도달하는 것을 기본적으로 금지하고 있습니다. 익명 사용자의 방문을 거부하도록 사이트의 URL 권한 부여 규칙을 업데이트합니다 ChangePassword.aspx. URL 권한 부여 규칙 구문에서 메모리를 새로 고쳐야 하는 경우 사용자 기반 권한 부여 자습서를 다시 참조하세요.

참고 항목

이 속성은 관리자가 DisplayUserName 다른 사용자의 암호를 변경할 수 있도록 하는 데 유용할 수 있습니다. 그러나 True로 설정된 경우에도 DisplayUserName 올바른 이전 암호를 알고 입력해야 합니다. 3단계에서 관리자가 사용자의 암호를 변경할 수 있도록 하는 기술에 대해 설명합니다.

브라우저를 ChangePassword.aspx 통해 페이지를 방문하여 암호를 변경합니다. 멤버 자격 구성에 지정된 암호 길이 및 영숫자 이외 문자 요구 사항을 충족하지 못하는 새 암호를 입력하면 오류 메시지가 표시됩니다(그림 7 참조).

암호 길이 및 영숫자 이외 문자 요구 사항을 충족하지 못하는 새 암호를 입력하면 오류 메시지가 표시됩니다.

그림 7: 페이지에 ChangePassword 컨트롤 추가(전체 크기 이미지를 보려면 클릭)

올바른 이전 암호와 유효한 새 암호를 입력하면 로그온한 사용자의 암호가 변경되고 성공 보기가 표시됩니다.

확인 전자 메일 보내기

기본적으로 ChangePassword 컨트롤은 암호가 방금 업데이트된 사용자에게 전자 메일 메시지를 보내지 않습니다. 전자 메일을 보내려면 컨트롤의 MailDefinition 속성을 구성하기만 하면 됩니다. 사용자가 새 암호를 포함하는 HTML 형식 전자 메일을 보내도록 ChangePassword 컨트롤을 구성해 보겠습니다.

먼저 폴더에 새 파일을 EmailTemplates 만듭니다 ChangePassword.htm. 다음 태그를 추가합니다.

<html>
 <body>
 <h2>Your Password Has Been Changed!</h2>
 <p>
 This email confirms that your password has been changed.
 </p>
 <p>
 To log on to the site, use the following credentials:
 </p>
 <table>
 <tr>
 <td>
 <b>Username:</b>
 </td>
 <td>
 <%UserName%>
 </td>
 </tr>
 <tr>
 <td>
 <b>Password:</b>
 </td>
 <td>
 <%Password%>
 </td>
 </tr>
 </table>
 <p>
 If you have any questions or encounter any problems logging in,
 please contact a site administrator.
 </p>
 </body>
</html>

다음으로 ChangePassword 컨트롤의 MailDefinition 속성 및 Subject 속성을 BodyFileNameIsBodyHtml각각 ~/EmailTemplates/ChangePassword.htm, True 및 암호가 변경되었습니다!로 설정합니다.

변경한 후 페이지를 다시 방문하고 암호를 다시 변경합니다. 이번에는 ChangePassword 컨트롤이 사용자 지정된 HTML 형식의 전자 메일을 파일의 사용자의 전자 메일 주소로 보냅니다(그림 8 참조).

사용자에게 암호가 변경되었음을 알리는 전자 메일 메시지

그림 8: 사용자에게 암호가 변경되었음을 알리는 전자 메일 메시지(전체 크기 이미지를 보려면 클릭)

3단계: 관리자가 사용자의 암호를 변경할 수 있도록 허용

사용자 계정을 지원하는 애플리케이션의 일반적인 기능은 관리자가 다른 사용자의 암호를 변경하는 기능입니다. 시스템에 사용자가 자신의 암호를 변경할 수 있는 기능이 없기 때문에 이 기능이 필요한 경우도 있습니다. 이러한 경우 사용자가 잊어버린 암호를 복구하는 유일한 방법은 관리자가 새 암호를 할당하는 것입니다. 그러나 PasswordRecovery 및 ChangePassword 컨트롤을 사용하면 사용자가 직접 이 작업을 수행할 수 있으므로 관리자가 사용자의 암호를 변경하기 위해 바쁘지 않아도 됩니다.

그러나 클라이언트가 관리자가 다른 사용자의 암호를 변경할 수 있어야 한다고 주장하는 경우 어떻게 해야 할까요? 아쉽게도 이 기능을 추가하는 것은 약간의 작업이 될 수 있습니다. 사용자의 암호를 변경하려면 이전 암호와 새 암호를 모두 개체의 ChangePassword 메서드에 MembershipUser 제공해야 하지만 관리자는 암호를 수정하기 위해 사용자의 암호를 알 필요가 없습니다.

한 가지 해결 방법은 먼저 사용자의 암호를 재설정한 다음 다음과 같은 코드를 사용하여 새 암호로 변경하는 것입니다.

MembershipUser usr = Membership.GetUser(username);
string resetPwd = usr.ResetPassword();
usr.ChangePassword(resetPwd, newPassword);

이 코드는 관리자가 암호를 변경하려는 사용자 이름에 대한 정보를 검색하여 시작합니다. 다음으로 메서드가 ResetPassword 호출되어 사용자에게 새 임의 암호를 할당합니다. 임의로 생성된 이 암호는 메서드에서 반환되고 변수 resetPwd에 저장됩니다. 이제 사용자의 암호를 알고 있으므로 호출 ChangePassword을 통해 변경할 수 있습니다.

문제는 멤버 자격 시스템 구성이 False로 설정된 경우에만 이 코드가 작동한다는 RequiresQuestionAndAnswer 것입니다. True이면 RequiresQuestionAndAnswer 애플리케이션과 마찬가지로 메서드를 ResetPassword 보안 답변에 전달해야 합니다. 그렇지 않으면 예외가 throw됩니다.

멤버 자격 프레임워크가 보안 질문과 대답을 요구하도록 구성되어 있지만 클라이언트에서 관리자가 사용자의 암호를 변경할 수 있다고 주장하는 경우 다음 세 가지 옵션이 있습니다.

  • 공중에 손을 던져이 작업을 수행 할 수없는 한 가지라고 클라이언트에게 말한다.
  • False로 설정합니다 RequiresQuestionAndAnswer . 이로 인해 보안이 떨어지는 애플리케이션이 생성됩니다. 사악한 사용자가 다른 사용자의 전자 메일 받은 편지함에 액세스할 수 있다고 상상해 보십시오. 아마도 손상된 사용자는 점심 식사에 가기 위해 책상을 떠났고 워크스테이션을 잠그지 않았거나 공용 터미널에서 이메일에 액세스하여 로그아웃하지 않았을 수 있습니다. 두 경우 모두 사악한 사용자는 페이지를 방문하여 RecoverPassword.aspx 사용자의 사용자 이름을 입력할 수 있습니다. 그러면 시스템에서 보안 답변을 요청하지 않고 복구된 암호를 전자 메일로 보냅니다.
  • 멤버 자격 프레임워크에서 만든 추상화 계층을 우회하고 SQL Server 데이터베이스에서 직접 작업합니다. 멤버 자격 스키마에는 사용자의 암호를 설정하고 작업을 수행하기 위해 보안 답변 또는 이전 암호가 필요하지 않은 저장 aspnet_Membership_SetPassword 프로시저가 포함되어 있습니다.

이러한 옵션 중 어느 것도 특히 매력적이지는 않지만 개발자의 삶이 때때로 진행되는 방식입니다.

먼저 세 번째 방법을 구현하여 클래스 및 MembershipUser 클래스를 Membership 우회하고 데이터베이스에 대해 SecurityTutorials 직접 작동하는 코드를 작성했습니다.

참고 항목

데이터베이스를 직접 사용하여 작업하면 멤버 자격 프레임워크에서 제공하는 캡슐화가 깨집니다. 이 결정은 코드를 이식성이 SqlMembershipProvider떨어지도록 하는 데 연결됩니다. 또한 멤버 자격 스키마가 변경되면 이후 버전의 ASP.NET 이 코드가 예상대로 작동하지 않을 수 있습니다. 이 방법은 해결 방법이며 대부분의 해결 방법과 마찬가지로 모범 사례의 예는 아닙니다.

코드에는 매력적이지 않은 비트가 있으며 매우 길다. 따라서 이 자습서에 대한 심층적인 검사를 통해 이 자습서를 복잡하게 만들고 싶지는 않습니다. 자세한 내용을 알아보려면 이 자습서의 코드를 다운로드하고 페이지를 방문 ~/Administration/ManageUsers.aspx 하세요. 이전 자습서에서 만든 이 페이지에는 각 사용자가 나열됩니다. 선택한 사용자의 사용자 이름을 쿼리 문자열을 통해 전달하여 페이지에 대한 링크를 포함하도록 UserInformation.aspx GridView를 업데이트했습니다. 이 페이지에는 UserInformation.aspx 암호를 변경하기 위해 선택한 사용자 및 TextBox에 대한 정보가 표시됩니다(그림 9 참조).

새 암호를 입력하고 두 번째 TextBox에서 암호를 확인하고 사용자 업데이트 단추를 클릭하면 포스트백이 계속되고 aspnet_Membership_SetPassword 저장 프로시저가 호출되어 사용자의 암호를 업데이트합니다. 이 기능에 관심이 있는 독자가 코드에 더 익숙해지고 암호가 변경된 사용자에게 전자 메일을 보내는 기능을 확장해 보는 것이 좋습니다.

관리자가 사용자의 암호를 변경할 수 있음

그림 9: 관리자가 사용자의 암호를 변경할 수 있음(전체 크기 이미지를 보려면 클릭)

참고 항목

UserInformation.aspx 페이지는 현재 멤버 자격 프레임워크가 암호 지우기 또는 해시 형식으로 저장하도록 구성된 경우에만 작동합니다. 이 기능을 추가하도록 초대를 받았지만 새 암호를 암호화하는 코드가 없습니다. 필요한 코드를 추가하는 방법은 Reflector와 같은 디컴필러를 사용하여 .NET Framework의 메서드에 대한 소스 코드를 검사하는 것입니다. 먼저 클래스의 ChangePassword 메서드를 검사합니다SqlMembershipProvider. 암호 해시를 만들기 위한 코드를 작성하는 데 사용한 기술입니다.

요약

ASP.NET 사용자가 암호를 관리하는 데 도움이 되는 두 가지 컨트롤을 제공합니다. PasswordRecovery 컨트롤은 암호를 잊어버린 사람들에게 유용합니다. 멤버 자격 프레임워크의 구성에 따라 사용자는 기존 암호 또는 임의로 생성된 새 암호를 전자 메일로 보냅니다. ChangePassword 컨트롤을 사용하면 사용자가 암호를 업데이트할 수 있습니다.

Login 및 CreateUserWizard 컨트롤과 마찬가지로 PasswordRecovery 및 ChangePassword 컨트롤은 선언적 태그 또는 코드 줄을 핥지 않고도 풍부한 사용자 인터페이스를 렌더링합니다. 기본 사용자 인터페이스가 요구 사항을 충족하지 않는 경우 다양한 스타일 속성을 통해 사용자 지정할 수 있습니다. 또는 컨트롤의 인터페이스를 템플릿으로 변환하여 더 미세한 수준의 제어를 할 수 있습니다. 백그라운드에서 이러한 컨트롤은 멤버 자격 API를 사용하여 개체 ResetPasswordChangePassword 메서드를 MembershipUser 호출합니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 항목에 대한 자세한 내용은 다음 리소스를 참조하세요.

작성자 정보

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

특별 감사

이 자습서 시리즈는 많은 유용한 검토자가 검토했습니다. 이 자습서의 수석 검토자는 Michael Emmings 및 Suchi Banerjee를 포함합니다. 예정된 MSDN 문서를 검토하는 데 관심이 있으신가요? 그렇다면 다음에서 줄을 놓습니다. mitchell@4GuysFromRolla.com