사용자 계정 만들기(C#)

작성자 : Scott Mitchell

참고

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

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

코드 다운로드 또는 PDF 다운로드

이 자습서에서는 멤버 자격 프레임워크(SqlMembershipProvider를 통해)를 사용하여 새 사용자 계정을 만드는 방법을 살펴봅니다. 프로그래밍 방식으로 ASP를 통해 새 사용자를 만드는 방법을 알아봅니다. NET의 기본 제공 CreateUserWizard 컨트롤입니다.

소개

이전 자습서에서는 및 에 필요한 테이블, 뷰 및 저장 프로시저를 추가하는 애플리케이션 서비스 스키마를 데이터베이스에 SqlMembershipProviderSqlRoleProvider설치했습니다. 이렇게 하면 이 시리즈의 나머지 자습서에 필요한 인프라가 생성되었습니다. 이 자습서에서는 멤버 자격 프레임워크(를 통해 SqlMembershipProvider)를 사용하여 새 사용자 계정을 만드는 방법을 살펴봅니다. 프로그래밍 방식으로 ASP를 통해 새 사용자를 만드는 방법을 알아봅니다. NET의 기본 제공 CreateUserWizard 컨트롤입니다.

새 사용자 계정을 만드는 방법을 배우는 것 외에도 양식 인증 개요 자습서에서 처음 만든 데모 웹 사이트를 업데이트한 다음 양식 인증 구성 및 고급 항목 자습서에서 개선해야 합니다. 데모 웹 애플리케이션에는 하드 코딩된 사용자 이름/암호 쌍에 대해 사용자의 자격 증명의 유효성을 검사하는 로그인 페이지가 있습니다. 또한 인증 Global.asax 된 사용자에 대한 사용자 지정 IPrincipalIIdentity 개체를 만드는 코드도 포함됩니다. 멤버 자격 프레임워크에 대해 사용자의 자격 증명의 유효성을 검사하고 사용자 지정 보안 주체 및 ID 논리를 제거하도록 로그인 페이지를 업데이트합니다.

그럼 시작하겠습니다.

양식 인증 및 멤버 자격 검사 목록

멤버 자격 프레임워크 작업을 시작하기 전에 잠시 시간을 내어 이 시점에 도달하기 위해 수행한 중요한 단계를 검토해 보겠습니다. 양식 기반 인증 시나리오에서 과 함께 SqlMembershipProvider 멤버 자격 프레임워크를 사용하는 경우 웹 애플리케이션에서 멤버 자격 기능을 구현하기 전에 다음 단계를 수행해야 합니다.

  1. 양식 기반 인증을 사용하도록 설정합니다. 양식 인증 개요에서 설명한 것처럼 양식 인증은 요소의 mode 특성을 Forms편집 Web.config 하고 로 설정 <authentication> 하여 활성화됩니다. 양식 인증을 사용하도록 설정하면 들어오는 각 요청이 양식 인증 티켓에 대해 검사되며, 있는 경우 요청자를 식별합니다.
  2. 적절한 데이터베이스에 애플리케이션 서비스 스키마를 추가합니다.SqlMembershipProvider 사용하는 경우 데이터베이스에 애플리케이션 서비스 스키마를 설치해야 합니다. 일반적으로 이 스키마는 애플리케이션의 데이터 모델을 보유하는 동일한 데이터베이스에 추가됩니다. SQL Server 멤버 자격 스키마 만들기 자습서에서는 도구를 사용하여 aspnet_regsql.exe 이를 수행하는 방법을 살펴보았습니다.
  3. 2단계에서 데이터베이스를 참조하도록 웹 애플리케이션의 설정을 사용자 지정합니다. SQL Server 멤버 자격 스키마 만들기 자습서에서는 2단계에서 선택한 데이터베이스를 사용하도록 웹 애플리케이션 SqlMembershipProvider 을 구성하는 두 가지 방법을 보여 줍니다. 즉, 연결 문자열 이름을 수정 LocalSqlServer 하거나 멤버 자격 프레임워크 공급자 목록에 등록된 새 공급자를 추가하고 2단계에서 데이터베이스를 사용하도록 새 공급자를 사용자 지정합니다.

및 양식 기반 인증을 사용하는 웹 애플리케이션을 SqlMembershipProvider 빌드할 때 클래스 또는 ASP.NET 로그인 웹 컨트롤을 사용하기 Membership 전에 다음 세 단계를 수행해야 합니다. 이전 자습서에서 이러한 단계를 이미 수행했으므로 멤버 자격 프레임워크 사용을 시작할 준비가 된 것입니다.

1단계: 새 ASP.NET 페이지 추가

이 자습서와 다음 세 가지에서는 다양한 멤버 자격 관련 기능 및 기능을 살펴보겠습니다. 이러한 자습서 전체에서 검사된 topics 구현하려면 일련의 ASP.NET 페이지가 필요합니다. 해당 페이지와 사이트 맵 파일을 (Web.sitemap)만들어 보겠습니다.

먼저 라는 Membership프로젝트에 새 폴더를 만듭니다. 그런 다음 폴더에 Membership 5개의 새 ASP.NET 페이지를 추가하여 각 페이지를 master 페이지와 Site.master 연결합니다. 페이지 이름을 지정합니다.

  • CreatingUserAccounts.aspx
  • UserBasedAuthorization.aspx
  • EnhancedCreateUserWizard.aspx
  • AdditionalUserInfo.aspx
  • Guestbook.aspx

이 시점에서 프로젝트의 솔루션 탐색기 그림 1에 표시된 스크린샷과 유사하게 표시됩니다.

멤버 자격 폴더에 5개의 새 페이지가 추가되었습니다.

그림 1: 폴더에 5개의 새 페이지가 Membership 추가되었습니다(전체 크기 이미지를 보려면 클릭).

이 시점에서 각 페이지에는 master 페이지의 ContentPlaceHolders MainContent 각각에 대해 하나씩 두 개의 Content 컨트롤이 있어야 합니다. 및 LoginContent.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"

Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"
Runat="Server">
</asp:Content>

LoginContent ContentPlaceHolder의 기본 태그에는 사용자가 인증되었는지 여부에 따라 사이트에 로그온하거나 로그오프할 수 있는 링크가 표시됩니다. 그러나 콘텐츠 컨트롤의 Content2 존재는 master 페이지의 기본 태그를 재정의합니다. 양식 인증 개요 자습서에서 설명한 것처럼 왼쪽 열에 로그인 관련 옵션을 표시하지 않으려는 페이지에서 유용합니다.

그러나 이 다섯 페이지의 경우 ContentPlaceHolder에 대한 master 페이지의 기본 태그를 LoginContent 표시하려고 합니다. 따라서 콘텐츠 컨트롤에 대한 선언적 태그를 Content2 제거합니다. 이렇게 하면 5개 페이지의 각 태그에 하나의 콘텐츠 컨트롤만 포함되어야 합니다.

2단계: 사이트 맵 만들기

가장 간단한 웹 사이트를 제외한 모든 웹 사이트는 탐색 사용자 인터페이스의 어떤 형태를 구현해야합니다. 탐색 사용자 인터페이스는 사이트의 다양한 섹션에 대한 링크의 간단한 목록일 수 있습니다. 또는 이러한 링크를 메뉴 또는 트리 뷰로 정렬할 수 있습니다. 페이지 개발자는 탐색 사용자 인터페이스를 만드는 것이 스토리의 절반에 불과합니다. 또한 유지 관리 가능하고 업데이트 가능한 방식으로 사이트의 논리적 구조를 정의하는 몇 가지 수단이 필요합니다. 새 페이지가 추가되거나 기존 페이지가 제거되면 단일 원본(사이트 맵)을 업데이트하고 해당 수정 사항이 사이트의 탐색 사용자 인터페이스에 반영되도록 해야 합니다.

사이트 맵을 정의하고 사이트 맵을 기반으로 탐색 사용자 인터페이스를 구현하는 이러한 두 작업은 사이트 맵 프레임워크 및 ASP.NET 버전 2.0에 추가된 탐색 웹 컨트롤 덕분에 쉽게 수행할 수 있습니다. 사이트 맵 프레임워크를 사용하면 개발자가 사이트 맵을 정의한 다음 프로그래밍 방식 API( SiteMap 클래스)를 통해 액세스할 수 있습니다. 기본 제공 탐색 웹 컨트롤에는 메뉴 컨트롤, TreeView 컨트롤SiteMapPath 컨트롤이 포함됩니다.

멤버 자격 및 역할 프레임워크와 마찬가지로 사이트 맵 프레임워크는 공급자 모델 위에 빌드됩니다. 사이트 맵 공급자 클래스의 작업은 XML 파일 또는 데이터베이스 테이블과 같은 영구 데이터 저장소에서 클래스에서 사용하는 SiteMap 메모리 내 구조를 생성하는 것입니다. 이 .NET Framework XML 파일(XmlSiteMapProvider)에서 사이트 맵 데이터를 읽는 기본 사이트 맵 공급자와 함께 제공되며 이 자습서에서 사용할 공급자입니다. 일부 대체 사이트 맵 공급자 구현은 이 자습서의 끝에 있는 추가 읽기 섹션을 참조하세요.

기본 사이트 맵 공급자에는 루트 디렉터리가 존재하도록 명명 Web.sitemap 된 올바른 형식의 XML 파일이 필요합니다. 이 기본 공급자를 사용하므로 이러한 파일을 추가하고 적절한 XML 형식으로 사이트 맵의 구조를 정의해야 합니다. 파일을 추가하려면 솔루션 탐색기 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 새 항목 추가를 선택합니다. 대화 상자에서 라는 Web.sitemap사이트 맵 형식의 파일을 추가하도록 선택합니다.

프로젝트의 루트 디렉터리에 Web.sitemap이라는 파일 추가

그림 2: 프로젝트의 루트 디렉터리에 명명된 Web.sitemap 파일 추가(전체 크기 이미지를 보려면 클릭)

XML 사이트 맵 파일은 웹 사이트의 구조를 계층 구조로 정의합니다. 이 계층적 관계는 요소의 조상을 통해 XML 파일에서 모델링됩니다 <siteMapNode> . 은 Web.sitemap 정확히 하나의 <siteMapNode> 자식이 있는 <siteMap> 부모 노드로 시작해야 합니다. 이 최상위 <siteMapNode> 요소는 계층의 루트를 나타내며 임의 수의 하위 노드가 있을 수 있습니다. 각 <siteMapNode> 요소는 특성을 포함 title 해야 하며 필요에 따라 및 description 특성을 포함 url 할 수 있습니다. 비어 있지 않은 url 각 특성은 고유해야 합니다.

파일에 다음 XML을 입력합니다 Web.sitemap .

<?xml version="1.0" encoding="utf-8" ?>

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
     <siteMapNode url="~/Default.aspx" title="Home">
          <siteMapNode title="Membership">
               <siteMapNode url="~/Membership/CreatingUserAccounts.aspx" title="Creating User Accounts" />

               <siteMapNode url="~/Membership/UserBasedAuthorization.aspx" title="User-Based Authorization" />
               <siteMapNode url="~/Membership/Guestbook.aspx" title="Storing Additional User Information" />
          </siteMapNode>

     </siteMapNode>
</siteMap>

위의 사이트 맵 태그는 그림 3에 표시된 계층 구조를 정의합니다.

사이트 맵은 계층적 탐색 구조를 나타냅니다.

그림 3: 사이트 맵은 계층적 탐색 구조를 나타냅니다(전체 크기 이미지를 보려면 클릭).

3단계: 탐색 사용자 인터페이스를 포함하도록 마스터 페이지 업데이트

ASP.NET 사용자 인터페이스를 디자인하기 위한 여러 탐색 관련 웹 컨트롤이 포함되어 있습니다. 여기에는 Menu, TreeView 및 SiteMapPath 컨트롤이 포함됩니다. Menu 및 TreeView 컨트롤은 각각 메뉴 또는 트리에서 사이트 맵 구조를 렌더링하는 반면 SiteMapPath는 방문 중인 현재 노드와 상위 노드를 보여 주는 이동 경로를 표시합니다. 사이트 맵 데이터는 SiteMapDataSource를 사용하여 다른 데이터 웹 컨트롤에 바인딩할 수 있으며 클래스를 SiteMap 통해 프로그래밍 방식으로 액세스할 수 있습니다.

사이트 맵 프레임워크 및 탐색 컨트롤에 대한 철저한 논의는 이 자습서 시리즈의 scope 넘어가므로 자체 탐색 사용자 인터페이스를 만드는 데 시간을 할애하는 대신 반복기 컨트롤을 사용하여 탐색 링크의 2개의 깊은 글머리 기호 목록을 표시하는 ASP.NET 2.0 자습서 시리즈에서 데이터 작업에서 사용되는 인터페이스를 차용해 보겠습니다. 그림 4와 같습니다.

이 인터페이스를 만들려면 다음 선언적 태그를 Site.master master 페이지의 왼쪽 열에 추가합니다. 여기서 텍스트 "TODO: 메뉴는 여기로 이동합니다...". 현재 상주합니다.

<ul>
     <li>

          <asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink>
     </li>
     <asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1">

          <ItemTemplate>
               <li>
                    <asp:HyperLink ID="lnkMenuItem" runat="server" 
                         NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>

                    <asp:Repeater ID="submenu" runat="server" DataSource="<%#
                         ((SiteMapNode) Container.DataItem).ChildNodes %>">
                         <HeaderTemplate>
                              <ul>
                         </HeaderTemplate>
                         <ItemTemplate>

                              <li>
                                   <asp:HyperLink ID="lnkMenuItem" runat="server" NavigateUrl='<%#
                                        Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>

                              </li>
                         </ItemTemplate>
                         <FooterTemplate>
                              </ul>
                         </FooterTemplate>
                    </asp:Repeater>
               </li>
          </ItemTemplate>
     </asp:Repeater>

</ul>
    
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />

위의 태그는 에 정의된 Web.sitemap사이트 맵 계층 구조를 반환하는 SiteMapDataSource에 라는 menu Repeater 컨트롤을 바인딩합니다. SiteMapDataSource 컨트롤의 ShowStartingNode 속성 은 False로 설정되므로 "Home" 노드의 하위 항목부터 시작하여 사이트 맵의 계층 구조를 반환하기 시작합니다. 반복기는 요소에 이러한 각 노드(현재는 "멤버 자격")를 <li> 표시합니다. 또 다른 내부 반복기는 현재 노드의 자식을 중첩된 순서가 지정되지 않은 목록에 표시합니다.

그림 4에서는 2단계에서 만든 사이트 맵 구조를 사용하여 위의 태그가 렌더링된 출력을 보여 줍니다. 반복기는 순서가 지정되지 않은 바닐라 목록 태그를 렌더링합니다. 에 정의된 Styles.css 계단식 스타일시트 규칙은 심미적으로 만족스러운 레이아웃을 담당합니다. 위의 태그 작동 방식에 대한 자세한 설명은 마스터 페이지 및 사이트 탐색 자습서를 참조하세요.

탐색 사용자 인터페이스는 중첩된 정렬되지 않은 목록을 사용하여 렌더링됩니다.

그림 4: 탐색 사용자 인터페이스가 중첩된 정렬되지 않은 목록을 사용하여 렌더링됨(전체 크기 이미지를 보려면 클릭)

이동 경로 탐색 추가

왼쪽 열의 링크 목록 외에도 각 페이지에 이동 경로가 표시되도록 하겠습니다. 이동 경로는 사이트 계층 내에서 사용자에게 현재 위치를 빠르게 표시하는 탐색 사용자 인터페이스 요소입니다. SiteMapPath 컨트롤은 사이트 맵 프레임워크를 사용하여 사이트 맵에서 현재 페이지의 위치를 확인한 다음 이 정보를 기반으로 이동 경로를 표시합니다.

특히 master 페이지의 헤더 <div> 요소에 요소를 추가하고 <span><span> 요소의 class 특성을 "이동 경로"로 설정합니다. (클래스에는 Styles.css "이동 경로" 클래스에 대한 규칙이 포함되어 있습니다.) 다음으로 이 새 <span> 요소에 SiteMapPath를 추가합니다.

<div id="header">
     <span class="title">User Account Tutorials</span><br />
     <span class="breadcrumb">
          <asp:SiteMapPath ID="SiteMapPath1" runat="server">

          </asp:SiteMapPath>
     </span>
</div>

그림 5는 를 방문할 때 SiteMapPath의 출력을 ~/Membership/CreatingUserAccounts.aspx보여줍니다.

이동 경로 사이트 맵에 현재 페이지 및 상위 항목 표시

그림 5: 이동 경로는 사이트 맵에 현재 페이지와 상위 항목을 표시합니다(전체 크기 이미지를 보려면 클릭).

4단계: 사용자 지정 보안 주체 및 ID 논리 제거

사용자 지정 보안 주체 및 ID 개체는 인증된 사용자에 연결할 수 있습니다. 에서 사용자를 인증한 후 FormsAuthenticationModule 실행되는 애플리케이션의 PostAuthenticateRequest 이벤트에 대한 이벤트 처리기를 Global.asax 만들어 이 작업을 수행했습니다. 이 이벤트 처리기에서 에 의해 FormsAuthenticationModule 추가된 GenericPrincipalFormsIdentity 개체를 해당 자습서에서 만든 및 CustomIdentity 개체로 CustomPrincipal 대체했습니다.

사용자 지정 보안 주체 및 ID 개체는 특정 시나리오에서 유용하지만 대부분의 경우 GenericPrincipalFormsIdentity 개체로 충분합니다. 따라서 기본 동작으로 돌아가는 것이 가치가 있다고 생각합니다. 이벤트 처리기를 제거하거나 주석 처리 PostAuthenticateRequest 하거나 파일을 완전히 삭제하여 Global.asax 변경합니다.

5단계: 프로그래밍 방식으로 새 사용자 만들기

멤버 자격 프레임워크를 통해 새 사용자 계정을 만들려면 클래스의 CreateUser 메서드Membership 사용합니다. 이 메서드에는 사용자 이름, 암호 및 기타 사용자 관련 필드에 대한 입력 매개 변수가 있습니다. 호출할 때 구성된 멤버 자격 공급자에 새 사용자 계정 만들기를 위임한 다음 방금 만든 사용자 계정을 나타내는 개체를 반환 MembershipUser 합니다.

메서드에는 CreateUser 각각 다른 수의 입력 매개 변수를 허용하는 4개의 오버로드가 있습니다.

이러한 4개의 오버로드는 수집되는 정보의 양에 따라 다릅니다. 예를 들어 첫 번째 오버로드는 새 사용자 계정의 사용자 이름과 암호만 요구하는 반면, 두 번째 오버로드는 사용자의 이메일 주소도 필요합니다.

이러한 오버로드는 새 사용자 계정을 만드는 데 필요한 정보가 멤버 자격 공급자의 구성 설정에 따라 달라지므로 존재합니다. SQL Server 멤버 자격 스키마 만들기 자습서에서는 에서 멤버 자격 공급자 구성 설정을 지정하는 것을 검토했습니다Web.config. 표 2에는 구성 설정의 전체 목록이 포함되어 있습니다.

사용할 수 있는 오버로드에 CreateUser 영향을 주는 멤버 자격 공급자 구성 설정 중 하나는 설정입니다 requiresQuestionAndAnswer . 가 (기본값)으로 true 설정된 경우 requiresQuestionAndAnswer 새 사용자 계정을 만들 때 보안 질문과 대답을 지정해야 합니다. 이 정보는 나중에 사용자가 암호를 재설정하거나 변경해야 하는 경우에 사용됩니다. 특히 이때 보안 질문이 표시되며 암호를 재설정하거나 변경하려면 정답을 입력해야 합니다. 따라서 가 로 true 설정된 경우 처음 두 CreateUser 오버로드 중 하나를 호출하면 requiresQuestionAndAnswer 보안 질문과 답변이 누락되어 예외가 발생합니다. 애플리케이션은 현재 보안 질문과 답변이 필요하도록 구성되어 있으므로 사용자를 프로그래밍 방식으로 만들 때 후자의 두 오버로드 중 하나를 사용해야 합니다.

메서드를 CreateUser 사용하는 방법을 설명하기 위해 사용자에게 이름, 암호, 이메일 및 미리 정의된 보안 질문에 대한 답변을 묻는 메시지를 표시하는 사용자 인터페이스를 만들어 보겠습니다. 폴더에서 CreatingUserAccounts.aspxMembership 페이지를 열고 콘텐츠 컨트롤에 다음 웹 컨트롤을 추가합니다.

  • 라는 TextBox Username
  • 속성이 로 설정된 라는 PasswordTextMode TextBoxPassword
  • 라는 TextBox Email
  • 해당 Text 속성이 지워진 레이블 SecurityQuestion
  • 라는 TextBox SecurityAnswer
  • Text 속성이 "사용자 계정 만들기"로 설정된 단추 CreateAccountButton
  • 해당 속성이 지워진 레이블 CreateAccountResultsText 컨트롤

이 시점에서 화면은 그림 6에 표시된 스크린샷과 유사하게 표시됩니다.

CreatingUserAccounts.aspx 페이지에 다양한 웹 컨트롤 추가

그림 6: 페이지에 다양한 웹 컨트롤 CreatingUserAccounts.aspx 추가(전체 크기 이미지를 보려면 클릭)

SecurityQuestion Label 및 SecurityAnswer TextBox는 미리 정의된 보안 질문을 표시하고 사용자의 답변을 수집하기 위한 것입니다. 보안 질문과 답변은 모두 사용자 단위로 저장되므로 각 사용자가 고유한 보안 질문을 정의할 수 있습니다. 그러나 이 예제에서는 "가장 좋아하는 색은 무엇인가요?"라는 보편적인 보안 질문을 사용하기로 결정했습니다.

이 미리 정의된 보안 질문을 구현하려면 라는 페이지의 코드 숨김 클래스 passwordQuestion에 상수를 추가하여 보안 질문을 할당합니다. 그런 다음 이벤트 처리기에서 Page_Load Label의 Text 속성에 SecurityQuestion 이 상수를 할당합니다.

const string passwordQuestion = "What is your favorite color";
    
protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
          SecurityQuestion.Text = passwordQuestion;
}

다음으로, 의 Click 이벤트에 대한 CreateAccountButton이벤트 처리기를 만들고 다음 코드를 추가합니다.

protected void CreateAccountButton_Click(object sender, EventArgs e)
{
     MembershipCreateStatus createStatus;
     MembershipUser newUser = Membership.CreateUser(Username.Text, Password.Text, Email.Text, passwordQuestion, SecurityAnswer.Text, true, out createStatus);
     switch (createStatus)
     {
          case MembershipCreateStatus.Success:
               CreateAccountResults.Text = "The user account was successfully created!";
               break;
          case MembershipCreateStatus.DuplicateUserName:
               CreateAccountResults.Text = "There already exists a user with this username.";
               break;

          case MembershipCreateStatus.DuplicateEmail:
               CreateAccountResults.Text = "There already exists a user with this email address.";
               break;
          case MembershipCreateStatus.InvalidEmail:
               CreateAccountResults.Text = "There email address you provided in invalid.";
               break;
          case MembershipCreateStatus.InvalidAnswer:
               CreateAccountResults.Text = "There security answer was invalid.";
               break;
          case MembershipCreateStatus.InvalidPassword:
               CreateAccountResults.Text = "The password you provided is invalid. It must be seven characters long and have at least one non-alphanumeric character.";

               break;
          default:
               CreateAccountResults.Text = "There was an unknown error; the user account was NOT created.";
               break;
     }
}

Click 이벤트 처리기는 형식MembershipCreateStatus의 변수 createStatus 를 정의하여 시작합니다. MembershipCreateStatus는 작업의 상태 나타내는 열거형입니다CreateUser. 예를 들어 사용자 계정이 성공적으로 만들어지면 결과 MembershipCreateStatus instance 값Success으로 설정되고, 다른 한편으로는 동일한 사용자 이름을 가진 사용자가 이미 있기 때문에 작업이 실패하면 값DuplicateUserName으로 설정됩니다. CreateUser 사용하는 오버로드에서는 매개 변수로 out 메서드에 MembershipCreateStatus instance 전달해야 합니다. 이 매개 변수는 메서드 내에서 CreateUser 적절한 값으로 설정되며 메서드 호출 후 해당 값을 검사하여 사용자 계정이 성공적으로 만들어졌는지 여부를 확인할 수 있습니다.

를 호출CreateUser한 후 를 createStatusswitch 전달하면 에 할당된 createStatus값에 따라 적절한 메시지를 출력하는 데 문이 사용됩니다. 그림 7은 새 사용자가 성공적으로 만들어졌을 때의 출력을 보여 줍니다. 그림 8과 9는 사용자 계정을 만들지 않은 경우 출력을 보여 줍니다. 그림 8에서 방문자는 멤버 자격 공급자의 구성 설정에 명시된 암호 강도 요구 사항을 충족하지 않는 5자 암호를 입력했습니다. 그림 9에서 방문자는 기존 사용자 이름(그림 7에서 만든 계정)을 사용하여 사용자 계정을 만들려고 합니다.

새 사용자 계정이 성공적으로 생성됨

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

제공된 암호가 너무 약하여 사용자 계정이 만들어지지 않음

그림 8: 제공된 암호가 너무 약하여 사용자 계정이 만들어지지 않음(전체 크기 이미지를 보려면 클릭)

사용자 이름이 이미 사용 중이므로 사용자 계정이 만들어지지 않음

그림 9: 사용자 이름이 이미 사용 중이므로 사용자 계정이 만들어지지 않음(전체 크기 이미지를 보려면 클릭)

참고

처음 두 CreateUser 메서드 오버로드 중 하나를 사용할 때 성공 또는 실패를 확인하는 방법이 궁금할 수 있습니다. 둘 다 형식 MembershipCreateStatus의 매개 변수가 없는 경우 이러한 처음 두 오버로드는 형식MembershipCreateStatus의 속성을 포함하는 오류 발생 시 예외를 StatusCode throw MembershipCreateUserException 합니다.

몇 개의 사용자 계정을 만든 후 데이터베이스에 있는 및 aspnet_Membership 테이블 SecurityTutorials.mdfaspnet_Users 내용을 나열하여 계정이 만들어졌는지 확인합니다. 그림 10에서 보여 주듯이 페이지를 통해 CreatingUserAccounts.aspx Tito와 Bruce라는 두 명의 사용자를 추가했습니다.

멤버 자격 사용자 저장소에는 Tito 및 Bruce라는 두 명의 사용자가 있습니다.

그림 10: 멤버 자격 사용자 저장소에 Tito 및 Bruce라는 두 명의 사용자가 있습니다(전체 크기 이미지를 보려면 클릭).

멤버 자격 사용자 저장소에는 이제 Bruce 및 Tito의 계정 정보가 포함되어 있지만 Bruce 또는 Tito가 사이트에 로그온할 수 있는 기능을 아직 구현하지 못했습니다. 현재 는 Login.aspx 하드 코딩된 사용자 이름/암호 쌍 집합에 대해 사용자의 자격 증명의 유효성을 검사합니다. 멤버 자격 프레임워크에 대해 제공된 자격 증명의 유효성을 검사 하지 않습니다. 지금은 및 aspnet_Membership 테이블에서 새 사용자 계정을 aspnet_Users 보는 것으로 충분해야 합니다. 다음 자습서에서 멤버 자격 사용자 저장소에 대한 사용자 자격 증명 유효성 검사에서 멤버 자격 저장소에 대한 유효성을 검사하도록 로그인 페이지를 업데이트합니다.

참고

데이터베이스에 사용자가 표시되지 않는 경우 웹 애플리케이션이 SecurityTutorials.mdf 데이터베이스를 사용자 저장소로 사용하는 기본 멤버 자격 공급자 AspNetSqlMembershipProvider를 사용하고 ASPNETDB.mdf 있기 때문일 수 있습니다. 이것이 문제인지 확인하려면 솔루션 탐색기 새로 고침 단추를 클릭합니다. 라는 ASPNETDB.mdf 데이터베이스가 폴더에 App_Data 추가된 경우 이것이 문제입니다. 멤버 자격 공급자를 올바르게 구성하는 방법에 대한 지침은 SQL Server 멤버 자격 스키마 만들기 자습서의 4단계로 돌아갑니다.

대부분의 사용자 계정 만들기 시나리오에서 방문자는 사용자 이름, 암호, 이메일 및 기타 필수 정보를 입력하는 일부 인터페이스를 제공하며, 이때 새 계정이 만들어집니다. 이 단계에서는 이러한 인터페이스를 직접 빌드한 다음 메서드를 사용하여 Membership.CreateUser 사용자의 입력에 따라 프로그래밍 방식으로 새 사용자 계정을 추가하는 방법을 살펴보았습니다. 그러나 코드는 방금 새 사용자 계정을 만들었습니다. 방금 만든 사용자 계정으로 사이트에 사용자를 로그인하거나 사용자에게 확인 이메일을 보내는 등의 후속 작업을 수행하지 않았습니다. 이러한 추가 단계에는 Button의 Click 이벤트 처리기에 추가 코드가 필요합니다.

ASP.NET 사용자 계정 만들기 프로세스를 처리하도록 설계된 CreateUserWizard 컨트롤과 함께 제공됩니다. 이 컨트롤은 새 사용자 계정을 만들기 위한 사용자 인터페이스 렌더링에서 멤버 자격 프레임워크에서 계정을 만들고 확인 전자 메일을 보내고 방금 만든 사용자를 사이트에 로깅하는 등의 사후 계정 만들기 작업을 수행합니다. CreateUserWizard 컨트롤을 사용하는 것은 도구 상자에서 페이지로 CreateUserWizard 컨트롤을 끌어온 다음 몇 가지 속성을 설정하는 것만큼 간단합니다. 대부분의 경우 한 줄의 코드를 작성할 필요가 없습니다. 6단계에서 이 멋진 컨트롤을 자세히 살펴보겠습니다.

새 사용자 계정이 일반적인 계정 만들기 웹 페이지를 통해서만 만들어지는 경우 CreateUserWizard 컨트롤이 요구 사항을 충족할 수 있으므로 메서드를 사용하는 CreateUser 코드를 작성할 필요가 없습니다. 그러나 CreateUser 이 메서드는 고도로 사용자 지정된 계정 만들기 사용자 환경이 필요하거나 대체 인터페이스를 통해 프로그래밍 방식으로 새 사용자 계정을 만들어야 하는 시나리오에서 편리합니다. 예를 들어 사용자가 다른 애플리케이션의 사용자 정보가 포함된 XML 파일을 업로드할 수 있는 페이지가 있을 수 있습니다. 페이지에서 업로드된 XML 파일의 내용을 구문 분석하고 메서드를 호출 CreateUser 하여 XML에 표시되는 각 사용자에 대한 새 계정을 만들 수 있습니다.

6단계: CreateUserWizard 컨트롤을 사용하여 새 사용자 만들기

ASP.NET 다양한 로그인 웹 컨트롤과 함께 제공합니다. 이러한 컨트롤은 많은 일반적인 사용자 계정 및 로그인 관련 시나리오에 도움이 됩니다. CreateUserWizard 컨트롤은 멤버 자격 프레임워크에 새 사용자 계정을 추가하기 위한 사용자 인터페이스를 제공하도록 설계된 컨트롤 중 하나입니다.

다른 많은 로그인 관련 웹 컨트롤과 마찬가지로 CreateUserWizard는 한 줄의 코드를 작성하지 않고도 사용할 수 있습니다. 멤버 자격 공급자의 구성 설정을 기반으로 사용자 인터페이스를 직관적으로 제공하고 사용자가 필요한 정보를 입력하고 "사용자 만들기" 단추를 클릭한 후 클래스의 CreateUser 메서드를 내부적으로 호출 Membership 합니다. CreateUserWizard 컨트롤은 매우 사용자 지정할 수 있습니다. 계정 만들기 프로세스의 다양한 단계에서 발생하는 이벤트 호스트가 있습니다. 필요에 따라 이벤트 처리기를 만들어 계정 만들기 워크플로에 사용자 지정 논리를 삽입할 수 있습니다. 또한 CreateUserWizard의 모양은 매우 유연합니다. 기본 인터페이스의 모양을 정의하는 여러 속성이 있습니다. 필요한 경우 컨트롤을 템플릿으로 변환하거나 추가 사용자 등록 "단계"를 추가할 수 있습니다.

먼저 CreateUserWizard 컨트롤의 기본 인터페이스 및 동작을 사용하여 살펴보겠습니다. 그런 다음 컨트롤의 속성 및 이벤트를 통해 모양을 사용자 지정하는 방법을 살펴보겠습니다.

CreateUserWizard의 기본 인터페이스 및 동작 검사

폴더의 CreatingUserAccounts.aspx 페이지 Membership 로 돌아가서 디자인 또는 분할 모드로 전환한 다음 CreateUserWizard 컨트롤을 페이지 맨 위에 추가합니다. CreateUserWizard 컨트롤은 도구 상자의 로그인 컨트롤 섹션 아래에 제출됩니다. 컨트롤을 추가한 후 해당 ID 속성을 로 RegisterUser설정합니다. 그림 11의 스크린샷과 같이 CreateUserWizard는 새 사용자의 사용자 이름, 암호, 이메일 주소 및 보안 질문 및 답변에 대한 텍스트 상자가 있는 인터페이스를 렌더링합니다.

CreateUserWizard 컨트롤은 제네릭 만들기 사용자 인터페이스를 렌더링합니다.

그림 11: CreateUserWizard 컨트롤은 일반 만들기 사용자 인터페이스를 렌더링합니다(전체 크기 이미지를 보려면 클릭).

잠시 시간을 내어 CreateUserWizard 컨트롤에서 생성된 기본 사용자 인터페이스를 5단계에서 만든 인터페이스와 비교해 보겠습니다. 우선 CreateUserWizard 컨트롤을 사용하면 방문자가 보안 질문과 대답을 모두 지정할 수 있지만 수동으로 만든 인터페이스는 미리 정의된 보안 질문을 사용했습니다. CreateUserWizard 컨트롤의 인터페이스에는 유효성 검사 컨트롤도 포함되어 있지만 아직 인터페이스의 양식 필드에 유효성 검사를 구현하지 않았습니다. 또한 CreateUserWizard 컨트롤 인터페이스에는 "암호 확인" 텍스트 상자가 포함되어 있습니다("암호" 및 "암호 비교" 텍스트 상자에 입력한 텍스트가 같은지 확인하기 위해 CompareValidator와 함께).

흥미로운 점은 CreateUserWizard 컨트롤이 사용자 인터페이스를 렌더링할 때 멤버 자격 공급자의 구성 설정을 참조한다는 것입니다. 예를 들어 보안 질문 및 답변 텍스트 상자는 가 True로 설정된 경우에만 requiresQuestionAndAnswer 표시됩니다. 마찬가지로 CreateUserWizard는 자동으로 RegularExpressionValidator 컨트롤을 추가하여 암호 강도 요구 사항이 충족되도록 하고 , minRequiredNonalphanumericCharacters및 구성 설정을 기반으로 minRequiredPasswordLength해당 ErrorMessageValidationExpressionpasswordStrengthRegularExpression 속성을 설정합니다.

CreateUserWizard 컨트롤은 이름에서 알 수 있듯이 마법사 컨트롤에서 파생됩니다. 마법사 컨트롤은 다단계 작업을 완료하기 위한 인터페이스를 제공하도록 설계되었습니다. 마법사 컨트롤에는 임의의 개수의 WizardSteps가 있을 수 있으며, 각각은 해당 단계에 대한 HTML 및 웹 컨트롤을 정의하는 템플릿입니다. 마법사 컨트롤은 처음에 사용자가 한 단계에서 다음 단계로 진행하거나 이전 단계로 돌아갈 수 있도록 하는 탐색 컨트롤과 함께 첫 번째 WizardStep를 표시합니다.

그림 11의 선언적 태그에서 볼 수 있듯이 CreateUserWizard 컨트롤의 기본 인터페이스에는 두 가지가 포함됩니다. WizardSteps:

  • CreateUserWizardStep – 인터페이스를 렌더링하여 새 사용자 계정을 만들기 위한 정보를 수집합니다. 그림 11에 표시된 단계입니다.
  • CompleteWizardStep – 계정이 성공적으로 만들어졌음을 나타내는 메시지를 렌더링합니다.

CreateUserWizard의 모양과 동작은 이러한 단계 중 하나를 템플릿으로 변환하거나 고유한 WizardSteps를 추가하여 수정할 수 있습니다. 추가 사용자 정보 저장 자습서에서 등록 인터페이스에 를 추가하는 WizardStep 방법을 살펴보겠습니다.

CreateUserWizard 컨트롤이 작동하는 것을 살펴보겠습니다. 브라우저를 CreatingUserAccounts.aspx 통해 페이지를 방문합니다. 먼저 CreateUserWizard의 인터페이스에 잘못된 값을 입력합니다. 암호 강도 요구 사항을 준수하지 않는 암호를 입력하거나 "사용자 이름" 텍스트 상자를 비워 둡니다. CreateUserWizard에 적절한 오류 메시지가 표시됩니다. 그림 12는 암호가 충분하지 않은 사용자를 만들려고 할 때의 출력을 보여 드립니다.

CreateUserWizard 자동으로 유효성 검사 컨트롤 삽입

그림 12: CreateUserWizard 자동으로 유효성 검사 컨트롤 삽입(전체 크기 이미지를 보려면 클릭)

그런 다음 CreateUserWizard에 적절한 값을 입력하고 "사용자 만들기" 단추를 클릭합니다. 필요한 필드를 입력하고 암호의 강도가 충분하다고 가정하면 CreateUserWizard는 멤버 자격 프레임워크를 통해 새 사용자 계정을 만든 다음 의 인터페이스를 표시 CompleteWizardStep합니다(그림 13 참조). 내부적으로 CreateUserWizard는 5단계에서와 마찬가지로 메서드를 호출 Membership.CreateUser 합니다.

새 사용자 계정이 성공적으로 생성되었습니다.

그림 13: 새 사용자 계정이 성공적으로 생성되었습니다(전체 크기 이미지를 보려면 클릭).

참고

그림 13에서 CompleteWizardStep볼 수 있듯이 의 인터페이스에는 계속 단추가 포함됩니다. 그러나 이 시점에서 클릭하면 포스트백만 수행되어 방문자가 동일한 페이지에 남게 됩니다. "속성을 통해 CreateUserWizard의 모양 및 동작 사용자 지정" 섹션에서 이 단추가 방문자를 (또는 다른 페이지)로 보내도록 Default.aspx 하는 방법을 살펴봅니다.

새 사용자 계정을 만든 후 Visual Studio로 돌아가 그림 10에서와 같이 및 aspnet_Membership 테이블을 검사 aspnet_Users 하여 계정이 성공적으로 만들어졌는지 확인합니다.

속성을 통해 CreateUserWizard의 동작 및 모양 사용자 지정

CreateUserWizard는 속성, WizardSteps및 이벤트 처리기를 통해 다양한 방법으로 사용자 지정할 수 있습니다. 이 섹션에서는 속성을 통해 컨트롤의 모양을 사용자 지정하는 방법을 살펴보겠습니다. 다음 섹션에서는 이벤트 처리기를 통해 컨트롤의 동작을 확장하는 것을 살펴봅니다.

CreateUserWizard 컨트롤의 기본 사용자 인터페이스에 표시되는 거의 모든 텍스트는 다양한 속성을 통해 사용자 지정할 수 있습니다. 예를 들어 텍스트 상자 왼쪽에 표시되는 "사용자 이름", "암호", "암호 확인", "전자 메일", "보안 질문" 및 "보안 답변" 레이블은 각각 , , PasswordLabelTextConfirmPasswordLabelText, EmailLabelTextQuestionLabelTextAnswerLabelText 속성으로 UserNameLabelText사용자 지정할 수 있습니다. 마찬가지로 및 CompleteWizardStep의 "사용자 만들기" 및 "계속" 단추에 CreateUserWizardStep 대한 텍스트를 지정하는 속성과 이러한 단추가 Buttons, LinkButtons 또는 ImageButtons로 렌더링되는 경우 속성이 있습니다.

색, 테두리, 글꼴 및 기타 시각적 요소는 다양한 스타일 속성을 통해 구성할 수 있습니다. CreateUserWizard 컨트롤 자체에는 일반적인 웹 컨트롤 스타일 속성(, BackColor, BorderStyleCssClass, Font등)이 있으며 CreateUserWizard 인터페이스의 특정 섹션에 대한 모양을 정의하기 위한 다양한 스타일 속성이 있습니다. 속성은 instance 의 텍스트 상자에 CreateUserWizardStep대한 스타일을 정의하고 TitleTextStyle 속성TextBoxStyle제목의 스타일("새 계정에 등록")을 정의합니다.

모양 관련 속성 외에도 CreateUserWizard 컨트롤의 동작에 영향을 주는 여러 속성이 있습니다. 속성이 DisplayCancelButtonTrue로 설정된 경우 "사용자 만들기" 단추 옆에 취소 단추가 표시됩니다(기본값은 False). 취소 단추를 표시하는 경우 취소를 클릭한 후 사용자에게 전송되는 페이지를 지정하는 속성도 설정CancelDestinationPageUrl해야 합니다. 이전 섹션에서 설명한 것처럼 의 인터페이스에 있는 CompleteWizardStep계속 단추는 포스트백을 발생하지만 방문자는 동일한 페이지에 남습니다. 계속 단추를 클릭한 후 방문자를 다른 페이지로 보내려면 속성에 URL을 ContinueDestinationPageUrl지정하기만 하면 됩니다.

취소 단추를 표시하고 취소 또는 계속 단추를 클릭할 때 방문자를 Default.aspx 로 보내도록 CreateUserWizard 컨트롤을 업데이트 RegisterUser 해 보겠습니다. 이렇게 하려면 속성을 True로 설정하고 및 ContinueDestinationPageUrl 속성을 모두 CancelDestinationPageUrl "~/Default.aspx"로 설정합니다DisplayCancelButton. 그림 14는 브라우저를 통해 볼 때 업데이트된 CreateUserWizard를 보여줍니다.

CreateUserWizardStep에 취소 단추 포함

그림 14: CreateUserWizardStep 취소 포함 단추(전체 크기 이미지를 보려면 클릭)

방문자가 사용자 이름, 암호, 이메일 주소 및 보안 질문과 대답을 입력하고 "사용자 만들기"를 클릭하면 새 사용자 계정이 만들어지고 방문자가 새로 만든 사용자로 로그인됩니다. 페이지를 방문하는 사람이 스스로 새 계정을 만들고 있다고 가정하면 원하는 동작일 수 있습니다. 그러나 관리자가 새 사용자 계정을 추가하도록 허용할 수 있습니다. 이렇게 하면 사용자 계정이 만들어지지만 관리자는 새로 만든 계정이 아니라 관리자로 로그인된 상태로 유지됩니다. 이 동작은 부울 LoginCreatedUser 속성을 통해 수정할 수 있습니다.

멤버 자격 프레임워크의 사용자 계정에는 승인된 플래그가 포함됩니다. 승인되지 않은 사용자는 사이트에 로그인할 수 없습니다. 기본적으로 새로 만든 계정은 승인된 것으로 표시되므로 사용자가 즉시 사이트에 로그인할 수 있습니다. 그러나 새 사용자 계정을 승인되지 않은 것으로 표시할 수 있습니다. 관리자가 로그인하기 전에 새 사용자를 수동으로 승인하려고 할 수 있습니다. 또는 사용자가 로그온하도록 허용하기 전에 등록 시 입력한 전자 메일 주소가 유효한지 확인하려고 할 수도 있습니다. 어떤 경우든 CreateUserWizard 컨트롤의 DisableCreatedUser 속성을 True(기본값은 False)로 설정하여 새로 만든 사용자 계정을 승인되지 않은 것으로 표시할 수 있습니다.

참고의 다른 동작 관련 속성에는 및 가 MailDefinition포함됩니다AutoGeneratePassword. 속성이 AutoGeneratePassword True로 설정된 경우 는 CreateUserWizardStep "암호" 및 "암호 확인" 텍스트 상자를 표시하지 않습니다. 대신 새로 만든 사용자의 암호는 클래스의 GeneratePassword 메서드를 사용하여 Membership 자동으로 생성됩니다. 메서드는 GeneratePassword 구성된 암호 강도 요구 사항을 충족하기에 충분한 수의 영숫자가 아닌 문자를 사용하여 지정된 길이의 암호를 생성합니다.

속성은 MailDefinition 계정 생성 프로세스 중에 지정된 전자 메일 주소로 전자 메일을 보내려는 경우에 유용합니다. 속성에는 MailDefinition 생성된 전자 메일 메시지에 대한 정보를 정의하기 위한 일련의 하위 속성이 포함되어 있습니다. 이러한 하위 속성에는 , , Priority, IsBodyHtml, FromCC및 와 BodyFileName같은 Subject옵션이 포함됩니다. 속성은 BodyFileName 전자 메일 메시지의 본문을 포함하는 텍스트 또는 HTML 파일을 가리킵니다. 본문은 미리 정의된 두 자리 표시자 및 <%Password%>를 지원합니다<%UserName%>. 파일에 있는 BodyFileName 경우 이러한 자리 표시자는 방금 만든 사용자의 이름 및 암호로 바뀝 있습니다.

참고

컨트롤의 MailDefinition 속성은 CreateUserWizard 새 계정을 만들 때 전송되는 전자 메일 메시지에 대한 세부 정보만 지정합니다. 전자 메일 메시지가 실제로 전송되는 방법(즉, SMTP 서버 또는 메일 삭제 디렉터리가 사용되는지 여부, 인증 정보 등)에 대한 세부 정보는 포함되지 않습니다. 이러한 하위 수준 세부 정보는 의 섹션에서 Web.config정의 <system.net> 해야 합니다. 이러한 구성 설정 및 일반적으로 ASP.NET 2.0에서 전자 메일을 보내는 방법에 대한 자세한 내용은 SystemNetMail.com FAQ 및 ASP.NET2.0에서 Email 보내기 문서를 참조하세요.

이벤트 처리기를 사용하여 CreateUserWizard의 동작 확장

CreateUserWizard 컨트롤은 워크플로 중에 여러 이벤트를 발생합니다. 예를 들어 방문자가 사용자 이름, 암호 및 기타 관련 정보를 입력하고 "사용자 만들기" 단추를 클릭하면 CreateUserWizard 컨트롤이 이벤트를CreatingUser 발생합니다. 만들기 프로세스 CreateUserError 중에 문제가 발생하면 이벤트가 발생합니다. 그러나 사용자가 성공적으로 만들어 CreatedUser 지면 이벤트가 발생합니다. 추가 CreateUserWizard 컨트롤 이벤트가 발생하지만 가장 게르만인 세 가지 이벤트입니다.

특정 시나리오에서는 적절한 이벤트에 대한 이벤트 처리기를 만들어 수행할 수 있는 CreateUserWizard 워크플로를 활용할 수 있습니다. 이를 설명하기 위해 사용자 이름 및 암호에 RegisterUser 몇 가지 사용자 지정 유효성 검사를 포함하도록 CreateUserWizard 컨트롤을 개선해 보겠습니다. 특히 사용자 이름에 선행 또는 후행 공백을 포함할 수 없고 사용자 이름이 암호의 아무 곳에도 나타날 수 없도록 CreateUserWizard를 개선해 보겠습니다. 한마디로 누군가가 "Scott"과 같은 사용자 이름을 만들거나 "Scott" 및 "Scott.1234"와 같은 사용자 이름/암호 조합이 없도록 방지하려고 합니다.

이를 위해 추가 유효성 검사를 수행하기 위해 이벤트에 대한 CreatingUser 이벤트 처리기를 만듭니다. 제공된 데이터가 유효하지 않으면 만들기 프로세스를 취소해야 합니다. 또한 페이지에 레이블 웹 컨트롤을 추가하여 사용자 이름 또는 암호가 유효하지 않음을 설명하는 메시지를 표시해야 합니다. 먼저 CreateUserWizard 컨트롤 아래에 Label 컨트롤을 추가하고 속성을 로 설정하고 속성을 IDInvalidUserNameOrPasswordMessageForeColorRed설정합니다. 해당 Text 속성을 지우고 해당 EnableViewStateVisible 속성을 False로 설정합니다.

<asp:Label runat="server" id="InvalidUserNameOrPasswordMessage"
     Visible="false" ForeColor="Red" EnableViewState="false">

</asp:Label>

다음으로, CreateUserWizard 컨트롤의 CreatingUser 이벤트에 대한 이벤트 처리기를 만듭니다. 이벤트 처리기를 만들려면 Designer 컨트롤을 선택한 다음 속성 창 이동합니다. 여기에서 번개 모양 아이콘을 클릭한 다음 적절한 이벤트를 두 번 클릭하여 이벤트 처리기를 만듭니다.

다음 코드를 CreatingUser 이벤트 처리기에 추가합니다.

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e)
{
     string trimmedUserName = RegisterUser.UserName.Trim();
     if (RegisterUser.UserName.Length != trimmedUserName.Length)
     {
          // Show the error message
          InvalidUserNameOrPasswordMessage.Text = "The username cannot contain leading or trailing spaces.";
          InvalidUserNameOrPasswordMessage.Visible = true;

          // Cancel the create user workflow
          e.Cancel = true;
     }
     else
     {
          // Username is valid, make sure that the password does not contain the username

          if (RegisterUser.Password.IndexOf(RegisterUser.UserName, StringComparison.OrdinalIgnoreCase) >= 0)
          {
               // Show the error message
               InvalidUserNameOrPasswordMessage.Text = "The username may not appear anywhere in the password.";
               InvalidUserNameOrPasswordMessage.Visible = true;
               // Cancel the create user workflow
               e.Cancel = true;
          }
     }
}

CreateUserWizard 컨트롤에 입력된 사용자 이름과 암호는 각각 및 Password 속성을 통해 UserName 사용할 수 있습니다. 위의 이벤트 처리기에서 이러한 속성을 사용하여 제공된 사용자 이름에 선행 또는 후행 공백이 포함되어 있는지 여부와 암호 내에서 사용자 이름을 찾을 수 있는지 여부를 확인합니다. 이러한 조건 중 하나가 충족되면 레이블에 InvalidUserNameOrPasswordMessage 오류 메시지가 표시되고 이벤트 처리기의 e.Cancel 속성이 로 true설정됩니다. 가 로 true설정된 경우 e.Cancel CreateUserWizard는 워크플로를 단락하여 사용자 계정 만들기 프로세스를 효과적으로 취소합니다.

그림 15는 사용자가 선행 공백이 있는 사용자 이름을 입력할 때의 CreatingUserAccounts.aspx 스크린샷을 보여 줍니다.

선행 또는 후행 공백이 있는 사용자 이름은 허용되지 않습니다.

그림 15: 선행 또는 후행 공백이 있는 사용자 이름은 허용되지 않습니다(전체 크기 이미지를 보려면 클릭).

참고

추가 사용자 정보 저장 자습서에서 CreateUserWizard 컨트롤의 이벤트를 사용하는 예제를 볼 수 있습니다.CreatedUser

요약

클래스의 CreateUser 메서드는 Membership 멤버 자격 프레임워크에 새 사용자 계정을 만듭니다. 구성된 멤버 자격 공급자에 대한 호출을 위임하여 이 작업을 수행합니다. 의 SqlMembershipProvider경우 메서드는 CreateUseraspnet_Membership 데이터베이스 테이블에 레코드를 aspnet_Users 추가합니다.

5단계에서 보았듯이 새 사용자 계정을 프로그래밍 방식으로 만들 수 있지만 CreateUserWizard 컨트롤을 사용하는 것이 더 빠르고 쉬운 방법입니다. 이 컨트롤은 사용자 정보를 수집하고 멤버 자격 프레임워크에서 새 사용자를 만들기 위한 다단계 사용자 인터페이스를 렌더링합니다. 이 컨트롤은 5단계에서 검사한 것과 동일한 Membership.CreateUser 메서드를 사용하지만 컨트롤은 사용자 인터페이스, 유효성 검사 컨트롤을 만들고 코드 핥기를 작성하지 않고도 사용자 계정 만들기 오류에 응답합니다.

이 시점에서 새 사용자 계정을 만들 수 있는 기능이 있습니다. 그러나 로그인 페이지는 두 번째 자습서에서 다시 지정한 하드 코딩된 자격 증명에 대해 유효성을 검사하고 있습니다. 다음 자습서에서는 멤버 자격 프레임워크에 대해 사용자가 제공한 자격 증명의 유효성을 검사하도록 업데이트 Login.aspx 합니다.

행복한 프로그래밍!

추가 정보

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

저자 정보

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