사용자가 로그인하는 웹앱: 코드 구성

사용자가 로그인하는 웹앱의 코드를 구성하는 방법을 알아봅니다.

웹앱을 지원하는 Microsoft 라이브러리

웹앱(및 웹 API)을 보호하는 데 사용되는 Microsoft 라이브러리는 다음과 같습니다.

언어 / 프레임워크 프로젝트 설정
GitHub
Package(패키지) 가져오기
시작됨
사용자 로그인 웹 API 액세스 GA(일반 공급) 또는
공개 미리 보기1
.NET MSAL.NET Microsoft.Identity.Client 라이브러리는 사용자 로그인에 대한 ID 토큰을 요청할 수 없습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
.NET Microsoft.IdentityModel Microsoft.IdentityModel 라이브러리는 사용자 로그인에 대한 ID 토큰을 요청할 수 없습니다.2 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 없습니다.2 GA
ASP.NET Core ASP.NET Core Microsoft.AspNetCore.Authentication 빠른 시작 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 없습니다. GA
ASP.NET Core Microsoft.Identity.Web Microsoft.Identity.Web 빠른 시작 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
Java MSAL4J msal4j 빠른 시작 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
Spring spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory 자습서 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
Node.js MSAL 노드 msal-node 빠른 시작 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
Python MSAL Python msal 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. GA
Python identity identity 빠른 시작 라이브러리에서 사용자 로그인에 대한 ID 토큰을 요청할 수 있습니다. 라이브러리는 보호된 웹 API에 대한 액세스 토큰을 요청할 수 있습니다. --

(1)온라인 서비스에 대한 유니버설 사용 조건공개 미리 보기의 라이브러리에 적용됩니다.

(2)Microsoft.IdentityModel 라이브러리는 토큰의 유효성 검사만 수행하고 ID 또는 액세스 토큰은 요청할 수 없습니다.

관심 있는 플랫폼에 해당하는 탭을 선택합니다.

이 문서 및 다음 항목의 코드 조각은 ASP.NET Core 웹앱 증분 자습서의 1장에서 추출되었습니다.

전체 구현에 대한 자세한 내용은 해당 자습서를 참조하는 것이 좋습니다.

구성 파일

Microsoft ID 플랫폼을 사용하여 사용자가 로그인하는 웹 애플리케이션은 구성 파일을 통해 구성됩니다. 해당 파일은 다음 값을 지정해야 합니다.

  • 국가 클라우드 등에서 앱을 실행하려는 경우 클라우드 인스턴스. 다양한 옵션에는 다음이 포함됩니다.
    • Azure 퍼블릭 클라우드의 경우 https://login.microsoftonline.com/
    • https://login.microsoftonline.us/(Azure 미국 정부의 경우)
    • Microsoft Entra 독일용 https://login.microsoftonline.de/
    • 21Vianet에서 운영하는 Microsoft Entra 중국용 https://login.partner.microsoftonline.cn/common
  • 테넌트 ID의 대상 그룹. 옵션은 앱이 단일 테넌트인지 다중 테넌트인지에 따라 달라집니다.
    • 조직의 사용자를 로그인하기 위해 Azure Portal에서 가져오는 테넌트 GUID입니다. 도메인 이름을 사용할 수도 있습니다.
    • organizations: 회사 또는 학교 계정의 사용자 로그인
    • common: 회사 또는 학교 계정 또는 Microsoft 개인 계정으로 사용자 로그인
    • consumers: Microsoft 개인 계정으로만 사용자 로그인
  • Azure Portal에서 복사한 애플리케이션의 클라이언트 ID.

또한 인스턴스테넌트 ID 값을 연결한 권한에 대한 참조를 볼 수도 있습니다.

ASP.NET Core에서 해당 설정은 "Microsoft Entra ID" 섹션의 appsettings.json 파일에 있습니다.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantId": "[Enter the tenantId here]",

    // Client ID (application ID) obtained from the Azure portal
    "ClientId": "[Enter the Client Id here]",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-oidc"
  }
}

ASP.NET Core에서 다른 파일(properties\launchSettings.json)에는 애플리케이션 및 다양한 프로필에 대한 URL(applicationUrl) 및 TLS/SSL 포트(sslPort)가 포함되어 있습니다.

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:3110/",
      "sslPort": 44321
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "webApp": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:3110/"
    }
  }
}

Azure Portal에서 애플리케이션의 인증 페이지에 등록하는 리디렉션 URL은 해당 URL과 일치해야 합니다. 위의 두 구성 파일은 https://localhost:44321/signin-oidc입니다. 그 이유는 applicationUrlhttp://localhost:3110인데 sslPort가 지정되었기 때문입니다(44321). CallbackPathappsettings.json에 정의된 대로 /signin-oidc입니다.

동일한 방식으로 로그아웃 URL은 https://localhost:44321/signout-oidc로 설정됩니다.

참고 항목

SignedOutCallbackPath는 이벤트를 처리하는 동안 충돌을 방지하기 위해 포털 또는 애플리케이션으로 설정해야 합니다.

초기화 코드

초기화 코드 차이는 플랫폼에 따라 다릅니다. ASP.NET Core 및 ASP.NET의 경우 사용자 로그인은 OpenID Connect 미들웨어에 위임됩니다. ASP.NET 또는 ASP.NET Core 템플릿은 Azure AD v1.0 엔드포인트에 대한 웹 애플리케이션을 생성합니다. Microsoft ID 플랫폼에 맞게 조정하려면 몇 가지 구성이 필요합니다.

ASP.NET Core 웹앱(및 웹 API)의 경우 컨트롤러 또는 컨트롤러 작업에 Authorize 특성이 있으므로 애플리케이션이 보호됩니다. 이 특성은 사용자가 인증되었는지 확인합니다. .NET 6 릴리스 이전에는 코드 초기화가 Startup.cs 파일에 있었습니다. .NET 6이 포함된 새 ASP.NET Core 프로젝트에는 더 이상 Startup.cs 파일이 포함되지 않습니다. 대신 Program.cs 파일이 포함됩니다. 이 자습서의 나머지 부분은 .NET 5 이하와 관련이 있습니다.

참고 항목

Microsoft.Identity.Web을 활용하는 Microsoft ID 플랫폼용 새 ASP.NET Core 템플릿을 사용하여 직접 시작하려는 경우에는 .NET 5.0용 프로젝트 템플릿이 포함된 미리 보기 NuGet 패키지를 다운로드할 수 있습니다. 설치가 완료되면 ASP.NET Core 웹 애플리케이션(MVC 또는 Blazor)을 직접 인스턴스화할 수 있습니다. 자세한 내용은 Microsoft.Identity.Web 웹앱 프로젝트 템플릿을 참조하세요. 이는 다음 단계를 모두 수행하므로 가장 간단한 방식입니다.

Visual Studio 내에서 현재의 기본 ASP.NET Core 웹 프로젝트를 사용하거나 dotnet new mvc --auth SingleOrg 또는 dotnet new webapp --auth SingleOrg를 사용하여 프로젝트를 시작하려는 경우 다음과 같은 코드가 표시됩니다.

 services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
         .AddAzureAD(options => Configuration.Bind("AzureAd", options));

이 코드는 Azure Active Directory v1.0 애플리케이션을 만드는 데 사용되는 레거시 Microsoft.AspNetCore.Authentication.AzureAD.UI NuGet 패키지를 사용합니다. 이 문서에서는 해당 코드를 바꾸는 Microsoft ID 플랫폼 v2.0 애플리케이션을 만드는 방법을 설명합니다.

  1. 프로젝트에 Microsoft.Identity.WebMicrosoft.Identity.Web.UI NuGet 패키지를 추가합니다. Microsoft.AspNetCore.Authentication.AzureAD.UI NuGet 패키지가 있는 경우 제거합니다.

  2. AddMicrosoftIdentityWebAppAddMicrosoftIdentityUI 메서드를 사용하도록 ConfigureServices의 코드를 업데이트합니다.

    public class Startup
    {
     ...
     // This method gets called by the runtime. Use this method to add services to the container.
     public void ConfigureServices(IServiceCollection services)
     {
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
             .AddMicrosoftIdentityWebApp(Configuration, "AzureAd");
    
      services.AddRazorPages().AddMvcOptions(options =>
      {
       var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
       options.Filters.Add(new AuthorizeFilter(policy));
      }).AddMicrosoftIdentityUI();
    
  3. Startup.csConfigure 메서드에서 app.UseAuthentication();app.MapControllers();를 호출하여 인증을 사용하도록 설정합니다.

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
     // more code here
     app.UseAuthentication();
     app.UseAuthorization();
    
     app.MapRazorPages();
     app.MapControllers();
     // more code here
    }
    

이 코드의 경우 다음과 같습니다.

  • AddMicrosoftIdentityWebApp 확장 메서드는 Microsoft.Identity.Web에 정의되어 있습니다.

    • 옵션을 구성하여 구성 파일을 읽습니다(이 경우 "Microsoft Entra ID" 섹션에서).
    • Microsoft ID 플랫폼에 권한이 부여되도록 OpenID Connect 옵션을 구성합니다.
    • 토큰 발급자의 유효성을 검사합니다.
    • 이름에 해당하는 클레임이 ID 토큰의 preferred_username 클레임에서 매핑되었는지 확인합니다.
  • 구성 개체 외에도 AddMicrosoftIdentityWebApp을 호출할 때 구성 섹션의 이름을 지정할 수 있습니다. 기본적으로 AzureAd입니다.

  • AddMicrosoftIdentityWebApp에는 고급 시나리오에 대한 다른 매개 변수가 있습니다. 예를 들어 OpenID Connect 미들웨어 이벤트를 추적하면 인증이 작동하지 않을 때 웹 애플리케이션의 문제 해결을 지원할 수 있습니다. 선택적 매개 변수 subscribeToOpenIdConnectMiddlewareDiagnosticsEventstrue로 설정하면 ASP.NET Core 미들웨어 집합이 HTTP 응답으로부터 HttpContext.User의 사용자 ID로 진행할 때 정보를 처리하는 방법을 보여줍니다.

  • AddMicrosoftIdentityUI 확장 메서드는 Microsoft.Identity.Web.UI에 정의되어 있습니다. 로그인 및 로그아웃을 처리하는 기본 컨트롤러를 제공합니다.

Microsoft.Identity.Web을 사용하여 웹앱을 만드는 방법에 대한 자세한 내용은 microsoft-identity-web의 웹앱을 참조하세요.

다음 단계

다음 문서에서는 로그인 및 로그아웃을 트리거하는 방법을 알아봅니다.

이 시나리오의 다음 문서인 로그인 및 로그아웃으로 이동합니다.