다음을 통해 공유


ASP.NET ID 소개

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

가장 안전한 인증 옵션을 사용하는 것이 좋습니다. Azure에 배포된 .NET 앱은 다음을 참조하세요.

Azure Key Vault 및 .NET Aspire 비밀을 저장하고 검색하는 가장 안전한 방법을 제공합니다. Azure Key Vault는 인증서, 연결 문자열 및 암호와 같은 암호화 키와 비밀을 보호하는 클라우드 서비스입니다. .NET Aspire의 경우 호스팅과 클라이언트 통합간의 보안 통신을 참조하세요.

리소스 소유자 암호 자격 증명 부여는 다음을 수행하므로 사용하지 마세요.

  • 클라이언트에 사용자의 암호를 노출합니다.
  • 중요한 보안 위험입니다.
  • 다른 인증 흐름을 사용할 수 없는 경우에만 사용해야 합니다.

앱이 테스트 서버에 배포되면 환경 변수를 사용하여 연결 문자열을 테스트 데이터베이스 서버로 설정할 수 있습니다. 환경 변수는 일반적으로 암호화되지 않은 일반 텍스트로 저장됩니다. 컴퓨터 또는 프로세스가 손상된 경우 신뢰할 수 없는 당사자가 환경 변수에 액세스할 수 있습니다. 환경 변수를 사용하여 프로덕션 연결 문자열을 저장하는 것은 추천하지 않습니다. 이는 가장 안전한 방법이 아니기 때문입니다.

구성 데이터 지침:

  • 암호 또는 기타 중요한 데이터를 구성 공급자 코드 또는 일반 텍스트 구성 파일에 저장하지 마세요.
  • 개발 또는 테스트 환경에서 프로덕션 비밀을 사용하지 마세요.
  • 소스 코드 리포지토리에 실수로 커밋할 수 없도록 프로젝트 외부에서 비밀을 지정합니다.

배경: ASP.NET 회원 자격

ASP.NET 멤버 자격

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

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

ASP.NET 간단한 멤버십

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

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

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

ASP.NET 유니버설 공급자

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

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

ASP.NET 아이덴티티

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

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

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

웹 애플리케이션 개발에서 이러한 변경 사항을 고려할 때 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하지 않고도 SharePoint, Azure Storage Table Service, NoSQL 데이터베이스 등과 같은 다양한 스토리지 메커니즘을 쉽게 연결할 수 System.NotImplementedExceptions.
  • 단위 테스트 가능성

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

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

    • ASP.NET 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 Identity 시작하기

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

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

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

    새 ASP 닷넷 프로젝트 창 이미지

  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.SignInAsync 메서드는 ClaimsIdentity생성을 합니다. ASP.NET ID 및 OWIN 쿠키 인증은 클레임 기반 시스템이므로 프레임워크는 앱에서 사용자에 대한 ClaimsIdentity를 생성해야 합니다. ClaimsIdentity에는 사용자가 속한 역할과 같은 사용자에 대한 모든 클레임에 대한 정보가 있습니다.

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

    // 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 Identity 시스템의 구성 요소를 보여 줍니다(을 선택하거나을 선택하거나 다이어그램에서 선택하여 확대하세요). 녹색 패키지는 ASP.NET ID 시스템을 구성합니다. 다른 모든 패키지는 ASP.NET 애플리케이션에서 ASP.NET ID 시스템을 사용하는 데 필요한 종속성입니다.

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

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

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

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

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

다음 단계