천객만래 [千客萬來] (It has an interminable succession of visitors)

현재 우리 회사 솔루션의 ASP.NET 웹 애플리케이션에는, 빈번하게 사용되는 개인 정보(혹은 설정값)을 담는 용도로 쿠키를 사용하고 있다. 쿠키는 사실 참 편리하다. 서버의 리소스를 점유하지도 않고, 만료기간만 지정해두면 서버가 다운되건 말건 계속 유지도 되고.. 서버사이드, 클라이언트 사이드 어디서나 쉽게 접속할 수 있기도 하고.

하지만, 솔루션에 대한 보안 감사 끝에.. 쿠키를 제거하기로 결정이 되었다. 사실 보안 측면에서 보자면 쿠키라는 것은 꽤 위험하다. 문제는 이 쿠키가 클라이언트에 저장되는 Plain Text파일인데다가, 모든 Web Server에 대한 Request/Response시에 전송이 된다는 것이다. 즉, 클라이언트에서 이 파일을 열어 볼 수도 있고, 네트워크 패킷을 스니핑해서 내용을 볼 수도 있다. 거기다가 위/변조하기도 당연히 쉽다. 또 일부 국가 - 어딘지는 잘 모른다 - 에서는 법적으로 쿠키를 금지하기도 하고, Internet Explorer등의 브라우저에서도 쿠키를 허용하지 않는 옵션을 장착하고 있기 때문에 어떤 사용자들의 경우 쿠키를 아예 사용할 수 없을 가능성도 있는 것이다.

서두가 장황했는데, 암튼 쿠키를 모두 제거하기로 하고 우리가 선택한 대안은 ASP.NET 세션이었다. 사실 빈번하게 사용되는 사용자 개인의 설정값등을 담아둘 수 있는 가장 이상적인 공간이기도 하고, 쿠키와 매우 유사하게 서버사이드에서 사용할 수도 있기 때문이었다. 하지만 이 ASP.NET 세션에는 한 가지 문제가 있다. 그 문제는 바로, 이 ASP.NET 세션이 기본적으로 쿠키를 사용한다는 것이다.

ASP.NET 세션을 사용하면 생성되는 쿠키는 이렇게 생겼다.

ASP.NET_SessionId=d1ucyg30qyjw1f554szadoqy;

즉, ASP.NET 세션에서 각 사용자를 구분하는 것 자체가 이 쿠키를 사용하는 것이다.

그런데, ASP.NET에는 Cookie-less Session이라고 해서, 쿠키를 사용하지 않고 세션을 사용할 수 있게 해주는 모드 또한 있다. 이것은 별도의 코딩이 필요한 것은 아니고 단지 Web.Config의 SessionState 부분에 Cookieless를 True로 바꿔주기만 하면 된다.

<sessionState
            mode="InProc"
            stateConnectionString="tcpip=127.0.0.1:42424"
            sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
           
cookieless="true"
            timeout="20"
    />

이 Cookie-less Session에 대한 자세한 내용은 Dino Esposito씨의 다음 Article을 보면 알 수 있다.

위 아티클을 보면 알 수 있겠지만, 이 Cookieless Session은 세션을 쓰면서도 Cookie를 완전히 쓰지 않아도 된다는 점에서 나의 고민을 완벽하게 해주는 것이었다. 그러나 나는 몇 가지 문제를 발견했다..-_-;;

첫째로 이 Cookieless Session을 쓸 경우 모든 URL이 조금씩 바뀌게 된다는 것이다. 즉, 요청한 URL이 이렇다면..

http://localhost/CookielessSessionWebSample/Webform1.aspx

실제로 페이지가 열린 다음에는 이렇게 바뀌게 된다.

http://localhost/CookielessSessionWebSample/(mkwgif552tavi2vtxhgq1a45)/Webform1.aspx

위의 URL에 가운데 부분에 이상하게 끼어든 (mkwgif552tavi2vtxhgq1a45)이 바로 쿠키의 SessionID의 역할을 하는 것이다. 즉 쿠키를 쓰는 대신에 URL에 세션ID를 넣어서 사용한다고 생각하면 되겠다.

두번째로 바로 위 사실 때문에 몇가지 제약 사항이 발생한다. Server.Transfer와 Response.Redirect 등을 사용할 때, Root로부터 시작하는 URL 즉 이런 형태 - /RootDir/Somepage.aspx - 를 사용하지 못하며, Full URL - http://ServerName/RootDir/Somepage.aspx - 를 또한 사용하지 못한다. 이 사실은 EggHeadCafe라는 사이트의 한 게시물에서 알게 되었다.

첫번째 문제가 Accept된다면, 사실 대부분의 경우 큰 문제는 없을 것이다. 두번째처럼 만약 코딩을 했다는 것은, 사실 코딩 상에 문제가 있는 거라고 봐야 하니까. 그런데 내 경우는 우리 회사의 솔루션에 저런 것이 없다고 장담하기가 힘들었다는 것이다. 그래서, 우리 솔루션의 경우는 쿠키의 세션ID는 허용하는 방향으로 가기로 했다.

하지만, 쿠키를 완전히 사용할 수 없는 경우가 발생한다면, Cookie-less Session은 매우 좋은 선택이 될 것이다. 그리고 이 Cookie-less Session을 사용한다면 위에서 언급한 코딩상의 주의 사항은 반드시 지켜야 할 것이다.

출처 : http://lazydeveloper.net/2567069

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요


USB 오토런 방지 프로그램

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요

USB 부팅 디스크 포맷 프로그램

반응형
Posted by 사용자 SB패밀리
TAG USB

댓글을 달아 주세요


이 대화 상자를 사용하면 데이터베이스의 테이블 사이에 관계를 만들거나 수정할 수 있습니다. 외래 키 관계에서 외래 키 제약 조건은 기본 키나 UNIQUE 제약 조건과 함께 사용되며 지정된 테이블 사이에 참조 무결성을 적용합니다. 예를 들어, Order_Details 테이블에서 ProductID 열에 외래 키 제약 조건을 두어 이 열에 입력한 값이 Products 테이블의 ProductID 열의 기존 값과 일치하도록 할 수 있습니다.

 

 

옵션

선택한 관계

기존 관계를 나열합니다. 관계를 선택하면 오른쪽 표에 해당 속성이 표시됩니다. 목록이 비어 있는 경우 테이블에 정의된 관계가 없음을 의미합니다.

추가

새 관계를 만듭니다. 관계를 유효하게 만들려면 테이블 및 열 사양을 먼저 설정해야 합니다.

삭제

선택한 관계 목록에서 선택한 관계를 삭제합니다. 관계 추가를 취소하려면 이 단추를 사용하여 관계를 제거합니다.

일반 범주

확장하여 만들거나 다시 활성화할 때 기존 데이터 검사테이블 및 열 사양을 표시합니다.

만들거나 다시 활성화할 때 기존 데이터 검사

제약 조건을 만들거나 다시 활성화하기 전부터 테이블에 있던 모든 데이터를 제약 조건에 대해 검사합니다.

테이블 및 열 사양 범주

확장하여 어떠한 테이블의 어떠한 열이 관계에서 외래 키와 기본 키(또는 고유 키)로 사용되는지에 대한 정보를 표시합니다. 이러한 값을 편집하거나 정의하려면 속성 필드의 오른쪽에 있는 줄임표(...)를 클릭합니다.

외래 키 기본 테이블

선택한 관계에서 외래 키로 사용되는 열이 포함된 테이블을 표시합니다.

외래 키 열

선택한 관계에서 외래 키로 사용되는 열을 표시합니다.

Primary/Unique 키 기본 테이블

선택한 관계에서 기본 키(또는 고유 키)로 사용되는 열이 포함된 테이블을 표시합니다.

Primary/Unique 키 열

선택한 관계에서 기본 키(또는 고유 키)로 사용되는 열을 표시합니다.

ID 범주

확장하여 이름설명에 대한 속성 필드를 표시합니다.

이름

관계의 이름을 표시합니다. 새 관계를 만들면 테이블 디자이너의 활성 창에 있는 테이블을 기반으로 한 기본 이름이 새 관계에 지정됩니다. 언제든지 이름을 변경할 수 있습니다.

설명

관계에 대해 설명합니다. 더 자세한 설명을 기록하려면 설명을 클릭한 다음 속성 필드의 오른쪽에 있는 줄임표(...)를 클릭합니다. 이렇게 하면 텍스트를 쓸 수 있는 더 큰 영역이 제공됩니다.

테이블 디자이너 범주

확장하여 만들거나 다시 활성화할 때 기존 데이터 검사복제에 적용에 대한 정보를 표시합니다.

복제에 적용

복제 에이전트가 이 테이블에서 삽입, 업데이트 또는 삭제를 수행할 때 제약 조건을 적용할지 여부를 나타냅니다. 자세한 내용은 NOT FOR REPLICATION으로 제약 조건, ID, 및 트리거 제어를 참조하십시오.

외래 키 제약 조건 적용

관계를 맺고 있는 열의 데이터를 변경할 때 외래 키 관계의 무결성 제약 조건을 위반하게 되는 경우 이러한 데이터를 변경할 수 있는지 여부를 지정합니다. 이러한 변경을 허용하지 않으려면 를 선택하고, 이를 허용하려면 아니요를 선택합니다.

INSERT 및 UPDATE 사양 범주

확장하여 관계의 삭제 규칙업데이트 규칙에 대한 정보를 표시합니다.

삭제 규칙

외래 키 관계를 맺고 있는 데이터가 포함된 행을 사용자가 삭제하려 할 때 적용할 결과를 지정합니다.

  • 작업 안 함 삭제가 허용되지 않고 DELETE가 롤백된다는 오류 메시지가 나타납니다.

  • 계단식 배열 외래 키 관계에 관련된 데이터가 포함된 모든 행을 삭제합니다.

  • Null 설정 테이블의 모든 외래 키 열에 null 값을 사용할 수 있으면 값을 null로 설정합니다. SQL Server 2005 에만 적용됩니다.

  • 기본값 설정 테이블의 모든 외래 키 열에 기본값이 정의되어 있으면 열에 정의된 기본값으로 값을 설정합니다. SQL Server 2005 에만 적용됩니다.

업데이트 규칙

외래 키 관계를 맺고 있는 데이터가 포함된 행을 사용자가 업데이트하려 할 때 적용할 결과를 지정합니다.

  • 작업 안 함 삭제가 허용되지 않고 DELETE가 롤백된다는 오류 메시지가 나타납니다.

  • 계단식 배열 외래 키 관계에 관련된 데이터가 포함된 모든 행을 삭제합니다.

  • Null 설정 테이블의 모든 외래 키 열에 null 값을 사용할 수 있으면 값을 null로 설정합니다. SQL Server 2005 에만 적용됩니다.

  • 기본값 설정 테이블의 모든 외래 키 열에 기본값이 정의되어 있으면 열에 정의된 기본값으로 값을 설정합니다. SQL Server 2005 에만 적용됩니다.
반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요


alter table 방법

--------------------테이블 컬럼추가------------------

ALter Table 테이블Name

ADD Test_Col nvarchar(100) Default  Null --null을 허용함

-------------------테이블 컬럼삭제--------------------

Alter Tble 테이블Name

DROP COLUMN MOBILE1

--열 삭제시 제약조건이 걸려있으면 제약조건부터 삭제

------------------테이블 제약조건 삭제방법------------

Alter Table 테이블Name

DROP CONSTRAINT 제약조건Name

-----------------테이블 열 형식 변경------------------

Alter Table 테이블Name

ALTER COLUMN NAME NVARCHAR(10) NULL

------------테이블끼리 릴레이션 정의--------------------

--With NoCheck 옵션 같은 경우는 기존에 제약조건에 의해 부모 데이터와 자식데이터의 PK,FK가 일치하지않아 충돌날경우를 대비해서 기존데이터는 무시하고 관계를 맺는것이다(외래키 제약조건)

Alter Table  테이블Name With NoCheck 

ADD CONSTRANT FK_USERTBL_BUYTBL

FOREIGN KEY(USERID)

REFERENCES USERTBL(USERID) --참조하는 부모테이블의 PK. 외래 키 제약 조건 적용

ON UPDATE CASCADE --부모테이블에서 업데이트시 자식테이블도 업데이트. 업데이트 규칙

ON DELETE CASCADE --부모테이블에서 삭제시 자식테이블도 자동 삭제. 삭제 규칙

-- NOT FOR REPLICATION -- 복제에 적용

반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요


출처 : http://support.microsoft.com/kb/316748/ko

이 문서에서는 다음 Microsoft .NET Framework 클래스 라이브러리의 네임스페이스를 참조합니다.
  • System.Text
  • System.DirectoryServices
  • System.Security.Principal
  • System.Web.Security



요약

Visual C# .NET에서 ASP.NET 웹 응용 프로그램 만들기

Visual C# .NET FormsAuthAd 라는 새 ASP.NET 웹 응용 프로그램을 만들려면 다음과 같이 하십시오.

  1. Microsoft Visual Studio .NET 시작하십시오.
  2. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트 를 클릭하십시오.
  3. 프로젝트 형식Visual C# 프로젝트 클릭한 다음 템플릿 에서 ASP.NET 웹 응용 프로그램 을 누릅니다.
  4. 위치 상자에 WebApplication1을 함께 FormsAuthAd 대체하십시오.
  5. 확인 을 클릭하십시오.
  6. 솔루션 탐색기에서 참조 노드를 마우스 오른쪽 단추로 클릭한 다음 참조 추가 클릭하십시오.
  7. 참조 추가 대화 상자에서 .NET 탭의 System.DirectoryServices.dll, 선택 을 클릭한 다음 확인 을 누릅니다.

인증 코드 작성

LdapAuthentication.cs 라는 새 클래스 파일을 만들려면 다음과 같이 하십시오.

  1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로, 추가 를 가리킨 다음 새 항목 추가 클릭하십시오.
  2. 클래스템플릿 에서 클릭하십시오.
  3. 이름 상자에 LdapAuthentication.cs 입력하고 열기 를 클릭하십시오.
  4. LdapAuthentication.cs 파일에서 기존 코드를 다음 코드로 바꿉니다.
    using System;
    using System.Text;
    using System.Collections;
    using System.DirectoryServices;
    
    namespace FormsAuth
    {	
      public class LdapAuthentication
      {
        private String _path;
        private String _filterAttribute;
    
        public LdapAuthentication(String path)
        {
          _path = path;
        }
    		
        public bool IsAuthenticated(String domain, String username, String pwd)
        {
          String domainAndUsername = domain + @"\" + username;
          DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);
    			
          try
          {	//Bind to the native AdsObject to force authentication.			
             Object obj = entry.NativeObject;
    
    	DirectorySearcher search = new DirectorySearcher(entry);
    
    	search.Filter = "(SAMAccountName=" + username + ")";
    	search.PropertiesToLoad.Add("cn");
    	SearchResult result = search.FindOne();
    
    	if(null == result)
    	{
      	  return false;
    	}
    
    	//Update the new path to the user in the directory.
    	_path = result.Path;
    	_filterAttribute = (String)result.Properties["cn"][0];
          }
          catch (Exception ex)
          {
            throw new Exception("Error authenticating user. " + ex.Message);
          }
    
    	return true;
         }
    
         public String GetGroups()
         {
           DirectorySearcher search = new DirectorySearcher(_path);
           search.Filter = "(cn=" + _filterAttribute + ")";
           search.PropertiesToLoad.Add("memberOf");
           StringBuilder groupNames = new StringBuilder();
    
           try
           {
             SearchResult result = search.FindOne();
    
    	 int propertyCount = result.Properties["memberOf"].Count;
    
       	 String dn;
    	 int equalsIndex, commaIndex;
    				
    	 for(int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++)
    	 {
    	   dn = (String)result.Properties["memberOf"][propertyCounter];
    
        	   equalsIndex = dn.IndexOf("=", 1);
    	   commaIndex = dn.IndexOf(",", 1);
    	   if(-1 == equalsIndex)
    	   {
    	     return null;
         	   }
    
               groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1));
    	   groupNames.Append("|");
    
        	 }
           }
           catch(Exception ex)
           {
             throw new Exception("Error obtaining group names. " + ex.Message);
           }			
           return groupNames.ToString();
         }
       }
    }
    					

인증 코드 도메인, 사용자 이름, 암호 및 Active Directory의 트리 경로를 입력할 수 있습니다. 이 코드는 LDAP 디렉터리 공급자를 사용합니다.

Logon.aspx 페이지에 코드 LdapAuthentication.IsAuthenticated 메서드 호출 및 사용자로부터 수집한 자격 증명을 전달합니다. 그런 다음 DirectoryEntry 개체는 디렉터리 트리, 사용자 이름 및 암호를 경로가 만들어집니다. 사용자 이름은 "도메인\사용자 이름" 형식이어야 합니다. DirectoryEntry 개체를 다음 NativeObject 속성을 가져오는 AdsObject 바인딩 강제로 시도합니다. 이 작업이 성공하면 사용자가 CN 특성 DirectorySearcher 개체 만들기 및 SAMAccountName에 대한 필터링을 얻을 수 있습니다. 사용자가 인증된 후에는 IsAuthenticated 메서드는 true 를 반환합니다.

사용자가 속한 그룹 목록을 얻으려면 이 코드 LdapAuthentication.GetGroups 메서드를 호출합니다. LdapAuthentication.GetGroups 메서드는 DirectorySearcher 개체 만들기 및 memberOf 특성을 따라 필터링을 사용자가 속한 보안 및 메일 그룹 목록을 가져옵니다. 이 메서드는 파이프 (|) 로 구분된 그룹 목록을 반환합니다.

LdapAuthentication.GetGroups 메서드는 조작하고 문자열을 잘라내는 알 수 있습니다. 인증 쿠키에 저장되는 문자열의 길이를 줄입니다. 문자열이 잘리지 각 그룹의 형식을 다음과 같이 나타납니다.

CN=...,...,DC=domain,DC=com
				

매우 긴 문자열을 만들 수 있습니다. 이 문자열의 길이가 쿠키의 길이보다 큰 경우 브라우저에서 인증 쿠키를 받아들일 수 및 로그온 페이지로 리디렉션됩니다. 그러나 다중 도메인 환경에 있는 경우 다른 도메인의 그룹을 동일한 그룹 이름을 가질 수 있으므로 그룹 이름 사용하여 도메인 이름을 유지해야 할 수 있습니다. 한 그룹에서 다른 구분하기 위해 도메인 이름을 유지해야 합니다.

대부분의 브라우저에서는 최대 4096바이트의 쿠키를 지원합니다. 이 문자열의 길이가 쿠키의 잠재적으로 초과할 수 있으면 그룹 정보를 ASP.NET 캐시 개체 또는 데이터베이스 저장할 할 수 있습니다. 또는 그룹 정보를 암호화하고 이 정보가 숨겨진된 폼 필드에 저장할 할 수 있습니다.

Global.asax 코드 작성

Global.asax 파일에 코드를 Application_AuthenticateRequest 이벤트 처리기를 제공합니다. 이 이벤트 처리기는 Context.Request.Cookies 컬렉션에서 인증 쿠키를 검색하고 해당 쿠키를 해독합니다 FormsAuthenticationTicket.UserData 속성에 저장된 그룹 목록을 검색합니다. 그룹은 Logon.aspx 페이지에 만들어지는 파이프 구분된 목록에 나타납니다.

코드를 GenericPrincipal 개체를 만들려면 문자열 배열의 문자열을 구문 분석합니다. GenericPrincipal 개체를 만든 후에는 이 개체의 HttpContext.User 속성은 배치됩니다.

  1. 솔루션 탐색기에서 Global.asax, 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭하십시오.
  2. 코드 숨김 Global.asax.cs 파일 맨 위에 다음 코드를 추가하여:
    using System.Web.Security;
    using System.Security.Principal;
    					
  3. 기존 빈 이벤트 처리기에 대한 Application_AuthenticateRequest 다음 코드로 대체합니다.
    void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      String cookieName = FormsAuthentication.FormsCookieName;
      HttpCookie authCookie = Context.Request.Cookies[cookieName];
    
      if(null == authCookie)
      {//There is no authentication cookie.
        return;
      }	
    		
      FormsAuthenticationTicket authTicket = null;
    	
      try
      {
        authTicket = FormsAuthentication.Decrypt(authCookie.Value);
      }
      catch(Exception ex)
      {
        //Write the exception to the Event Log.
        return;
      }
    	
      if(null == authTicket)
      {//Cookie failed to decrypt.
        return;		
      }		
    	
      //When the ticket was created, the UserData property was assigned a
      //pipe-delimited string of group names.
      String[] groups = authTicket.UserData.Split(new char[]{'|'});
    
      //Create an Identity.
      GenericIdentity id = new GenericIdentity(authTicket.Name, "LdapAuthentication");
    	
      //This principal flows throughout the request.
      GenericPrincipal principal = new GenericPrincipal(id, groups);
    
      Context.User = principal;
    	
    }
    					

Web.config 파일을 수정하십시오.

이 섹션에서는 다음 <forms>구성, <authentication>,, 및 해당 <authorization> Web.config 파일에서 요소를. 이러한 변경 내용이 인증된 사용자만 응용 프로그램에 액세스할 수 있으며 인증되지 않은 요청은 Logon.aspx 페이지로 리디렉션됩니다. 특정 사용자와 응용 프로그램이 그룹 액세스를 허용하도록 이 구성을 수정할 수 있습니다.

Web.config 파일에서 기존 코드를 다음 코드로 바꿉니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>    
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="adAuthCookie" timeout="10" path="/" >
      </forms>
    </authentication>	
    <authorization>	
      <deny users="?" />
      <allow users="*" />
    </authorization>	
    <identity impersonate="true" />
  </system.web>
</configuration>
				

알 수 있는 <identity impersonate="true"/> 구성 요소. 이로 인해 ASP.NET에서 Microsoft 인터넷 정보 서비스 (IIS) 에서 익명 계정으로 구성할 계정을 가장할 수 있습니다. 이 구성은 이 응용 프로그램에 대한 모든 요청은 구성된 계정의 보안 컨텍스트에서 실행합니다. 사용자가 Active Directory에 [NULL]에 대해 인증 자격 증명을 제공하지만 Active Directory를 액세스하는 계정이 구성된 계정입니다. 자세한 내용은 References 섹션에.

익명 인증을 사용하도록 IIS를 구성하십시오.

익명 인증을 사용하도록 IIS를 구성하려면 다음 이 단계를 수행하십시오.

  1. IIS에서 서버의 컴퓨터 노드를 확장하고, 웹 사이트 를 확장한, 기본 웹 사이트 를 확장합니다. 그리고 FormsAuthAd, 마우스 오른쪽 단추로 클릭한 다음 속성 을 클릭하십시오.
  2. 디렉터리 보안 탭 을 클릭한 다음 익명 액세스 및 인증 제어에서편집 을 누릅니다.
  3. 응용 프로그램에 대한 익명 계정을 Active Directory 사용 권한을 가진 계정을 확인하십시오.
  4. 제어 암호 받는 IIS 허용 확인란의 선택을 취소하십시오.
  5. “ 인증된 액세스 ” 섹션에서 “ Windows 통합 인증 ” 확인란의 선택을 취소하십시오.
  6. 확인을 클릭하십시오.
  7. 적용을 클릭합니다.

기본 IUSR_ computername 계정은 Active Directory 권한이 없습니다.

Logon.aspx 페이지로 만들기

새 ASP.NET Web Form Logon.aspx 명명된 만들려면 다음과 같이 하십시오.

  1. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로, 추가 를 가리킨 다음 Web Form 추가 누릅니다.
  2. Logon.aspx이름 상자에 입력한 다음 열기 를 클릭하십시오.
  3. 솔루션 탐색기에서 Logon.aspx, 마우스 오른쪽 단추로 클릭한 다음 디자이너 보기를 클릭하십시오.
  4. 디자이너에서 HTML 탭을 클릭하십시오.
  5. Replace the existing code with the following code.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="FormsAuth" %>
    <html>
      <body>	
        <form id="Login" method="post" runat="server">
          <asp:Label ID="Label1" Runat=server >Domain:</asp:Label>
          <asp:TextBox ID="txtDomain" Runat=server ></asp:TextBox><br>    
          <asp:Label ID="Label2" Runat=server >Username:</asp:Label>
          <asp:TextBox ID=txtUsername Runat=server ></asp:TextBox><br>
          <asp:Label ID="Label3" Runat=server >Password:</asp:Label>
          <asp:TextBox ID="txtPassword" Runat=server TextMode=Password></asp:TextBox><br>
          <asp:Button ID="btnLogin" Runat=server Text="Login" OnClick="Login_Click"></asp:Button><br>
          <asp:Label ID="errorLabel" Runat=server ForeColor=#ff3300></asp:Label><br>
          <asp:CheckBox ID=chkPersist Runat=server Text="Persist Cookie" />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Login_Click(Object sender, EventArgs e)
    {
      String adPath = "LDAP://corp.com"; //Fully-qualified Domain Name
      LdapAuthentication adAuth = new LdapAuthentication(adPath);
      try
      {
        if(true == adAuth.IsAuthenticated(txtDomain.Text, txtUsername.Text, txtPassword.Text))
        {
          String groups = adAuth.GetGroups();
    
          //Create the ticket, and add the groups.
          bool isCookiePersistent = chkPersist.Checked;
          FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,  txtUsername.Text,
    	DateTime.Now, DateTime.Now.AddMinutes(60), isCookiePersistent, groups);
    	
          //Encrypt the ticket.
          String encryptedTicket = FormsAuthentication.Encrypt(authTicket);
    		
          //Create a cookie, and then add the encrypted ticket to the cookie as data.
          HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
    
          if(true == isCookiePersistent)
    	authCookie.Expires = authTicket.Expiration;
    				
          //Add the cookie to the outgoing cookies collection.
          Response.Cookies.Add(authCookie);		
    
          //You can redirect now.
          Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false));
        }
        else
        {
          errorLabel.Text = "Authentication did not succeed. Check user name and password.";
        }
      }
      catch(Exception ex)
      {
        errorLabel.Text = "Error authenticating. " + ex.Message;
      }
    }
    </script>
  6. LDAP 디렉터리 서버를 가리키도록 Logon.aspx 페이지로 경로를 수정하십시오.

Logon.aspx 페이지로 사용자 및 호출 메서드를 LdapAuthentication 클래스에 대한 정보를 수집하는 페이지입니다. 코드의 사용자를 인증하고 그룹 목록을 가져오는 코드를 FormsAuthenticationTicket 개체를 만듭니다. 그리고 티켓을 암호화합니다. 그리고 암호화된 티켓을 데 쿠키를 추가합니다. 그리고 쿠키가 HttpResponse.Cookies 컬렉션에 추가합니다 후 다음 원래 요청된 URL로 요청을 리디렉션합니다.

WebForm1.aspx 페이지를 수정합니다

WebForm1.aspx 페이지를 처음 요청한 페이지입니다. 사용자가 이 페이지를 요청하면 Logon.aspx 위해 요청을 리디렉션할 페이지의. 요청이 인증된 후 요청은 WebForm1.aspx 페이지로 리디렉션됩니다.

  1. 솔루션 탐색기 에서 WebForm1.aspx 를 마우스 오른쪽 단추로 클릭한 다음 디자이너 보기를 클릭하십시오.
  2. 디자이너에서 HTML 탭을 클릭하십시오.
  3. 기존 코드를 다음 code.
    <%@ Page language="c#" AutoEventWireup="true" %>
    <%@ Import Namespace="System.Security.Principal" %>
    <html>
      <body>	
        <form id="Form1" method="post" runat="server">
          <asp:Label ID="lblName" Runat=server /><br>
          <asp:Label ID="lblAuthType" Runat=server />
        </form>	
      </body>
    </html>
    <script runat=server>
    void Page_Load(Object sender, EventArgs e)
    {
      lblName.Text = "Hello " + Context.User.Identity.Name + ".";
      lblAuthType.Text = "You were authenticated using " +   Context.User.Identity.AuthenticationType + ".";
    }
    </script>
    					
  4. 모든 파일을 저장하고 프로젝트를 컴파일하십시오.
  5. WebForm1.aspx 페이지를 요청하십시오. 알 수 Logon.aspx 리디렉션됩니다.
  6. 로그온 자격 증명을 입력한 다음 제출 을 클릭하십시오. WebForm1.aspx 위해 리디렉션할 때 사용자 이름이 나타나는지 확인합니다 및 LdapAuthentication 인증 있는지 Context.User.AuthenticationType 속성을 입력합니다.

참고 SSL (Secure Sockets Layer) 사용하는 것이 좋습니다 Forms 인증을 사용할 때 암호화. 인증 쿠키를 기반으로 사용자가 식별되기 때문에 이 응용 프로그램에 SSL 암호화를 누구나 인증 쿠키와 전송되는 기타 유용한 정보를 손상시키지 못하도록 방지할 수 있습니다.


----====  참조  ====----

자세한 내용은 Microsoft 기술 자료에 있는 문서를 보려면 다음 문서 번호를 클릭하시기 바랍니다:
306590  (http://support.microsoft.com/kb/306590/ ) ASP.NET 보안 개요
317012  (http://support.microsoft.com/kb/317012/ ) ASP.NET 에서 프로세스 및 요청 ID
311495  (http://support.microsoft.com/kb/311495/ ) Visual C# .NET을 사용하여 ASP.NET 응용 프로그램에서 폼 기반 인증 가진 역할 기반 보안을 구현하는 방법
313091  (http://support.microsoft.com/kb/313091/ ) Forms 인증 사용하기 위해 Visual Basic .NET을 사용하여 키를 만드는 방법
313116  (http://support.microsoft.com/kb/313116/ ) 폼 인증 요청은 loginUrl 페이지에 지정됩니다.

본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft ASP.NET 1.1


반응형
Posted by 사용자 SB패밀리

댓글을 달아 주세요