본문 바로가기
개발/.NET

기존 폼 인증을 사용하여 role 적용하기

by 그저그런보통사람 2010. 4. 8.
.net 에서 제공하는 form 인증은 인증티켓을 이용한 암호화된 쿠키 방식이다.
쿠키 사용이 불가능할 경우 querystring을 통해 인증을 유지한다. 물론 주소 표시줄은 지저분 해보일 것이다.

예전의 쿠키방식보다 편리성과 나름의 보안성도 유지되어 자주 사용하긴하다만 가끔 불편한 점이 있다.
기본 제공 인터페이스에서는 제한된 기능으로 인해 추가로 필요한 속성을 적용하기가 불편하다는 것이다.
예를 들어 인증된 사용자가 관리자인지 구분하려면 아이디가 fixed 되거나 결국 DB의 사용자 속성에서
관리자 여부를 찾아와야 한다. 즉 필요한 지점마다 db를 뒤져야 한다는 것이다.

그렇다고 초기 인증과정에서 쿠키를 추가해서 넣기엔 전자보다 낫지만 일관성이 없어보인다.
엄밀하게 인증정보와 관리자여부 쿠키는 별개라는 것이다.

.net에서 제공하는 멤버십은 매우 좋은 솔루션임에 비해 사실 현업에서 잘 사용하지 않는다. 그도 그럴것이
국내 설정이랑 많이 다르지 않는가......

다음의 소스는 관리자여부를 지정하여 불필요한 데이터 엑세스를 줄이고, 일관성도 함께 얻는 나름의 방법
을 구체화 한것이다. 이게 답은 아니다. IT에 답이 있다면 발전은 더이상 이루어지지 않지 않을까.....

관리자 여부를 체크하는 방법을 User 속성의 IsInRole() 를 이용해서 처리한다.

-> 인증처리

            var user = _membersRespository.FindMember(userName, password);
            if (user != null){
               
                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                    1,
                    user.MemberId,
                    DateTime.Now,
                    DateTime.Now.AddHours(1),
                    false,
                    user.IsAdmin ? "Admin" : "User", // 키 포인트
                    FormsAuthentication.FormsCookiePath
                );
                string hash = FormsAuthentication.Encrypt(ticket);
                HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, hash);
                Response.Cookies.Add(cookie);
            }

위 코드에서 UserData 항목에 이름을 지정하여 관리자와 사용자를 구분하였다.
위 코드만으로 IsInRole()를 이용해서 가져올 수 없다.
엄밀하게 위 코드는 사용자 지정 항목이지 Role 이 아니기 때문이다.

이제 Global.ascx 에서 이 부분을 설정한다.

            if (HttpContext.Current.User != null)
            if (HttpContext.Current.User.Identity.IsAuthenticated)
            if (HttpContext.Current.User.Identity is FormsIdentity)
            {
                var identity = HttpContext.Current.User.Identity as FormsIdentity;
                FormsAuthenticationTicket ticket = identity.Ticket;
                HttpContext.Current.User = new GenericPrincipal(identity, ticket.UserData.Split(';'));
            }

이제 role이 설정되었다.

필요한 항목에서 사용한다.

if ( User.IsInRole("admin") ) {
         ....
}

'개발 > .NET' 카테고리의 다른 글

학습 사이트 링크  (0) 2010.04.15
Asp.net Mvc1 To Mvc2 컨버터  (0) 2010.04.11
암시적 트랜잭션  (0) 2010.03.31
ASP.NET MVC 제네릭 Repository 구현  (0) 2010.03.24
Spring.NET + ASP.NET MVC 사용 예제  (0) 2010.03.15