다음을 통해 공유


자습서: 외부 테넌트에서 인증을 위해 ASP.NET Core 웹앱 준비

이 자습서는 ASP.NET Core 웹 애플리케이션을 빌드하고 Microsoft Entra 관리 센터를 사용하여 인증을 준비하는 방법을 보여 주는 시리즈의 2부입니다. 이 시리즈의 1부에서는 애플리케이션을 등록하고 외부 테넌트에서 사용자 흐름을 구성했습니다. 이 자습서에서는 ASP.NET Core 웹앱을 만들고 인증을 위해 구성하는 방법을 보여 줍니다.

이 자습서에서는 다음을 수행합니다.

  • Visual Studio Code에서 ASP.NET Core 프로젝트 만들기
  • 필요한 NuGet 패키지 추가
  • 애플리케이션에 대한 설정 구성
  • 인증을 구현하는 코드 추가

필수 조건

ASP.NET Core 프로젝트 만들기

  1. Visual Studio Code를 열고 파일>폴더 열기...를 선택합니다. 프로젝트를 만들 위치로 이동하여 선택합니다.

  2. 터미널 >새 터미널을 선택하여 새 터미널을 엽니다.

  3. 다음 명령을 입력하여 MVC(Model View Controller) ASP.NET 프로젝트를 만듭니다.

    dotnet new mvc -n dotnetcore_webapp
    

ID 패키지 설치

사용자를 인증하려면 ID 관련 NuGet 패키지를 프로젝트에 설치해야 합니다.

  1. 다음 명령을 입력하여 dotnetcore_webapp 폴더로 변경하고 관련 NuGet 패키지를 설치합니다.

    cd dotnetcore_webapp
    dotnet add package Microsoft.Identity.Web.UI
    

인증을 위한 애플리케이션 구성

  1. appsettings.json 파일을 열고 기존 코드를 다음 코드 조각으로 바꿉니다.

    {
      "AzureAd": {
        "Authority": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/",
        "ClientId": "Enter_the_Application_Id_Here",
        "ClientCredentials": [
          {
            "SourceType": "ClientSecret",
            "ClientSecret": "Enter_the_Client_Secret_Here"
          }
        ],
        "CallbackPath": "/signin-oidc",
        "SignedOutCallbackPath": "/signout-callback-oidc"
      },
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "AllowedHosts": "*"
    }
    
    • Authority - 앱의 ID 공급자 인스턴스 및 로그인 대상 그룹입니다. Enter_the_Tenant_Subdomain_Here를 외부 테넌트 하위 도메인으로 바꿉니다. 이를 찾으려면 사이드바 메뉴에서 개요를 선택한 다음, 개요 탭으로 전환합니다. caseyjensen.onmicrosoft.com 형식으로 기본 도메인을 찾습니다. 하위 도메인은 caseyjensen입니다.
    • ClientId - 클라이언트라고도 하는 애플리케이션의 식별자입니다. 따옴표 안의 텍스트를 등록된 애플리케이션의 개요 페이지에서 이전에 기록한 애플리케이션(클라이언트) ID 값으로 바꿉니다.
    • ClientSecret - 테넌트 준비에서 만든 클라이언트 암호의 값입니다. Microsoft Entra 관리 센터에서 따옴표 안의 텍스트를 클라이언트 암호 으로 바꿉니다.
    • CallbackPath - 서버가 응답을 적절한 애플리케이션으로 리디렉션하는 데 도움이 되는 식별자입니다.
  2. 파일의 변경 내용을 저장합니다.

  3. Properties/launchSettings.json 파일을 엽니다.

  4. profileshttps 섹션에서 applicationUrlhttps URL을 https://localhost:7274로 읽도록 변경합니다. 이 URL을 사용하여 리디렉션 URI를 정의했습니다.

  5. 문서의 변경 내용을 저장합니다.

사용자 지정 도메인 URL 사용(선택 사항)

사용자 지정 도메인을 사용하여 인증 URL을 완전히 브랜드화합니다. 사용자 관점에서 사용자는 ciamlogin.com 도메인 이름으로 리디렉션되지 않고 인증 프로세스 중에 도메인에 남아 있습니다.

사용자 지정 도메인을 사용하려면 다음 단계를 수행합니다.

  1. 외부 테넌트에서 앱에 대한 사용자 지정 URL 도메인을 사용하도록 설정하여 외부 테넌트에 대한 사용자 지정 도메인 URL을 사용하도록 설정하는 단계를 사용합니다.

  2. appsettings.json 파일을 엽니다.

    1. 속성 https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here값을 .로 Authority 업데이트합니다. 사용자 지정 도메인 URL 및 Enter_the_Tenant_ID_Here 테넌트 ID로 대체 Enter_the_Custom_Domain_Here 합니다. 테넌트 ID가 없는 경우 테넌트 세부 정보를 읽는 방법을 알아봅니다.
    2. 이 [Enter_the_Custom_Domain_Here]인 속성을 추가 knownAuthorities 합니다.

appsettings.json 파일을 변경한 후 사용자 지정 도메인 URL이 login.contoso.com 테넌트 ID가 aaaabbbb-0000-cccc-1111-dddd2222eeee인 경우 파일은 다음 코드 조각과 유사하게 표시됩니다.

{
  "AzureAd": {
    "Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "ClientId": "Enter_the_Application_Id_Here",
    "ClientCredentials": [
      {
        "SourceType": "ClientSecret",
        "ClientSecret": "Enter_the_Client_Secret_Here"
      }
    ],
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-callback-oidc",
    "KnownAuthorities": ["login.contoso.com"]
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

HomeController.cs에 권한 부여 추가

HomeController.cs 파일에는 애플리케이션 홈페이지의 코드가 포함되어 있으며 사용자에게 권한을 부여하는 기능이 있어야 합니다. Microsoft.AspNetCore.Authorization 네임스페이스는 웹앱에 대한 권한 부여를 구현하기 위한 클래스와 인터페이스를 제공하고, [Authorize] 특성은 권한 부여된 사용자만 웹앱을 사용할 수 있도록 지정하는 데 사용됩니다.

  1. 코드 편집기에서 Controllers\HomeController.cs 파일을 엽니다.

  2. 컨트롤러에 권한 부여를 추가해야 합니다. 파일 상단이 다음 코드 조각과 동일하도록 Microsoft.AspNetCore.Authorization을 추가합니다.

    using System.Diagnostics;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using dotnetcore_webapp.Models;
    
  3. 또한 HomeController 클래스 정의 바로 위에 [Authorize] 특성을 추가합니다.

    [Authorize]
    

Program.cs에 인증 및 권한 부여 추가

웹앱에 인증 및 권한 부여를 추가하려면 Program.cs를 수정해야 합니다. 여기에는 인증 및 권한 부여를 위한 네임스페이스를 추가하고 Microsoft ID 플랫폼을 사용하여 사용자를 로그인할 수 있는 기능이 포함됩니다.

  1. 필수 네임스페이스를 추가하려면 Program.cs를 열고 파일 상단에 다음 코드 조각을 추가합니다.

    using Microsoft.AspNetCore.Authentication.OpenIdConnect;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc.Authorization;
    using Microsoft.Identity.Web;
    using Microsoft.Identity.Web.UI;
    using System.IdentityModel.Tokens.Jwt;
    
  2. 다음으로, 웹앱이 Microsoft ID 플랫폼을 사용하여 사용자를 로그인할 수 있도록 하는 인증 서비스를 애플리케이션에 추가합니다. Program.cs의 나머지 코드를 다음 코드 조각으로 바꿀 수 있습니다.

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddControllersWithViews();
    
    // This is required to be instantiated before the OpenIdConnectOptions starts getting configured.
    // By default, the claims mapping will map claim names in the old format to accommodate older SAML applications.
    // For instance, 'http://schemas.microsoft.com/ws/2008/06/identity/claims/role' instead of 'roles' claim.
    // This flag ensures that the ClaimsIdentity claims collection will be built from the claims in the token
    JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
    
    // Sign-in users with the Microsoft identity platform
    builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(builder.Configuration)
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();
    
    builder.Services.AddControllersWithViews(options =>
    {
        var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
        options.Filters.Add(new AuthorizeFilter(policy));
    }).AddMicrosoftIdentityUI();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Home/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    app.UseAuthorization();
    
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    
    

다음 단계