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와의 상호 운용성 향상

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 컨트롤이 UserName 보기에서 성공 보기로 바로 이동합니다.

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

참고

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

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

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

그림 1: RequiresQuestionAndAnswer암호 복구 컨트롤의 모양 및 EnablePasswordReset 동작에 영향을 미치는 , EnablePasswordRetrieval및 영향(전체 크기 이미지를 보려면 클릭)

참고

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

PasswordRecovery 컨트롤 사용

ASP.NET 페이지에서 PasswordRecovery 컨트롤을 사용하는 것을 살펴보겠습니다. RecoverPassword.aspx Toolbox에서 PasswordRecovery 컨트롤을 열고 끌어서 Designer 놓습니다. 을 로 RecoverPwd설정합니다ID. Login 및 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> 하지 말고 동일한 수준에 배치합니다.

<configuration>
 ...
 <system.net>
 <mailSettings>
 <smtp deliveryMethod="Network" from="youraddress@example.com">
 <network
 host="smtp.example.com"
 userName="username"
 password="password"
 port="25" />
 </smtp>
 </mailSettings>
 </system.net>
</configuration>

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

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

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

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

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

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

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

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

사용자가 새 암호로 Email 전송됨

그림 4: 사용자가 새 암호를 사용하여 Email 전송됨(전체 크기 이미지를 보려면 클릭)

Email 사용자 지정

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!

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

마지막으로 의 속성을 방금 만든 이메일 템플릿(~/EmailTemplates/PasswordRecovery.txt)을 가리킵니 BodyFileNameMailDefinition다.

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

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

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

HTML 형식 전자 메일을 True(기본값은 False)로 설정하고 IsBodyHtml 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의 전자 메일 메시지에 표시된 임의로 생성된 암호는 Membership 클래스의 GeneratePassword 메서드에 의해 만들어집니다. 이 메서드는 lengthnumberOfNonAlphanumericCharacters라는 두 개의 정수 입력 매개 변수를 허용하고 적어도 numberOfNonAlphanumericCharacters 숫자가 영숫자가 아닌 문자의 길이가 긴 문자열을 반환합니다. 이 메서드가 멤버 자격 클래스 또는 로그인 관련 웹 컨트롤 내에서 호출되는 경우 이러한 두 매개 변수의 MinRequiredPasswordLength 값은 멤버 자격 구성 및 속성에 의해 결정되며, 각각 7과 MinRequiredNonalphanumericCharacters 1로 설정됩니다.

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

참고

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

2단계: 암호 변경

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

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

참고

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

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

페이지에 ChangePassword 컨트롤 추가

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

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

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

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

참고

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

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

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

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

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

확인 Email 보내기

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

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

<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 속성 BodyFileName, IsBodyHtmlSubject 속성을 ~/EmailTemplates/ChangePassword.htm, True 및 암호가 각각 변경되었습니다!로 설정합니다.

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

Email 메시지가 사용자에게 암호가 변경되었음을 알릴 수 있습니다.

그림 8: Email 메시지가 사용자에게 암호가 변경되었음을 알릴 수 있습니다(전체 크기 이미지를 보려면 클릭).

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

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

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

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

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

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

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

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

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

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

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

참고

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

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

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

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

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

참고

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

요약

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

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

행복한 프로그래밍!

추가 정보

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

저자 정보

여러 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