블로그 이미지
Welcome to Tim's blog 딤스

카테고리

분류 전체보기 (13)
JAVA (4)
ASP.NET (8)
SECURITY (1)
ETC (0)
Total
Today
Yesterday

6. 보안 인증

ASP.NET / 2018. 12. 5. 16:36
- ASP.NET 인증 종류
 Windows : 윈도우 기본 계정을 사용. IIS 인증, 인트라넷에서 활용
 Passport : MS Passport 파트너로 등록된 사이트에서 사용자 프로필 공유. 상용서비스
 None : 사용자 직접 인증
 Forms : ASP.NET 2.0에 제공하는 ASP를 사용하여 인증처리함

- 인증선택은 Web.config 에서 기본적으로 설정해줌.
<configuration>
    <system.web>
        <authentication mode="Forms" />   
    </system.web> 
</configuration>

- <forms> 요소 특성
cookieless : 인증쿠키 사용 여부
defaultUrl :  인증후 리디렉션할 기본URL
domain : 쿠키 공유 도메인
loginUrl : 유효인증 체크 후 실패시 리디렉션할 URL
name : 인증 쿠키의 이름지정
path : 쿠키의 경로 지정
protection : 쿠키에 사용되는 암호화 유형 지정 (Validation, None, Encryption, All)
timeout : 쿠키만료 시간 (정수단위, 기본값 30분)
slidingExpiration : 상대만료 설정 여부

- 권한
ex) secured" 폴더의 권한 부여

<location path="secured">
    <system.web>
<allow roles="Admins"/>
<deny users="*"/>
    </system.web>
</location>



Ex1_Defailt.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = User.Identity.Name + " 님 환영합니다.!!!";
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
        Response.Redirect("Ex01_Login.aspx");
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>제목 없음</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br />
        <asp:Button ID="Button1" runat="server" Text="로그아웃" OnClick="Button1_Click" />
    </div>
    </form>
</body>
</html>


Ex1_Login.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        if ((TextBox1.Text == "aaaa") && (TextBox2.Text == "aaaa"))
            FormsAuthentication.RedirectFromLoginPage(TextBox1.Text, CheckBox1.Checked);
        else
            Label1.Text = "아이디와 비밀번호가 일치하지 않습니다.";
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>제목 없음</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table>
                <tr>
                    <td>아이디 :</td>
                    <td><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
                </tr>
                <tr>
                    <td>비밀번호 :</td>
                    <td><asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox></td>
                </tr>
                <tr>
                    <td>쿠키 유지 여부 :</td>
                    <td><asp:CheckBox ID="CheckBox1" runat="server" /></td>
                </tr>
            </table>
            <asp:Button ID="Button1" runat="server" Text="로그인" OnClick="Button1_Click" /><br />
            <asp:Label ID="Label1" runat="server" ForeColor="red"></asp:Label>
        </div>
    </form>
</body>
</html>


Web.config
      <authentication mode="Forms">
        <forms name=".ASPXAUTH" loginUrl="Ex01_Login.aspx" defaultUrl="Ex01_Default.aspx"></forms>
      </authentication>






- 로그인 컨트롤
CreateUserWizard : 사용자 정보를 입력받아 새로운 사용자를 만들어 줌
Login : 로그인 기능 제공
LoginView : 인증된 사용자와 익명 사용자에게 보여줄 화면을 구분하여 나타내줌
LoginName : 인증된 사용자의 이름 표시
LoginStatus : 로그아웃, 로그인 상태 표시
ChangePassword : 암호 수정 기능 제공
PasswordRecovery : 암호 찾기 기능 제공


- 멤버 자격 (Membership)
2.0에서 제공하는 로그인 컨트롤, 멤버 자격 API, 멤버 자격 공금자(Membership Provider)가 서로 유기적으로 동작하여 보안 프로세스(사용자 생성, 로그인, 로그아웃 등등)와 관련된 작업을 자동으로 처리해 주는 기능을 말한다.

      로그인 컨트롤
              ↓
                  멤버 자격 API
  ↓
[멤버 자격 공급자]
SqlMembership Provider                Access MembershipProvider             사용자 지정 멤버 자격 공급자
 ↓                                                ↓                                                  ↓
[데이터 소스]  
             ↓                                                ↓                                                  ↓
       SQL Server                               JET(Access)                               사용자 지정 데이터 소스


멤버 자격 공금자는 보안 프로세스와 관련된 작업을 자동으로 처리한다.
개발자는 멤버 자격 API를 사용하여 프로그래밍 방식으로 멤버 자격를 사용할 수 있고,  내부적으로 멤버 자격 API를 사용하는 로그인 컨트롤을 통해 어떠한 코드도 작성하지 않고 멤버 자격을 사용할 수 있다.

각 데이터 소스에는 그에 맞는 멤버 자격 공급자가 연결되며 ASP.NET 2.0은 기본적으로 SQLServer와 연결되 SqlMembershipProvider를 사용한다.

멤버 자격 공급자는 Machine.config 파일에서 확인 할 수 있다. (c:\window\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.config)
파일에서 <add> 요소는 보안 프로세스와 관련된 여러 가지 특성들을 포함하고 있다.
name : 공급자의 이름을 지정
type : MembershipProvider 추상 기본 클래스를 구현하는 방식을 지정
conncetionStringName : <connectionStrings> 요소에 정의된 연결 문자열의 이름을 지정.
                       즉, 멤버 자격 공급자에 사용할 연결 문자열을 지정
enablePasswordRetrieval : 멤버 자격에서 암호 찾기를 지원하는지의 여부를 지정. True면 암호 찾기를 지원
enablePasswordReset : 멤버 자격에서 암호 수정을 지원하는의 여부를 지정.
                                   기본값은 SQL공급자의 경우 Ture, Active Directory 공급자의 경우 False
requireQuestionAndAnswer : 멤버 자격에서 암호를 다시 설정하거나 찾기 위해 보안 대답이 필요한지 여부를 지정
                                          SQL 공급자의 경우 True, Active Directory는 False
                                          True면 암호를 다시 설정하거나 찾기 위해 보안 대답이 필요
requireUniqueEmail : 사용자 생성 시 입력하는 전자메일의 유일성(Unique) 체크 여부를 지정
                               SQL 공급자의 경우 True, Active Directory는 False
                               True면 사용자 생성 시 입력하는 전자메일이 다른 사용자의 전자메일과 중복되면 안됨.
passwordFormat : 저장될 암호의 형식을 지정.
                          Clear : 암호가 암호화되지 않음
                          Encrypted : 암호가 <machineKey> 요소에 지정된 암호화 설정을 사용하여 암호화
                          Hashed(기본값) : 암호가 SHA1 해시 알고리즘을 사용하여 단방향으로 암호화
maxInvalidPasswordAttempts : 허용되는 잘못된 암호 또는 보안 대답 시도 횟수를 지정함.
                                            만약 횟수가 구성된 값과 일치하면 해당 계정은 자동으로 차단. 기본값은 5
minRequirePasswordLength : 암호의 최소 문자 수. 기본값은 1, 0~128까의 범위
minRequireNonalphanumericCharaters : 유효한 암호에 포함되어야 할 최소 특수 문자(!, @, ?, $ 등등) 수를 지정
                                                        기본값은 1, 범위는 0~128 또는 minRequirePasswordLength 값보다 큰 값 X

<configuration>
     <connectionStrings>
         <add name="불라불라" connectionString="datasource=.\   ~~~>
     </connectionStrings>

     <system.web>
         <membership>
             <providers>
                 <add ~~~>
             </providers>
         </membership>
     </system.web>
</configuration>
Machine.config 파일에 기본적으로 정의되어 있는 멤버 자격 공급자를 보면 이 공급자가 SQL Server 2005 Express (SQL Server Experss)를 사용한다.



- CreateUserWizard

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Register.aspx.cs" Inherits="Register" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

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

            <WizardSteps>

                <asp:CreateUserWizardStep runat="server" />

                <asp:CompleteWizardStep runat="server" />

            </WizardSteps>

        </asp:CreateUserWizard>  

    </div>

    </form>

</body>

</html>

 








회원관리 서비스에 사용자를 추가하려면 마이크로소프트 SQL 서버 익스프레스 에디션(2005) 데이터 저장소에 등록한다.
회원관리 시스템을 위한 마이크로소프트 SQL 서버 데이터 공급자는 회원관리 서비스에 특화된 SQL 서버 익스트레스 버전 파일을 사용할 수 있다.
ASP.NET은 이 특정 파일이 기존에 존재하지 않을 경우 자동으로 생성한다.
ASPNETDB.MDF 파일을 생성하려면 회원관리 서비스를 활용하는 ASP.NET 서버 컨트롤로 다룬다.
ASPNETDB.MDF 파일이 애플리케이션에 필요할 때 ASP.NET 2.0은 이 파일을 App_Data 폴더 안에 생성한다.
(aspnet_Membership 테이블에 저장)



<add> 요소의 특성을 수정하면 수정된 설정내용이 컨트롤에 그대로 반영.
예를 들어, <add> 요소에서 requiresQuestionAndAnswer특성값을 False로 지정하면, CreateUserWizard 컨트롤에서 보안 질문과 보안 대답 부분은 나타나지 않는다.

<사용자 만들기> 버튼을 클릭하면 새로운 사용자가 생성.
사용자 정보를 입력하고 <사용자 만들기> 버튼을 클릭하면 App_Data 폴더 하위에  ASPNETDB.MDF 파일이 생성되는데, 사용자 정보는 바로 이곳에 저장.

ASPNETDB.MDF 파일이 생성되는 이유는 machine.config 파일에서 멤버 자격 공급자가 사용하는 연결 문자열의 특성 중 connectionString 특성의 값이 아래와 같이 정의되었기 때문이다.
<connectionStrings>
        <add name= ~~ connectionString="datasource=.\SQLEXPRESS;Integrated
                 Seurity=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf ~~>
</connectionStrings>


멤버 자격에서 로그인 컨트롤과 데이터 소스 사이에 위치해 있으면서 핵심적인 역할을 하는 멤버 자격 공급자는 기본적으로 Machine.config 파일에 정의되어 있으며, SQL Server 2005 Experss 파일 기반 데이터베이스에 연결하는 LocalSqlServer 라는 문자열을 사용한다.




- Login

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <div>  

        <asp:Login ID="Login1" runat="server">

        </asp:Login>   

    </div>

    </form>

</body>

</html>

  




- PasswordRecovery, ChangePassword

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="UserInfo.aspx.cs" Inherits="UserInfo" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

    <asp:ChangePassword ID="ChangePassword1" runat="server">

    </asp:ChangePassword>

    <div> 

        <br />

        <asp:PasswordRecovery ID="PasswordRecovery1" runat="server">

        </asp:PasswordRecovery> 

    </div>

    </form>

</body>

</html>




이 컨트롤이 제대로 동작하기 위해서는 멤버 자격 공급자를 정의하는 <add>요소의 passwordFormat특성이 Clear 또는 Encrypted인 상태에서 사용자를 생성,
<add> 요소의 enablePasswordRetrieval 특성이 True로 지정되어 있어야한다.
만약 <add> 요소의 passwordFormat 특성이 Hashed인 상태에서 사용자를 생성하면 암호가 해시 알고리즘으로 암호화되어 암호를 다시 찾을 수 없게 되며 ChangePassword 컨트롤 또한 제기능을 하지 못함.



암호를 찾기 위해 사용자 이름을 입력하고 질문에 답했을 경우
임시 비밀 번호를 바로 보여주는 게 아니라 사용자 메일로 보내게 하기 위해서
web.config 파일에 SMTP 서버 설정하는 코드 삽입
 

<!-- 메일 서버 세팅 : windows server 2008에서만 에러안남-->

  <system.net>

    <mailSettings>

      <smtp deliveryMethod="Network" from="admin@aaa.com">

        <network defaultCredentials="true" host="localhost" />

      </smtp>

    </mailSettings>

  </system.net>



'ASP.NET' 카테고리의 다른 글

4. 디버깅  (0) 2018.12.05
3-2 마스터 페이지  (0) 2018.12.05
3-1. 테마  (0) 2018.12.05
2-2. 표준컨트롤, 서버컨트롤  (0) 2018.12.05
2-1. 웹폼  (0) 2018.12.05
Posted by 딤스
, |

최근에 달린 댓글

글 보관함