Programming/.NET

 1. CreateUserWizard를 이용한 사용자 추가

 

ASP.NET에서는 회원가입을 통한 간단한 사용자 추가기능을 제공합니다. 사용자가 존재해야 해당 사용자의 정보를 확인하고 인증처리를 수행할 수 있을 것입니다.

 

웹페이지에 다음과 같이 CreateUserWizard 컨트롤을 끌어다 놓습니다.

 

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
    <WizardSteps>
        <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
        </asp:CreateUserWizardStep>
        <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
        </asp:CompleteWizardStep>
    </WizardSteps>
</asp:CreateUserWizard>

 

이 컨트롤을 끌어다 놓는 것으로 사용자 추가(회원가입)를 위한 기능이 마련된 것입니다. CreateUserWizardStep 템플릿은 회원가입을 받는 입력폼 템플릿이며 CompleteWizardStep는 회원가입 후 축하메세지등을 보이기 위한 템플릿입니다.

 

 

페이지를 실행시킨뒤 입력칸을 채우고 'Create User'버튼을 누릅니다.

 

 

사용자가 성공적으로 생성되었습니다. 만약 membership에 관한 공급자설정을 따로 변경하지 않았다면 이 사용자의 정보는 내부 App_Data폴더에 있는 mdf파일에 저장될 것입니다.(mdf가 없으면 자동생성하지만 App_Data폴더에 적절한 권한이 부여되어 있어야 합니다.) 내부 mdf가 아닌 외부 DB서버에 데이터저장을 설정하고자 한다면 web.config를 수정하여 membership 공급자설정을 변경해야 합니다.

 

<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, 

System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 

connectionStringName="sqlprovider" enablePasswordRetrieval="false" enablePasswordReset="true" 

requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" 

passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" 

minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" 

passwordStrengthRegularExpression=""/>
  </providers>
</membership>

 

위 예제는 기본공급자 설정에서 connectionStringName만 수정해 DB연결정보를 바꾼것입니다. sqlprovider는 web.config에 다음과 비슷한 형태로 연결정보가 정의되어 있다는 것을 가정합니다.

 

<connectionStrings>

   <add name="sqlprovider" connectionString="Data Source=localhost;Initial 

Catalog=aspnetdb;User ID=sa;Password=1234!;"/>
</connectionStrings>

 

그 밖에도 여러가지 설정사항이 있는데 이 설정을 통해서 회원가입에 대한 몇몇 규칙을 설정할 수 있습니다. 이를테면 minRequiredPasswordLength속성은 사용자가 암호를 설정할때 최소 암호길이를 지정하며 enablePasswordRetrieval은 암호 분실시 조회기능사용여부를 enablePasswordReset은 암호재설정 지원여부를 requiresQuestionAndAnswer은 보안용 질문과 대답을 받을지 여부를 requiresUniqueEmail은 이메일정보를 받을지의 여부를 PasswordFormat은 암호가 저장될때 암호화방식을 지정하는 속성입니다.

 

회원가입을 완료한 뒤 DB에 실제 사용자정보가 추가되어 있는지를 확인해 보겠습니다.

 

Select *
From [dbo].[aspnet_Membership];

 

 

CreateUserWizard 컨트롤은 기본적으로 아이디와 암호, 이메일, 보안질문/답변정보를 사용자에게 요구합니다. 그러나 필요에 따라서는 사용자에게 추가적인 정보를 요구할 수도 있는데 추가적인 정보를 요구하는 방법에 대해 알아보겠습니다.

 

예제에서는 사용자의 나이에 대한 정보를 요구해야 한다고 가정하겠습니다.

 

aspx의 디자인모드로 이동해서 CreateUserWizard 컨롤의 스마트태그를 클릭합니다. 그리고 스마트태그 메뉴에서 Customize Create User Step을 클릭하십시오.

 

위 작업과정을 거치신 후 다시 소스보기를 하시면 기본템플릿에 대한 ContentTemplate HTML코드가 나열된 것이 보일 것입니다.

 

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
    <WizardSteps>
        <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server">
            <ContentTemplate>
                <table>
                    <tr>
                        <td align="center" colspan="2">Sign Up for Your New Account</td>
                    </tr>
                    <tr>
                        <td align="right">

                            <asp:Label ID="UserNameLabel" runat="server" 

AssociatedControlID="UserName">User Name:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="UserName" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="UserNameRequired" runat="server" 

ControlToValidate="UserName" ErrorMessage="User Name is required." ToolTip="User Name is required." 

ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">

Password:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="PasswordRequired" runat="server" 

ControlToValidate="Password" ErrorMessage="Password is required." ToolTip="Password is required." 

ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <asp:Label ID="ConfirmPasswordLabel" runat="server" 

AssociatedControlID="ConfirmPassword">Confirm Password:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="ConfirmPassword" runat="server" TextMode="Password"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="ConfirmPasswordRequired" runat="server" 

ControlToValidate="ConfirmPassword" ErrorMessage="Confirm Password is required." 

ToolTip="Confirm Password is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">E-mail:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="Email" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="EmailRequired" runat="server" ControlToValidate="Email" 

ErrorMessage="E-mail is required." ToolTip="E-mail is required." ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <asp:Label ID="QuestionLabel" runat="server" AssociatedControlID="Question">

Security Question:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="Question" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="QuestionRequired" runat="server" ControlToValidate="Question" 

ErrorMessage="Security question is required." ToolTip="Security question is required." 

ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">
                            <asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="Answer">

Security Answer:</asp:Label>
                        </td>
                        <td>
                            <asp:TextBox ID="Answer" runat="server"></asp:TextBox>
                            <asp:RequiredFieldValidator ID="AnswerRequired" runat="server" ControlToValidate="Answer" 

ErrorMessage="Security answer is required." ToolTip="Security answer is required." 

ValidationGroup="CreateUserWizard1">*</asp:RequiredFieldValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="center" colspan="2">
                            <asp:CompareValidator ID="PasswordCompare" runat="server" ControlToCompare="Password" 

ControlToValidate="ConfirmPassword" Display="Dynamic" 

ErrorMessage="The Password and Confirmation Password must match." ValidationGroup="CreateUserWizard1">

</asp:CompareValidator>
                        </td>
                    </tr>
                    <tr>
                        <td align="center" colspan="2" style="color:Red;">
                            <asp:Literal ID="ErrorMessage" runat="server" EnableViewState="False"></asp:Literal>
                        </td>
                    </tr>
                </table>
            </ContentTemplate>
        </asp:CreateUserWizardStep>
        <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
        </asp:CompleteWizardStep>
    </WizardSteps>
</asp:CreateUserWizard>.

 

위 내용을 수정하여 E-Mail아래 나이를 입력받을 수 있는 필드를 하나 추가해 보도록 하겠습니다.

 

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

 

위와 같이 수정 후 페이지를 실행해 보면 추가한 나이 입력칸이 보임을 알 수 있습니다. CreateUserWizard컨트롤로는 여기까지가 가능한 수준이며 이렇게 입력필드를 추가한다고 해도 실제 DB저장방식까지 바뀌지 않습니다. 따라서 별도의 테이블을 만들어 사용자의 나이를 저장할 수 있도록 해야 하는데 이때는 CreatedUser 이벤트를 사용합니다.

 

<asp:CreateUserWizard ID="CreateUserWizard1" runat="server"

OnCreatedUser="CreateUserWizard1_CreatedUser">

 

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
    TextBox txt_age = CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Age") as TextBox;
    Response.Write(txt_age.Text);
}

 

CreateUserWizard 컨트롤의 ContentTemplate안에 생성한 컨트롤은 직접적으로 접근할 수 없기 때문에 ContentTemplate내부에서 필요한 컨트롤을 위와같이 직접 찾아야 합니다. 이런 방법으로 컨트롤의 속성값을 가져와 사용자가 생성될때 필요한 DB처리를 수행하면 됩니다.

 

 2. CreateUser API를 이용한 사용자 추가

 

사용자 추가 부분은 굳이 컨트롤을 이용하지 않고도 코드를 통해 수행할 수 있습니다. Membership 클래스의 CreateUser 메소드를 이용하는 것입니다.

 

Membership.CreateUser("anchor37", "a1234%^");

 

이 메소드도 대략 5가지 정도로 오버로드되어 있는데 최종적으로 앞서 살펴보았던 CreateUserWizard컨트롤에서 입력된 모든 사항을 등록할 수 있습니다.

 

CreateUserWizard컨트롤은 필요한 정보를 입력받을 때 부터 잘못된 입력값을 차단하지만(예를 들어 비밀번호등) API를 이용하면 UI에서 직접 처리하지 않는한 이를 차단할 방법이 없기 때문에 잘못된 정보가 입력되려 하면 대신 예외를 발생시킵니다.

 

try
{
    Membership.CreateUser("anchor37", "123");
}
catch (Exception ex) {
    Response.Write("다음과 같은 이유로 사용자를 생성하지 못했습니다.<br />" + ex.Message);
}

 

좀더 자세한 정보를 사용자에게 제공하려면 StatusCode속성을 활용해도 됩니다.

 

try
{
    Membership.CreateUser("anchor37", "123");
}
catch (MembershipCreateUserException ex) {
    switch (ex.StatusCode) {
        case MembershipCreateStatus.InvalidPassword:
            Response.Write("비밀번호 입력이 잘못되었습니다.");
            break;
        case MembershipCreateStatus.InvalidEmail:
            Response.Write("이메일 형식이 맞지 않습니다.");
            break;
        default:
            Response.Write(ex.Message);
            break;
    }
}.

 

이 외에도 DulicateEmail, DuplicateProviderUserKey, DuplicateUserName, InvaildAnswer, InvaildProviderUserKey, InvaildQuestion, InvaildUserName, ProviderError, Success, UserRejected등의 오류코드를 사용할 수 있습니다.

0 0