[ASP.NET] ASP.NET의 MembershipProvider

2014. 3. 20. 17:21WEB

Provider? MembershipProvider란?

ASP.NET에서는 특정 목적을 수행하기 위한 공통 인터페이스로써 Provider라는 개념을 제공하고 있습니다. 대표적으로 Membership, Roles, Profile, Session에 대한 공통 API를 제공하기 위해 각각 MembershipProvider, RolesProvider, ProfileProvider, SessionProvider를 제공하고 있습니다. MS에서는 개발자의 편의를 위해 지속적으로 새로운 Provider를 제공하고 있으며, 원한다면 개발자가 직접 필요한 각 Provider를 상속받아 구현하여 사용할 수 있습니다.

예를 들어 Membership을 직접 구현하고 싶다면 MembershipProvider Class를 상속받아 구현하고 Web.config의 membership Node에 구현한 Provider를 지정하시면 됩니다. 그러면 모든 ASP.NET Project 내에서 모든 Membership 접근은 지정한 MembershipProvider를 통해 수행되게 됩니다.

  1. MembershipProvider 상속 받아 구현
    public class CustomMembershipProvider : MembershipProvider
    {
      public override MembershipUser GetUser(string username, bool userIsOnline)
      {
         //구현코드..
      }
      //....
    }
  2. Web.config에 해당 MembershipProvider 지정
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <membership defaultProvider="CustomMembershipProvider">
          <providers>
            <add name="CustomMembershipProvider" ... />
          </providers>
        </membership>
      <system.web>
    <configuration>
  3. ASP.NET Project에서 모든 Membershp 접근은 지정한 MembershipProvider를 이용하게 됩니다.
    public ActionResult GetUserName()
    {
        reutrn Membership.GetUser().UserName; //CustomMembershipProvider를 통해 실행이 된다
    }

이 포스트에서는 여러 Provider 중에서 특히 MembershipProvider들에 대해 정리 드리고자 합니다.

System.Web.Security.MembershipProvider in System.Web.ApplicationServices.dll

MembershipProvider는 위에서 설명하였듯이, ASP.NET에서 Membership 구현을 위한 공통 인터페이스이자 Base Class입니다. 즉 ASP.NET에서 모든 멤버쉽 관련 기능은 MembershipProvider를 상속해서 구현하는 것입니다.

MembershipProvider Class는 Abstract Class이기 때문에 직접 Instance화는 불가능합니다.

System.Web.Security.SqlMembershipProvider in System.web.dll

MS SQL Server를 저장소로 하는 MembershipProvider의 구현클래스 입니다. ASP.NET의 기본 Provider로써 ASP.NET에서 따로 Provider를 지정하지 않으면 SqlMembershipProvider가 사용됩니다(http://msdn.microsoft.com/en-us/library/6e9y4s5t%28v=vs.100%29.aspx). AspNetSqlMembershipProvider라고도 하며, MS SQL Server 2000 이상, .NET Framework 2.0부터 지원합니다.

이 SqlMembershipProvider를 사용하기 위해서는 aspnet_regsql.exe를 이용하여 Membership Table 생성이 필요합니다. (http://msdn.microsoft.com/en-us/library/ms229862%28v=vs.100%29.aspx#findingthecorrectversion)

System.Web.Providers.DefaultMembershipProvider in System.Web.Providers.dll

2011년 6월 MS에 의해 ASP.NET Universal Provider라는 이름으로 Release된 MembershipProvider입니다. 기존 SqlMembershipProvide는 MS SQL Server만 지원하는데 반해서, MS SQL Server 2005 이상, MS SQL Server Azure, SQL Server Compact를 모두 지원합니다.

DefaultMembershipProvider를 사용함으로써 Sql Server Compact나, MS SQL Server Azure를 DB로 이용할 수 있게 되었습니다. VisualStudio 2012부터 기본적으로 사용되며, 이전 버전에서는 Nuget을 통해 System.Web.Providers 패키지를 검색하여 설치하신 후 사용 가능합니다.
image

하지만 새로운 Membership Table구조를 생성하므로, 이전에 사용하던 Membership Table이 있다면 호환성을 어떻게 해결할 지 고려가 필요합니다.
image

WebMatrix.WebData.SimpleMembershipProvider in WebMatrix.WebData.dll

ASP.NET MVC 4, Internet Template Project를 생성하면 기본적으로 이 SimpleMembershipProvider를 통해서 Membership을 구현하는 것을 알 수 있습니다. 이 새로운 SimpleMembershipProvider는 인증을 보다 단순화하고 경량, 효율화하며 Facebook과 같은 외부 사이트와 인증연동 등 기능을 확장하기 위해 새롭게 개발된 Provider입니다.

따라서 SimpleMembershipProvider는 MembershipProvider를 상속하고 있음에도 단순화를 위해 불필요한 부분은 구현하지 않기 때문에 특정 속성이나 메서드 접근 시 UnsupportedException이 발생할 수도 있습니다.
image
[SimpleMembershipProvider는 단순화를 위해 일부 속성이나 메서드를 지원하지 않습니다.]

또한 SimpleMembershipProvider에서 사용하는 DB Table구조는 aspnet_regsql.exe를 통해 생성된 이전 버전의 Membership DB Table과 구조가 다릅니다. 따라서, ASP.NET Web Site Administration Tool (WSAT)과도 호환되지 않습니다.
image
[Table구조도 완전히 변경되었습니다.]

그렇다고 SqlMembershipProvider, DefaultMembershipProvider 등 이전에 제공되었던 MembershpProvider에서 사용하던 DB Table 구조를 지원하지 않는 것이 아닙니다. 따라서 앞으로도 ASP.NET의 Core로서 지원될 것이며, SimpleMembershipProvider는 단지 선택 가능한 다른 대안으로서 제공되는 것입니다. 여전히 ASP.NET WebForm Project에서는 DefaultBembershpProvider를 이용하고 있습니다.

SimpleMembershpProvider는 WebMatirx.WebData.WebSecurity Class에서 내부적으로 이용하기 때문에, 직접 SimpleMembershipProvider를 다루는 경우보다 WebSecurity Class를 통해서 멤버쉽을 관리하는 경우가 더 많으며 더 권장되는 방법입니다.

WebMatrix.WebData.WebSecurity in WebMatrix.WebData.dll

WebMatrix의 WebSecurity Class는 로그인 등 인증관리를 더욱 단순화, 경량화하였으며 더불어 Facebook과 같은 외부 사이트와 연동을 손쉽게 구현할 수 있도록 지원합니다. 따라서 WebSecurity Class는 사용자 생성, 로그인, 삭제, 비밀번호 변경 외 대부분의 사용자관리 기능을 제공하고 있습니다.

WebSecurity는 경량화를 위해 일부는 구현하지 않거나 지원하지 않습니다. 한가지 예를 들면 기존 Membershp Model에서는 비밀번호를 저장하는 방법으로 3가지를 지원하고 있었습니다. 암호화, 순수 Text, 아니면 Hash값으로 저장할지에 대한 옵션이 있었는데요. WebSecurity에서는 이 중에서 Hash를 통한 저장만을 지원합니다. 왜냐하면 보안과 성능에 있어 가장 뛰어나기 때문에 대부분 개발자들은 이 옵션을 선택하기 때문입니다.

다른 장점으로는 Facebook과 같은 외부 사이트와 연동을 손쉽게 구현할 수 있도록 지원하고 있습니다. OAuthWebSecurity Class는 WebSecurity를 이용하여 손쉽게 외부 사이트와 연동을 구현할 수 있도록 지원합니다.
image
[OAuth나 OpenAPI에 대한 복잡한 지식을 배우지 않고도 다양한 외부사이트와 로그인 연동을 구현할 수 있다.]

WebSecurity는 SimpleMembershpProvider를 이용합니다. WebSecurity.InitializeDataBaseConnection()를 호출하면 관련 DB를 자동생성하고 SimpleMembershpProvider를 사용하게 됩니다. 따라서 WebSecurity가 아닌 다른 Membership Model을 사용하고자 한다면 WebSecurity.InitializeDataBaseConnection()를 호출하지 않아야 하며 Web.Config에 사용하고자 하는 MembershipProvider를 지정하면 됩니다. (http://msdn.microsoft.com/en-us/library/webmatrix.webdata.websecurity%28v=vs.111%29.aspx)

IdentityAuthenticationManager

MVC5에서는 WebSecurity를 더욱 확장한 Membershp Model을 제공합니다. Microsoft.AspNet.Identity.Owin Namespace에 포함된 새로운 인증 Model은 DB Table구조 또한 새롭게 변경되었습니다. 이에 관해서는 다음 Post에서 자세히 다루도록 하겠습니다.
image
[MVC5에서는 DB Table구조도 새롭게 변경되었습니다]

References