자습서: 외부 테넌트에서 인증을 위해 ASP.NET Core 웹앱 준비
이 자습서는 ASP.NET Core 웹 애플리케이션을 빌드하고 Microsoft Entra 관리 센터를 사용하여 인증을 준비하는 방법을 보여 주는 시리즈의 2부입니다. 이 시리즈의 1부에서는 애플리케이션을 등록하고 외부 테넌트에서 사용자 흐름을 구성했습니다. 이 자습서에서는 ASP.NET Core 웹앱을 만들고 인증을 위해 구성하는 방법을 보여 줍니다.
이 자습서에서는 다음을 수행합니다.
- Visual Studio Code에서 ASP.NET Core 프로젝트 만들기
- 필요한 NuGet 패키지 추가
- 애플리케이션에 대한 설정 구성
- 인증을 구현하는 코드 추가
필수 조건
- 자습서: ASP.NET Core 웹앱을 빌드하기 위해 외부 테넌트 준비
- ASP.NET Core 애플리케이션을 지원하는 모든 IDE(통합 개발 환경)를 사용할 수 있지만 이 자습서에서는 Visual Studio Code를 사용합니다. 여기에서 다운로드할 수 있습니다.
- .NET 7.0 SDK.
ASP.NET Core 프로젝트 만들기
Visual Studio Code를 열고 파일>폴더 열기...를 선택합니다. 프로젝트를 만들 위치로 이동하여 선택합니다.
터미널 >새 터미널을 선택하여 새 터미널을 엽니다.
다음 명령을 입력하여 MVC(Model View Controller) ASP.NET 프로젝트를 만듭니다.
dotnet new mvc -n dotnetcore_webapp
ID 패키지 설치
사용자를 인증하려면 ID 관련 NuGet 패키지를 프로젝트에 설치해야 합니다.
다음 명령을 입력하여 dotnetcore_webapp 폴더로 변경하고 관련 NuGet 패키지를 설치합니다.
cd dotnetcore_webapp dotnet add package Microsoft.Identity.Web.UI
인증을 위한 애플리케이션 구성
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
- 서버가 응답을 적절한 애플리케이션으로 리디렉션하는 데 도움이 되는 식별자입니다.
파일의 변경 내용을 저장합니다.
Properties/launchSettings.json 파일을 엽니다.
profiles
의https
섹션에서applicationUrl
의https
URL을https://localhost:7274
로 읽도록 변경합니다. 이 URL을 사용하여 리디렉션 URI를 정의했습니다.문서의 변경 내용을 저장합니다.
사용자 지정 URL 도메인 사용(선택 사항)
사용자 지정 도메인을 사용하여 인증 URL을 완전히 브랜딩합니다. 사용자 관점에서 볼 때, 사용자는 인증 과정 동안 ciamlogin.com 도메인 이름으로 리디렉션되는 것이 아니라 도메인에 남아 있습니다.
사용자 지정 도메인을 사용하려면 다음 단계를 따릅니다.
외부 테넌트에 대한 사용자 지정 URL 도메인을 사용하도록 설정하려면 외부 테넌트의 앱에 대한 사용자 지정 URL 도메인 사용하도록 설정의 단계를 사용합니다.
appsettings.json 파일을 엽니다.
Authority
속성의 값을 https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here로 업데이트합니다.Enter_the_Custom_Domain_Here
를 사용자 지정 URL 도메인으로,Enter_the_Tenant_ID_Here
를 테넌트 ID로 바꿉니다. 테넌트 ID가 없는 경우 테넌트 세부 정보를 읽는 방법을 알아봅니다.- [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]
특성은 권한 부여된 사용자만 웹앱을 사용할 수 있도록 지정하는 데 사용됩니다.
코드 편집기에서 Controllers\HomeController.cs 파일을 엽니다.
컨트롤러에 권한 부여를 추가해야 합니다. 파일 상단이 다음 코드 조각과 동일하도록
Microsoft.AspNetCore.Authorization
을 추가합니다.using System.Diagnostics; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using dotnetcore_webapp.Models;
또한
HomeController
클래스 정의 바로 위에[Authorize]
특성을 추가합니다.[Authorize]
Program.cs에 인증 및 권한 부여 추가
웹앱에 인증 및 권한 부여를 추가하려면 Program.cs를 수정해야 합니다. 여기에는 인증 및 권한 부여를 위한 네임스페이스를 추가하고 Microsoft ID 플랫폼을 사용하여 사용자를 로그인할 수 있는 기능이 포함됩니다.
필수 네임스페이스를 추가하려면 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;
다음으로, 웹앱이 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();