ASP.NET Core Identity system에서 제공하는 인증과 권한은 ASP.NET Core platform및 개별 application framework에 깔끔하게 통합됩니다. 이를 이용해 Admin라 불리는 단 하나의 사용자만이 application의 관리자기능에 인증및 접근할 수 있도록 하는 기본적인 보안 설정을 만들것입니다. ASP.NET Core Identity는 application및 data로 접근가능한 권한 및 사용자 인증을 위한 더 많은 기능을 제공하고 있으며 그것 자체로 하나의 큰 framework이기 때문에 여기서는 기본적인 기능만을 살펴보려고 합니다.
이 글의 목표는 사용자가 application의 민감한 부분에 접근하게 되는 것을 방지하기 위해 무엇이 필요한지를 확인하는데 있습니다. 이를 통해 ASP.NET Core application에서 어떻게 인증및 권한이 적용될 수 있는지를 알 수 있을 것입니다.
1. Identity database 생성
ASP.NET Identity system은 무한한 구성과 확장성 그리고 사용자 data를 저장하는 방식에 대한 수 많은 설정을 지원합니다. 예제에서는 Entity Framework Core를 사용해 Microsoft SQL Server에 data를 저장하는 일반적인 방식을 사용할 것입니다.
(1) Entity Framework Core를 위한 Identity package 설치
Entity Frame work Core에 대한 ASP.NET Core Identity 지원을 포함하는 package를 설치하기 위해 powershell에서 CompuMallStore.csproj가 있는 folder아래 다음 명령을 실행합니다.
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore |
(2) context class 생성
다음으로 database와 database로의 접근을 제공하는 Identity model 개체사이에 다리 역활을 수행할 database context file을 만들어야 합니다. Models folder에 AppIdentityDbContext.cs이름의 file을 아래와 같이 추가합니다.
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
namespace CompuMallStore.Models;
public class AppIdentityDbContext : IdentityDbContext<IdentityUser>
{
public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options) : base (options)
{
}
}
AppIdentityDbContext는 Entity Framework Core에 대한 Identity별 기능을 제공하는 IdentityDbContext로 부터 파생되며 type parameter로 사용자를 표현하기 위해 사용되는 기본 class인 IdentityUser class를 사용하였습니다.
(3) 연결 문자열 설정
이제 database에 대한 연결문자열을 설정해야 합니다. 이를 위해 project의 appsettings.json file에서 다음과 같이 연결문자열을 추가합니다. 이 문자열형식은 이전에 database를 위해 추가한 연결문자열 형식과 동일합니다.
..생략
"AllowedHosts": "*",
"ConnectionStrings": {
"CompuMallStoreConnection": "Server=(localdb)\\MSSQLLocalDB;Database=CompuMallStore;MultipleActiveResultSets=true",
"IdentityConnection": "Server=(localdb)\\MSSQLLocalDB;Database=Identity;MultipleActiveResultSets=true"
}
IdentityConnection으로 추가한 연결문자열은 Identity라는 localDB를 지정하고 있습니다.
(4) Application 설정
다른 ASP.NET Core 기능과 마찬가지로 Identity역시 Program.cs에서 설정됩니다. context class와 이전에 연결문자열을 사용해 Program.cs를 아래와 같이 변경하여 Identity를 설정합니다.
using Microsoft.EntityFrameworkCore;
using CompuMallStore.Models;
using Microsoft.AspNetCore.Identity;
..생략
builder.Services.AddServerSideBlazor();
builder.Services.AddDbContext<AppIdentityDbContext>(options => options.UseSqlServer(builder.Configuration["ConnectionStrings:IdentityConnection"]));
builder.Services.AddIdentity<IdentityUser, IdentityRole>().AddEntityFrameworkStores<AppIdentityDbContext>();
var app = builder.Build();
..생략
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
..생략
예제에서는 Entity Framework Core 구성을 확장하여 context class와 AddIdentity method를 사용해 User와 role을 나타내는 기본 내장 class로 Identity service를 등록하고 있습니다. 또한 UseAuthentication과 UseAuthorization method를 호출하여 보안정책을 구현하는 middleware component를 설정하고 있습니다.
(5) Database migration 생성 및 적용
이제 기본적인 설정이 모두 완료되었으므로 Entity Framework Core migration 기능을 사용해 schema를 정의하고 이를 database에 적용할 것입니다. PowerShell에서 아래 명령을 실행해 Identity database를 위한 새로운 migration을 생성합니다.
dotnet ef migrations add Initial --context AppIdentityDbContext |
이전에 사용한 database 명령과의 중요한 차이점 중 하나는 --context 인수를 사용해 작업하고자 하는 database와 관련 context class의 이름을 지정했다는 것입니다. Application에서 다수의 database를 사용할때 명확하게 context class를 지정하는 것이 좋습니다.
Entity Framework Core가 초기 migration을 생성하고 나면 아래 명령을 실행해 database를 만들고 migration을 적용합니다.
dotnet ef database update --context AppIdentityDbContext |
이 과정을 통해 결과적으로 Identity라는 새로운 LocalDB database가 만들어지게 됩니다.
(6) seed data 정의하기
Application이 시작할때 database를 seeding함으로서 Admin 사용자를 명시적으로 생성할 것입니다. 이를 위해 Models folder에 IdentitySeedData.cs이름의 file을 아래와 같이 추가합니다.
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace CompuMallStore.Models;
public static class IdentitySeedData
{
private const string adminUser = "admin";
private const string adminPassword = "Admin123!";
public static async void AddInitData(IApplicationBuilder app)
{
AppIdentityDbContext context = app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<AppIdentityDbContext>();
if (context.Database.GetPendingMigrations().Any())
context.Database.Migrate();
UserManager<IdentityUser> userManager = app.ApplicationServices.CreateScope().ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();
IdentityUser? user = await userManager.FindByNameAsync(adminUser);
if (user == null)
{
user = new IdentityUser(adminUser);
user.Email = "admin@test.com";
await userManager.CreateAsync(user, adminPassword);
}
}
}
상기 예제는 관리자를 위해 ASP.NET Core Identity에서 service로 제공되는 UserManager<T> class를 사용하여 database가 생성되도록 하는 것으로 admin사용자를 검색하고 존재하지 않으면 지정한 password와 함께 사용자를 생성하게 됩니다. 이때 password는 Identity가 숫자와 문자열을 포함하는 password를 가질 수 있도록 하는 정책을 가지고 있기 때문에 그에 맞게 만들어져야 합니다. 추후에는 이러한 보안정책을 어떻게 바꿀 수 있는지 별도로 알아볼 것입니다.
Application이 배포되고 해당 Application을 관리하기 위해 사전에 관리자 계정을 hard coding하는 경우가 있습니다. 실제 이러한 상황이 발생할때는 추후에 관리자 계정의 비밀번호를 바꿔야 합니다.
Application이 시작할때 Identity database가 seed되도록 Program.cs에 다음과 같이 변경합니다.
..생략
SeedData.AddInitData(app);
IdentitySeedData.AddInitData(app);
app.Run();
ASP.NET Core Identity database를 삭제하고 재생성하려면 아래 명령을 사용해 초기화 하고 Application을 다시 실행합니다.
dotnet ef database drop --force --context AppIdentityDbContext
2. 관리자 기능 추가하기
이전까지 관리자 기능을 만드는데 Blazor를 사용해왔으며 이로서 예제 Project를 통해 다양한 ASP.NET Core 기능을 설명할 수 있었습니다. 물론 Blazor자체는 괜찮은 기술이긴 하지만 그렇다고 해서 모든 Project에 적합한 것은 아니며 대부분의 경우 Controller와 Razor Page를 사용하는 것으로 목적한 바를 달성할 수 있습니다. 따라서 이번에는 ASP.NET Core Identity database에서 사용자의 목록을 표시하기 위해 Razor Page를 사용하고자 합니다. 이를 위해 Pages > Admin folder에 IdentityUsers .cshtml이름의 file을 아래와 같이 추가합니다.
@page
@model IdentityUsersModel
@using Microsoft.AspNetCore.Identity;
<h3>Admin User</h3>
<table>
<tbody>
<tr><th>User</th><td>@Model.AdminUser?.UserName</td></tr>
<tr><th>Email</th><td>@Model.AdminUser?.Email</td></tr>
<tr><th>Phone</th><td>@Model.AdminUser?.PhoneNumber</td></tr>
</tbody>
</table>
@functions {
public class IdentityUsersModel : PageModel
{
private UserManager<IdentityUser> userManager;
public IdentityUsersModel(UserManager<IdentityUser> mgr)
{
userManager = mgr;
}
public IdentityUser? AdminUser { get; set; } = new();
public async Task OnGetAsync()
{
AdminUser = await userManager.FindByNameAsync("Admin");
}
}
}
Project를 실행하고 /admin/identityUsers URL을 요청하여 아래와 같은 결과가 생성되는지 확인합니다.
3. 기본 authorization 정책 적용
지금까지 ASP.NET Core Identity 구성해 왔으므로 이제 Application에서 별도의 권한이 필요한 영역에 허가(authorization)와 관련된 정책을 적용할 수 있습니다. 예제에서는 가능한한 가장 기본적인 정책만을 적용하여 인증된 사용자만이 접근을 허가하도록 할 것입니다. 대부분의 Application에서 충분히 적용할 수 있는 방식이기는 하지만 좀더 세분화된 권한 제어를 만들 수 있는 option도 존재합니다. 예제 application에서는 한명의 사용자만을 대상으로 하므로 익명과 인증된 요청을 구분하는 것만으로 충분합니다.
Pages > Admin folder의 IdentityUsers.cshtml을 아래와 같이 변경하여 Controller와 Razor page에서는 접근제어를 위해 사용된 Authorize attribute를 아래와 같이 적용합니다.
@page
@model IdentityUsersModel
@using Microsoft.AspNetCore.Identity
@using Microsoft.AspNetCore.Authorization
..생략
[Authorize]
public class IdentityUsersModel : PageModel
..생략
인가와 미인가 사용자만이 존재하는 경우 Application의 Blazor 부분에 대한 전체 진입점 역활을 하는 Razor page에 Authorize attribute를 아래와 같이 적용할 수 있습니다. 예제에서 해당 Razor page는 Pages > Admin folder의 Index.cshtml에 해당합니다.
@page "/admin"
@{ Layout = null; }
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
..생략
해당 Razor Page는 Page model이 없이 구성되었으므로 attribute는 @attribute 표현식으로 적용할 수 있습니다.
4. account controller와 view 생성
미인증된 사용자가 허가가 필요한 요청을 보내는 경우 해당 사용자에 대해 자격증명(로그인 등.)을 요구할 수 있는 Page인 /Account/Login URL로 Redirect해줄 필요가 있습니다. 이를 위해 Models > ViewModels folder에 LoginModel.cs이름의 file을 아래와 같이 추가합니다. 해당 class는 사용자의 자격증명을 나타내기 위한 View model입니다.
namespace CompuMallStore.Models.ViewModels;
public class LoginModel
{
public required string Name { get; set; }
public required string Password { get; set; }
public string ReturnUrl { get; set; } = "/";
}
예제에서 Name과 Password속성에는 Required keyword가 사용되었으며 이는 Model 유효성과정에서 해당 속성에 값이 제공되어야 함을 나타냅니다. 다음으로 Controllers folder에 AccountController.cs file을 아래와 같이 추가합니다. 해당 Controller는 /Account/Login에 대한 요청에 응답하기 위한 것입니다. 추후에는 Razor page에서 어떻게 인증을 처리할지 알아볼 것이지만 다양성을 위해 현재 예제에서는 Controller와 View를 사용해볼 것입니다.
using CompuMallStore.Models.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
namespace CompuMallStore.Controllers;
public class AccountController : Controller
{
private UserManager<IdentityUser> userManager;
private SignInManager<IdentityUser> signInManager;
public AccountController(UserManager<IdentityUser> userMgr, SignInManager<IdentityUser> signInMgr)
{
userManager = userMgr;
signInManager = signInMgr;
}
public ViewResult Login(string returnUrl)
{
return View(new LoginModel
{
Name = string.Empty, Password = string.Empty,
ReturnUrl = returnUrl
});
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginModel loginModel)
{
if (ModelState.IsValid)
{
IdentityUser? user = await userManager.FindByNameAsync(loginModel.Name);
if (user != null)
{
await signInManager.SignOutAsync();
if ((await signInManager.PasswordSignInAsync(user, loginModel.Password, false, false)).Succeeded)
return Redirect(loginModel?.ReturnUrl ?? "/Admin");
}
ModelState.AddModelError(string.Empty, "Invalid name or password");
}
return View(loginModel);
}
[Authorize]
public async Task<RedirectResult> Logout(string returnUrl = "/")
{
await signInManager.SignOutAsync();
return Redirect(returnUrl);
}
}
사용자가 /Account/Login URL로 Redirect되면 Login action method의 Get version이 Page에 기본 View를 Render하고 인증요청이 성공적으로 진행된 경우 browser가 redirect해야할 URL을 포함한 model view 개체를 제공하게 됩니다.
인증을 위한 자격증명정보를 Login action method의 Post version으로 전송되는데 여기서는 Controller의 생성자를 통해 생성된 UserManager<IdentityUser>와 SignInManager<IdentityUser> service를 사용해 사용자를 인증하고 system에 log in을 수행하게 됩니다. 이들 class가 어떻게 작동하는지에 관해서는 추후에 자세히 알아볼 것입니다. 예제에서는 인증에 실패하는 경우 model validation error를 만들게 되고 기본 View를 render하게 되지만 인증에 성공하는 경우 사용자가 원하는 URL redirect하게 됩니다.
일반적으로 client-side 유효성인증방식을 사용하게 되면 server에서 발생할 수 있는 일부 부하를 맡게 되고 사용자에게 제공된 data에 대한 즉각적인 feedback을 줄 수 있습니다. 하지만 최종적인 인증처리는 반드시 server에서 수행되어야 합니다.
Login method에서 render할 view를 제공하려면 Views > Account folder를 생성하고 여기에 Login.cshtml view file을 아래와 같이 추가합니다.
@model LoginModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>CompuMall Store</title>
</head>
<body>
<div>
<div asp-validation-summary="All"></div>
<form asp-action="Login" asp-controller="Account" method="post">
<input type="hidden" asp-for="ReturnUrl" />
<div>
<label asp-for="Name"></label>
<input asp-for="Name" />
</div>
<div>
<label asp-for="Password"></label>
<input asp-for="Password" type="password" />
</div>
<button type="submit">
Log In
</button>
</form>
</div>
</body>
</html>
마지막으로 Pages > Admin folder의 AdminLayout.razor에 Logout action으로 요청을 보내는 Log out link를 아래와 같이 추가합니다. 이렇게 하면 browser의 cookie를 삭제하지 않고도 log in에 대한 Application을 test할 수 있을 것입니다.
..생략
<div>
<div class="row">
<div class="column">
<div class="row">
<NavLink href="/admin/products" Match="NavLinkMatch.Prefix">
Products
</NavLink>
</div>
<div class="row">
<NavLink href="/admin/orders" Match="NavLinkMatch.Prefix">
Orders
</NavLink>
</div>
</div>
<div class="column">
@Body
</div>
</div>
<div class="row">
<div>
<a href="/account/logout">Log Out</a>
</div>
</div>
</div>
5. 보안 정책 확인
이제 모든 것이 준비되었으므로 예제를 실행하고 /admin으로 URL을 요청해 보안정책을 확인해 볼 수 있습니다. 현재는 미 인증된 상태이므로 인증이 필요한 action method로 요청이 시도되면 /Account/Login URL로 redirect될 것입니다.
이 상태에서 admin / Admin123! 로 login을 시도하면 이를 토대로 Account controller는 Identity database에 제공된 data와 입력값을 비교하게 됩니다. Name과 Password를 정확히 입력하게 되면 해당 사용자를 인증 후 본래 요청한 URL로 redirect를 수행합니다.
6. 배포 준비하기
ASP.NET Core application에서 가능한 다양한 배포 model이 존재하지만 예제에서는 Docker container를 사용해 보고자 합니다. Docker container는 대부분의 hosting platform에서 동작할 수 있으며 개인별 data center에 배포될 수 있습니다. 완벽한 guide를 제공하려는 것은 아니지만 application을 준비하는 과정을 이해하는데 도움이 될 것입니다.
(1) Error handling 설정
지금까지 application은 개발자 친화적인 error page를 사용함으로서 발생한 문제점에 대한 정보를 제공해 줄 수 있었습니다. 하지만 최종 사용자가 볼법한 장면은 아니기에 Pages folder에 Error.cshtml이름의 Razor page를 아래와 같이 추가합니다.
@page "/error"
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Error</title>
</head>
<body>
<h2>Error.</h2>
<h3>
An error occurred while processing your request
</h3>
</body>
</html>
사용자에게 표시되는 error page는 마지막 수단으로 표시되는 것으로서 공유 view나 view component 및 기타 다른 기능에 의존하지 않게 함으로서 가능한한 단순하게 유지하는 것이 좋습니다. 예제의 경우에도 공유 layout을 사용하지 않고 있으며 발생한 문제점에 대한 추가적인 정보를 배제하고 단순히 오류가 발생했음을 나타내는 간단한 HTML만을 포함하고 있습니다.
위와 같이 Error page를 추가하고 나면 application이 실제 동작중인 환경에서 예외가 발생하는 경우 해당 error page가 예외처리하는데 사용될 수 있도록 Program.cs를 아래와 같이 구성해야 합니다. 또한 Docker container로 배포할때 필요한 locale도 설정하고 있는데 설정에 사용한 ko-KR은 대한민국에서의 언어와 통화규칙을 나타냅니다.
..생략
var app = builder.Build();
if (app.Environment.IsProduction())
app.UseExceptionHandler("/error");
app.UseRequestLocalization(opts => {
opts.AddSupportedCultures("ko-KR")
.AddSupportedUICultures("ko-KR")
.SetDefaultCulture("ko-KR");
});
..생략
예제에서 사용된 app.Enviroment는 IWebHostEnvironment interface를 반환하는 것으로 현재 application이 동작중인 환경을 확인할 수 있습니다. 따라서 위와 같은 설정은 application이 production환경(실제 동작 환경)일때 UseExceptionHandler method가 호출되도록 하는 것이며 그렇지 않으면 개발자를 위한 error page가 사용됩니다.
(2) Production 환경 설정
연결문자열과 같은 설정을 정의하기 위해 사용되는 JSON 설정 file은 application이 개발(development), 안정(staging), 운영(production)과 같은 특정 환경에서만 적용될 수 있도록 생성할 수 있습니다. 예제 Project를 처음 생성할때 사용한 template은 appsettings.json과 appsettings.Development.json file을 만들었는데 이 file은 개발전용으로 재정의되는 기본 설정이 됩니다. 하지만 예제에서는 production전용 설정만을 포함하는 file을 정의할 것입니다. 이를 위해 appsettings.Production.json이름의 json file을 project folder에 아래와 같이 추가합니다.
{
"ConnectionStrings": {
"CompuMallStoreConnection": "Server=sqlserver;Database=CompuMallStore;MultipleActiveResultSets=true;User=sa;Password=!cliel123;Encrypt=False",
"IdentityConnection": "Server=sqlserver;Database=Identity;MultipleActiveResultSets=true;User=sa;Password=!cliel123;Encrypt=False"
}
}
각각의 연결문자열에서는 SQL Server에 대한 연결문자열을 정의하고 있으며 해당 SQL Server는 다른 Docker container를 통해 동작할 것입니다. 또한 최대한 단순함을 유지하기 위해 Database로의 연결 암호화는 사용하지 않습니다.
(3) Docker image 생성
이제 Microsoft Azure나 Amazon Web Services와 같이 container환경으로 배포할 수 있는 Application의 Docker image를 생성할 것입니다. Container가 배포를 위한 유일한 수단은 아닙니다. 만약 이러한 방법이 본인 style에 맞지 않다면 가능한 다른 방법도 알마든지 활용할 수 있습니다.
예제에서는 개발 machine에서 동작중인 database에 연결을 시도할텐데 이는 실제 application에서 구성되는 방식이 아닙니다. database 연결 문자열과 container networking 설정은 반드시 production환경과 일치하도록 설정해야 합니다.
● Docker desktop 설치
Docker Desktop은 아래 link를 통해 내려받아 설치할 수 있습니다.
Docker Desktop: The #1 Containerization Tool for Developers | Docker
Docker를 설치한 뒤 재부팅하고 PowerShell에서 아래 명령을 입력해 Docker의 설치여부를 확인합니다.
docker --version |
● Docker 구성 file 생성
Docker는 Dockerfile이름의 file을 통해 구성됩니다. Visual Studio에서는 해당 file을 위한 template은 존재하지 않으므로 Project에 Dockerfile.text라는 file을 추가하고 이름을 Dockerfile로 변경해야 합니다. Visual Studio Code라면 확장자를 지정하지 않고 Dockerfile을 아래와 같이 생성합니다.
Docker file없이 container 이미지 생성하기
Microsoft는 .NET에 Dockerfile이 없이도 application의 image를 생성할 수 있는 기능을 도입하였으며 각종설정에 대한 세부사항은 csproj file에 저장합니다. 물론 이것도 좋은 생각이긴 하지만 image의 구성설정을 자동화된 도구로 맡겨놓기에는 상당히 중요한 부분이며 잘못된 설정은 appliication의 성능에 심각한 영향을 줄 수 있기 때문에 개발자가 이해하고 있어야 하는 부분이기도 합니다.
FROM mcr.microsoft.com/dotnet/aspnet:8.0
COPY /bin/Release/net8.0/publish/ CompuMallStore/
ENV ASPNETCORE_ENVIRONMENT Production
ENV Logging__Console__FormatterName=Simple
EXPOSE 5000
WORKDIR /CompuMallStore
ENTRYPOINT ["dotnet", "CompuMallStore.dll", "--urls=http://0.0.0.0:5000"]
위 명령어들은 CompuMallStore의 application을 Docker image로 복사하고 이것이 실행을 구성합니다. 다음으로 docker-compose.yml이름의 file을 아래와 같이 추가합니다.
아래 file은 container를 생성하고 함께 작동하도록 하는 Docker Compose에 사용됩니다. Docker Compose는 production환경으로 container를 배포하는데 가장 많이 사용되고 있는 Kubernetes에 의해 대체되었는데 상대적으로 복잡한면이 있는 특징 때문에 지금도 여전히 Docker Compose가 개발 및 테스트용으로 사용되고 있습니다.
version: "3"
services:
compumallstore:
build: .
ports:
- "5000:5000"
environment:
- ASPNETCORE_ENVIRONMENT=Production
depends_on:
- sqlserver
sqlserver:
image: "mcr.microsoft.com/mssql/server"
environment:
SA_PASSWORD: "!cliel123"
ACCEPT_EULA: "Y"
위 예제의 yml file은 특히 들여쓰기에 민감하므로 되도록이면 예제와 완전히 동일하게 작성하시길 바랍니다. 또한 compumallstore와 sqlserver라는 2개의 service를 설정하고 있음에 주목하시기 바랍니다.
● Application을 배포하고 image화 하기
PowerShell에서 아래 명령을 사용해 Application을 준비합니다.
dotnet publish -c Release |
그 다음 아래 명령을 통해 CompuMallStore에 대한 Docker image를 생성합니다. 해당 명령은 ASP.NET Core의 Docker image를 내려받기 때문에 실행을 완료하는데 시간이 걸릴 수 있습니다.
docker-compose build |
● Container화된 Application실행
아래 명령을 실행해 SQL Server에 대한 Docker Container를 시작합니다. 해당 명령역시 SQL Server에 대한 Docker image를 내려받아야 하기 때문에 처음에는 명령을 완료하기까지 다소 시간이 걸릴 수 있습니다. 이때 sqlserver라는 명칭은 yml file에서 명시한 이름입니다.
docker-compose up sqlserver |
명령을 실행하고 나면 다음과 같이 SQL Server가 실행중인 상태가 되는데
해당 명령창을 그대로 놔두고 별도의 명령창을 다시 실행하여 아래 명령을 통해 CompuMallStore에 대한 Container를 시작하도록 합니다. 이때 compumallstore라는 명칭은 yml file에서 명시한 이름입니다.
docker-compose up compumallstore |
명령 실행 후 아래와 같이 network 접근에 대한 요청화면에 나오면 'Allow'를 click해 줍니다.
'.NET > ASP.NET' 카테고리의 다른 글
[ASP.NET Core] - 11. ASP.NET Core platform (0) | 2024.05.15 |
---|---|
[ASP.NET Core] - 9. Shopping mall project 만들기 - 4 (2nd) (0) | 2024.04.22 |
[ASP.NET Core] - 8. Shopping mall project 만들기 - 3 (2nd) (0) | 2024.04.19 |
[ASP.NET Core] - 7. Shopping mall project 만들기 - 2 (2nd) (0) | 2024.04.15 |
[ASP.NET Core] - 6. Shopping mall project 만들기 - 1 (2nd) (2) | 2024.04.05 |