ASP.NET Identity 소개

ASP.NET 멤버 자격 시스템은 2005년에 ASP.NET 2.0으로 도입되었으며, 그 이후로 웹 애플리케이션이 일반적으로 인증 및 권한 부여를 처리하는 방식이 많이 변경되었습니다. ASP.NET ID는 웹, 휴대폰 또는 태블릿용 최신 애플리케이션을 빌드할 때 멤버 자격 시스템이 무엇인지 새롭게 살펴봅니다.

백그라운드: ASP.NET 멤버 자격

ASP.NET 멤버 자격

ASP.NET 멤버 자격은 2005년에 양식 인증과 관련된 일반적인 사이트 멤버 자격 요구 사항과 사용자 이름, 암호 및 프로필 데이터에 대한 SQL Server 데이터베이스를 해결하기 위해 설계되었습니다. 현재 웹 애플리케이션에 대한 훨씬 광범위한 데이터 스토리지 옵션이 있으며 대부분의 개발자는 자신의 사이트에서 인증 및 권한 부여 기능에 소셜 ID 공급자를 사용하도록 설정하려고 합니다. ASP.NET 멤버 자격 디자인의 제한 사항으로 인해 이러한 전환이 어려워집니다.

  • 데이터베이스 스키마는 SQL Server 위해 설계되었으며 변경할 수 없습니다. 프로필 정보를 추가할 수 있지만 추가 데이터는 다른 테이블에 압축되므로 프로필 공급자 API를 제외한 모든 수단을 통해 액세스하기가 어렵습니다.
  • 공급자 시스템을 사용하면 지원 데이터 저장소를 변경할 수 있지만 시스템은 관계형 데이터베이스에 적합한 가정을 중심으로 설계되었습니다. 공급자를 작성하여 Azure Storage 테이블과 같은 비관계형 스토리지 메커니즘에 멤버 자격 정보를 저장할 수 있지만, NoSQL 데이터베이스에 적용되지 않는 메서드에 대해 많은 코드와 많은 System.NotImplementedException 예외를 작성하여 관계형 디자인을 해결해야 합니다.
  • 로그인/로그아웃 기능은 Forms 인증을 기반으로 하므로 멤버 자격 시스템은 OWIN을 사용할 수 없습니다. OWIN에는 외부 ID 공급자(예: Microsoft 계정, Facebook, Google, Twitter)를 사용한 로그인 지원 및 온-프레미스 Active Directory 또는 Azure Active Directory의 조직 계정을 사용하는 로그인을 포함하여 인증을 위한 미들웨어 구성 요소가 포함되어 있습니다. OWIN에는 OAuth 2.0, JWT 및 CORS에 대한 지원도 포함됩니다.

ASP.NET 단순 멤버 자격

ASP.NET 단순 멤버 자격은 ASP.NET 웹 페이지 멤버 자격 시스템으로 개발되었습니다. WebMatrix 및 Visual Studio 2010 SP1을 사용하여 릴리스되었습니다. 단순 멤버 자격의 목표는 웹 페이지 애플리케이션에 멤버 자격 기능을 쉽게 추가할 수 있도록 하는 것이었습니다.

단순 멤버 자격은 사용자 프로필 정보를 쉽게 사용자 지정할 수 있도록 했지만 여전히 ASP.NET 멤버 자격과 다른 문제를 공유하며 몇 가지 제한 사항이 있습니다.

  • 비관계형 저장소에서 멤버 자격 시스템 데이터를 유지하기가 어려웠습니다.
  • OWIN에서는 사용할 수 없습니다.
  • 기존 ASP.NET 멤버 자격 공급자와 잘 작동하지 않으며 확장할 수 없습니다.

ASP.NET 범용 공급자

ASP.NET Universal Providers Microsoft Azure SQL Database 멤버 자격 정보를 유지할 수 있도록 개발되었으며 SQL Server Compact 함께 작동합니다. Universal Providers Entity Framework Code First를 기반으로 빌드되었습니다. 즉, Universal Providers EF에서 지원하는 모든 저장소에 데이터를 유지하는 데 사용할 수 있습니다. Universal Providers 데이터베이스 스키마도 꽤 많이 정리되었습니다.

Universal Providers ASP.NET 멤버 자격 인프라를 기반으로 하므로 SqlMembership 공급자와 동일한 제한 사항이 계속 적용됩니다. 즉, 관계형 데이터베이스용으로 설계되었으며 프로필 및 사용자 정보를 사용자 지정하기가 어렵습니다. 또한 이러한 공급자는 로그인 및 로그아웃 기능에 양식 인증을 사용합니다.

ASP.NET ID

ASP.NET 멤버십 스토리가 수년에 걸쳐 발전함에 따라 ASP.NET 팀은 고객의 피드백을 통해 많은 것을 배웠습니다.

사용자가 자신의 애플리케이션에 등록한 사용자 이름과 암호를 입력하여 로그인한다는 가정은 더 이상 유효하지 않습니다. 웹은 더 소셜되고있다. 사용자는 Facebook, Twitter 및 기타 소셜 웹 사이트와 같은 소셜 채널을 통해 실시간으로 상호 작용합니다. 개발자는 사용자가 자신의 웹 사이트에서 풍부한 경험을 할 수 있도록 소셜 ID로 로그인할 수 있기를 원합니다. 최신 멤버 자격 시스템은 Facebook, Twitter 등과 같은 인증 공급자에 대한 리디렉션 기반 로그인을 사용하도록 설정해야 합니다.

웹 개발이 발전함에 따라 웹 개발 패턴도 진화했습니다. 애플리케이션 코드의 단위 테스트는 애플리케이션 개발자의 핵심 관심사가 되었습니다. 2008년 ASP.NET 개발자가 단위 테스트 가능한 ASP.NET 애플리케이션을 빌드하는 데 도움이 되도록 MVC(Model-View-Controller) 패턴을 기반으로 하는 새로운 프레임워크를 추가했습니다. 애플리케이션 논리를 단위 테스트하려는 개발자도 멤버 자격 시스템을 사용하여 이 작업을 수행할 수 있기를 원했습니다.

웹 애플리케이션 개발에서 이러한 변경 사항을 고려할 때 ASP.NET ID는 다음 목표를 가지고 개발되었습니다.

  • 하나의 ASP.NET ID 시스템

    • ASP.NET ID는 ASP.NET MVC, Web Forms, 웹 페이지, Web API 및 SignalR과 같은 모든 ASP.NET 프레임워크와 함께 사용할 수 있습니다.
    • ASP.NET ID는 웹, 전화, 저장소 또는 하이브리드 애플리케이션을 빌드할 때 사용할 수 있습니다.
  • 사용자에 대한 프로필 데이터 연결의 용이성

    • 사용자 및 프로필 정보의 스키마를 제어할 수 있습니다. 예를 들어 애플리케이션에 계정을 등록할 때 사용자가 입력한 생년월일을 시스템에서 쉽게 저장할 수 있습니다.
  • 지속성 제어

    • 기본적으로 ASP.NET ID 시스템은 모든 사용자 정보를 데이터베이스에 저장합니다. ASP.NET ID는 Entity Framework Code First를 사용하여 모든 지속성 메커니즘을 구현합니다.
    • 데이터베이스 스키마를 제어하기 때문에 테이블 이름 변경 또는 기본 키의 데이터 형식 변경과 같은 일반적인 작업은 간단합니다.
    • 예외를 throw System.NotImplementedExceptions 하지 않고도 SharePoint, Azure Storage Table Service, NoSQL 데이터베이스 등과 같은 다양한 스토리지 메커니즘을 쉽게 연결할 수 있습니다.
  • 단위 테스트 가능성

    • ASP.NET ID를 사용하면 웹 애플리케이션의 단위를 테스트할 수 있습니다. ASP.NET ID를 사용하는 애플리케이션 부분에 대한 단위 테스트를 작성할 수 있습니다.
  • 역할 공급자

    • 역할별로 애플리케이션의 일부에 대한 액세스를 제한할 수 있는 역할 공급자가 있습니다. "관리"과 같은 역할을 쉽게 만들고 역할에 사용자를 추가할 수 있습니다.
  • 클레임 기반

    • ASP.NET ID는 사용자의 ID가 클레임 집합으로 표시되는 클레임 기반 인증을 지원합니다. 클레임을 사용하면 개발자가 역할이 허용하는 것보다 사용자의 ID를 설명하는 데 훨씬 더 많은 표현을 할 수 있습니다. 역할 멤버 자격은 부울(멤버 또는 비 멤버)인 반면 클레임에는 사용자의 ID 및 멤버 자격에 대한 풍부한 정보가 포함될 수 있습니다.
  • 소셜 로그인 공급자

    • Microsoft 계정, Facebook, Twitter, Google 등과 같은 소셜 로그인을 애플리케이션에 쉽게 추가하고 애플리케이션에 사용자별 데이터를 저장할 수 있습니다.
  • OWIN 통합

    • 이제 ASP.NET 인증은 모든 OWIN 기반 호스트에서 사용할 수 있는 OWIN 미들웨어를 기반으로 합니다. ASP.NET ID에는 System.Web에 대한 종속성이 없습니다. 완전히 호환되는 OWIN 프레임워크이며 모든 OWIN 호스팅 애플리케이션에서 사용할 수 있습니다.
    • ASP.NET ID는 웹 사이트의 사용자 로그인/로그아웃에 OWIN 인증을 사용합니다. 즉, FormsAuthentication을 사용하여 쿠키를 생성하는 대신 애플리케이션에서 OWIN CookieAuthentication을 사용하여 쿠키를 생성합니다.
  • NuGet 패키지

    • ASP.NET ID는 Visual Studio 2017과 함께 제공되는 ASP.NET MVC, Web Forms 및 Web API 템플릿에 설치된 NuGet 패키지로 재배포됩니다. NuGet 갤러리에서 이 NuGet 패키지를 다운로드할 수 있습니다.
    • ASP.NET ID를 NuGet 패키지로 릴리스하면 ASP.NET 팀이 새로운 기능과 버그 수정을 더 쉽게 반복하고 이를 민첩한 방식으로 개발자에게 제공할 수 있습니다.

ASP.NET ID 시작

ASP.NET ID는 ASP.NET MVC, Web Forms, Web API 및 SPA용 Visual Studio 2017 프로젝트 템플릿에서 사용됩니다. 이 연습에서는 프로젝트 템플릿이 ASP.NET ID를 사용하여 사용자를 등록, 로그인 및 로그아웃하는 기능을 추가하는 방법을 설명합니다.

ASP.NET ID는 다음 절차를 사용하여 구현됩니다. 이 문서의 목적은 ASP.NET ID에 대한 개략적인 개요를 제공하는 것입니다. 단계별로 수행하거나 세부 정보를 읽을 수 있습니다. 새 API를 사용하여 사용자, 역할 및 프로필 정보를 추가하는 등 ASP.NET ID를 사용하여 앱을 만드는 방법에 대한 자세한 지침은 이 문서의 끝에 있는 다음 단계 섹션을 참조하세요.

  1. 개별 계정으로 ASP.NET MVC 애플리케이션을 만듭니다. ASP.NET MVC, Web Forms, Web API, SignalR 등에서 ASP.NET ID를 사용할 수 있습니다. 이 문서에서는 ASP.NET MVC 애플리케이션으로 시작합니다.

    새 ASP 점 Net 프로젝트 창 이미지

  2. 만든 프로젝트에는 ASP.NET ID에 대한 다음 세 가지 패키지가 포함되어 있습니다.

    • Microsoft.AspNet.Identity.EntityFramework
      이 패키지에는 ASP.NET ID 데이터 및 스키마를 SQL Server 유지하는 ASP.NET Identity의 Entity Framework 구현이 있습니다.
    • Microsoft.AspNet.Identity.Core
      이 패키지에는 ASP.NET ID에 대한 핵심 인터페이스가 있습니다. 이 패키지는 Azure Table Storage, NoSQL 데이터베이스 등과 같은 다양한 지속성 저장소를 대상으로 하는 ASP.NET ID에 대한 구현을 작성하는 데 사용할 수 있습니다.
    • Microsoft.AspNet.Identity.OWIN
      이 패키지에는 ASP.NET 애플리케이션에서 ASP.NET ID를 사용하여 OWIN 인증을 연결하는 데 사용되는 기능이 포함되어 있습니다. 이는 애플리케이션에 로그인 기능을 추가하고 OWIN 쿠키 인증 미들웨어를 호출하여 쿠키를 생성할 때 사용됩니다.
  3. 사용자 만들기.
    애플리케이션을 시작하고 등록 링크를 클릭하여 사용자를 만듭니다. 다음 이미지는 사용자 이름과 암호를 수집하는 등록 페이지를 보여 줍니다.

    새 계정 만들기 이미지

    사용자가 등록 단추를 Register 선택하면 아래 강조 표시된 대로 계정 컨트롤러의 작업은 ASP.NET ID API를 호출하여 사용자를 만듭니다.

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. 로그인합니다.
    사용자가 성공적으로 만들어진 경우 메서드에 의해 SignInAsync 로그인됩니다.

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    메서드는 SignInManager.SignInAsyncClaimsIdentity를 생성합니다. ASP.NET ID 및 OWIN 쿠키 인증은 클레임 기반 시스템이므로 프레임워크는 앱이 사용자에 대한 ClaimsIdentity를 생성하도록 요구합니다. ClaimsIdentity에는 사용자의 모든 클레임에 대한 정보(예: 사용자가 속한 역할)가 있습니다.

  5. 로그오프합니다.
    로그오프 링크를 선택하여 계정 컨트롤러에서 LogOff 작업을 호출합니다.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    위의 강조 표시된 코드는 OWIN AuthenticationManager.SignOut 메서드를 보여줍니다. 이는 Web Forms FormsAuthentication 모듈에서 사용하는 FormsAuthentication.SignOut 메서드와 유사합니다.

ASP.NET ID의 구성 요소

아래 다이어그램은 ASP.NET ID 시스템의 구성 요소를 보여 줍니다(이를 확대하려면 시스템 또는 다이어그램에서 선택). 녹색 패키지는 ASP.NET ID 시스템을 구성합니다. 다른 모든 패키지는 ASP.NET 애플리케이션에서 ASP.NET ID 시스템을 사용하는 데 필요한 종속성입니다.

A SP 점 Net ID 시스템의 구성 요소를 보여 주는 다이어그램

다음은 앞에서 언급하지 않은 NuGet 패키지에 대한 간략한 설명입니다.

  • Microsoft.Owin.Security.Cookies
    애플리케이션이 ASP와 유사한 쿠키 기반 인증을 사용할 수 있도록 하는 미들웨어입니다. NET의 Forms 인증.
  • EntityFramework
    Entity Framework는 관계형 데이터베이스에 대해 Microsoft에서 권장하는 데이터 액세스 기술입니다.

멤버 자격에서 ASP.NET ID로 마이그레이션

ASP.NET 멤버 자격 또는 단순 멤버 자격을 사용하는 기존 앱을 새 ASP.NET ID 시스템으로 마이그레이션하는 방법에 대한 지침을 곧 제공할 예정입니다.

다음 단계