잊지 않겠습니다.

강력한 이름의 구성
  • Assembly의 문자열 이름(파일 확장자를 제외한 바이너리의 이름)
  • Assembly의 버젼 정보
  • Public Key
  • Culture 식별값

  

Assembly에 강력한 이름을 할당하는 과정
  • "sn.exe"를 이용 (-k flag)
  • .NET Framework에서 고유한 식별번호를 갖게하는 정보가 포함되게 된다.
  • [assembly : AssemblyKeyFile(@"C:\MyKey\MyKey.snk")] 로 assembly의 고유 키값을 설정
    • VS2003에서는 반드시 assembly를 수정해주는 것으로 해주어야지 된다.
    • VS2005에서는 프로젝트의 속성에서 지정이 가능하게 변경되었다.

  

Shared Assembly에서의 버젼 관리
  • Private Assembly와는 달리, private path를 이용하지 않는다.(config에서는 여전히 속성은 남아있으나, 사용하지 않는다.)
  • 여러 버젼의 동시에 Install이 가능하기 때문에, 문제가 발생하지 않는다. -> DLL 지옥의 해결 방안
Posted by Y2K
,

ASP.NET에서의 Logon/Logout을 구현하는 가장 일반적인 Forms authentication 방법.

   

web에서의 auth를 저장하는 방법으로 가장 주로 사용되는 것은 cookie를 사용, cookie와 auth에 대한 암호화를 이용해서 사용자 정보와 role을 저장할 수 있다.

   

Log-on (사용자 정보 저장)

1. web.config 설정

 authentication mode를 form으로 설정 

     <authentication mode="Forms">
      <forms loginUrl="~/NotLogOn" />
    </authentication>

   

2. Auth Cookie와 Authenticated user에 대한 정보 설정

LDAP, SQL Server를 이용한 Forms Authentication 이용 가능 (이에 대한 posting은 나중에...)

1) userName, password를 이용해서 정상적인 유저인 경우에 FormsAuthenticationTicket 생성

 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, 
userName,
DateTime.Now,
DateTime.Now.AddMinutes(20),
false,
roles )

  

* Role 정보 입력

 string role = string.concat("Senior Manager|Manager|Employee")

  

2) Cookie 암호화 & 저장

string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) 

Response.Cookie.Add(authCookie)

  

3. Auth 정보 확인 및 정보 검색

1) 암호화된 Cookie 값 얻기

string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(authCookie == null)
{
// there is no authentication cookie  
} 

  

2) Cookie 값 Decrypt

FormsAuthenticationTicket authTicket = null;

try 

{

authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

  

3) UserData 얻기

string userName = authTicket.Name; //userName
string userData = authTicket.UserData; //userData : roles
DateTime issueDate = authTicket.IssueDate; //cookie created date
DateTime expiredDate = authTicket.Expiration; //cookie expired date
bool expired = authTicket.Expired;
Posted by Y2K
,
할당문 보다는 변수 초기화를 사용하는 편이 더 좋다.
  • 선언시 지정한 초기화 루틴은 본문보다 앞서 수행된다.
  • 각 맴버변수의 선언 순서에 따라서 초기화가 진행된다.
  • 초기화 구문을 사용하지 않으면 좋은 경우 
    • null이나 0로 초기화 하는 경우
    • 동일한 객체에 대해서 여러번 초기화 하는 경우가 되는 경우
  • 생성자 내부에서 할당을 수행하는 것이 원활하다.
static class 맴버의 경우, static 생성자를 사용해서 초기화하라.
  •  static member의 초기화 

    • 선언시 초기화 하는 방법
    • static 생성자를 이용하는 경우
  • static 생성자 : 접근할 class의 어떤 method, variable, property보다 먼저 수행되는 특별한 생성자 
    • Singleton 패턴으로 구현할 때 매우 자주 사용된다. 
  • 선언시에 초기화를 행하는 경우, 초기화 시에 에러가 발생할 경우가 생길때에(.NET Remoting에 연관) try~catch로 잡는 것이 불가능하다.
연쇄적인 생성자 호출을 이용하라.
  • 하나의 작은 생성자를 이용해서, 연쇄적인 생성자를 이용해서 coding의 양을 줄이고 안정적으로 만들어준다. 
  • 기본 인자값을 갖는 매서드를 언어적으로 지원하지 않기 때문에,  각각 정의해줘야지 된다.
자원 해제를 위해서 using과 try/finally를 이용하라.
  • Unmanagerd 자원의 경우, IDisposable interface의 Dispose() 메서드를 호출해서 명시적으로 자원을 해제해 주어야 한다.
  • using 구문 
    • 반드시 구문이 끝나는 경우에, 마치게 되는 내용을 이용해서 해지해주게 된다. 
    • 방어적인 Coding을 해주는 것이 가능하다.
  • try/finally 구문 
    • 오류가 발생하는 경우, 자원이 해지가 안되는 경우가 있다. 
    • 자원이 해지가 되는 것을 반드시 해주기 위해서 finally 구문으로 자원을 항시 해지시켜줘야지 된다.
  • 다수의 객체에 대해서 Dispose()가 호출되어야지 되는 경우라면, using 문장을 다수 배치하거나 try/finally 블록을 직접 구현하는 것이 좋다.
  • Dispose() : 메모리에서부터 객체를 제거하지는 않지만, GC에게 자원을 해제하는 것을 도와주는 시기를 제공한다. 
Garbage를 최소화 하라.
  • 지역 변수를 포함한 모든 Reference 타잎 객체는 Heap 공간에 할당된다.  
    • 지역 변수는 메서드를 빠져나오는 경우 바로 GC에 할당 된다.
    • OnPaint 등에서 사용하는 Font나 Brush의 경우에는 전역 변수로 만들어주고, 때에 따라서 사용하는 것이 좋다.
  •  string으로 문자열을 모으는 것보다도, StringBuilder를 이용해서 문자열을 다루어준다.
boxing과 unboxing을 최소화하라.
  • 복사과정을 거치는 것은 시스템이 큰 영향을 주기 때문에 최소한으로 피해야지 된다.
  • Array에서의 boxing과 unboxing (struct를 사용하는 경우)
    • ArrayList 상에 추가하기 위해서 boxing이 수행된다. : ArrayList 안에 들어가는 모든 형태는 Reference가 되어야지 되기 때문에
    • ArrayList에서 꺼내는 순간 다시 unboxing이 수행
    • ArrayList에서 값을 호출하는 순간 다시 unboxing이 수행된다.
    • 반드시 value type과 collection을 같이 사용하면 안된다.
  • .NET 2.0에서는 generic으로 이러한 결점을 많이 해결 되었다.
표준 Dispose 패턴을 구현하라
  • 비 메모리 자원을 제거하기 위하여 표준화된 패턴 
    • IDisposable Interface를 구현해서 unmanaged 자원을 해재
    • 명시적인 호출을 잊을 경우에 대비하기 위해서 finalizer에도 적절한 해재 코드를 넣는 것
    • protected virtual void Dispose(bool isDisposing) 을 반드시 구현해줘야지 된다. [상속에 대한 문제점 해결]
  • 자신이 IDisposable을 구현하고 있는 것을 알리는 것으로 사용하는 class에서 이것을 구현해야지 되는 것을 알린다.
  • Dispose나 finalizer에서의 주의점 
    • 자원의 해재 이외에 어떠한 다른 동작도 수행해서는 안된다.
    • 객체의 생존 주기에 대한 복잡한 문제가 발생할 수 있다. 
Posted by Y2K
,