다음을 통해 공유


보안: ASP.NET Web Forms 및 Blazor의 인증 및 권한 부여

이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 Blazor for ASP NET Web Forms Developers for Azure eBook에서 발췌한 것입니다.

Blazor-for-ASP-NET-Web-Forms-Developers eBook 표지 썸네일.

ASP.NET Web Forms 애플리케이션에서 Blazor로 마이그레이션하려면 애플리케이션에 인증이 구성되었다고 가정하여 인증 및 권한 부여를 수행하는 방법을 업데이트해야 합니다. 이 장에서는 ASP.NET Web Forms 범용 공급자 모델(멤버 자격, 역할, 사용자 프로필에 해당)에서 마이그레이션하는 방법과 Blazor 앱에서 ASP.NET Core Identity를 사용하는 방법을 설명합니다. 이 장에서는 개략적인 단계 및 고려 사항을 설명하지만 참조된 설명서에서 자세한 단계와 스크립트를 찾을 수 있습니다.

ASP.NET 범용 공급자

ASP.NET 2.0부터 ASP.NET Web Forms 플랫폼은 멤버 자격을 포함하여 다양한 기능의 공급자 모델을 지원했습니다. 범용 멤버 자격 공급자와 선택적 역할 공급자는 일반적으로 ASP.NET Web Forms 애플리케이션과 함께 배포됩니다. 현재 계속해서 잘 작동하는 인증 및 권한 부여를 관리하는 강력하고 안전한 방법을 제공합니다. 관련 범용 공급자의 최신 제품은 NuGet 패키지 Microsoft.AspNet.Providers로 제공됩니다.

범용 공급자는 aspnet_Applications, aspnet_Membership, aspnet_Roles, aspnet_Users 같은 테이블을 포함하는 SQL 데이터베이스 스키마를 사용합니다. aspnet_regsql.exe 명령을 실행하여 구성하는 경우 공급자는 기본 데이터를 사용하는 데 필요한 모든 쿼리와 명령을 제공하는 테이블 및 저장 프로시저를 설치합니다. 데이터베이스 스키마와 관련 저장 프로시저는 최신 ASP.NET Identity 및 ASP.NET Core Identity 시스템과 호환되지 않으므로 기존 데이터를 새 시스템으로 마이그레이션해야 합니다. 그림 1에서는 범용 공급자에 대해 구성된 예제 테이블 스키마를 보여 줍니다.

범용 공급자 스키마

범용 공급자는 사용자, 멤버 자격, 역할, 프로필을 처리합니다. 사용자에게는 전역으로 고유한 식별자가 할당되며 userId, userName 등의 기본 정보는 aspnet_Users 테이블에 저장됩니다. 암호, 암호 형식, 암호 솔트, 잠금 카운터 및 세부 정보와 같은 인증 정보는 aspnet_Membership 테이블에 저장됩니다. 역할은 다 대 다 관계를 제공하는 aspnet_UsersInRoles 연결 테이블을 통해 사용자에게 할당되는 이름 및 고유 식별자로 구성됩니다.

기존 시스템에서 멤버 자격 외에 역할을 사용하는 경우 사용자 계정, 연결된 암호, 역할, 역할 멤버 자격을 ASP.NET Core Identity로 마이그레이션해야 합니다. 현재 if 문을 사용하여 역할 검사를 수행하고 있는 코드를 업데이트하여 선언적 필터, 특성 및/또는 태그 도우미를 대신 사용해야 할 수도 있습니다. 이 장의 끝부분에서 마이그레이션 고려 사항을 더 자세히 검토합니다.

Web Forms의 권한 부여 구성

ASP.NET Web Forms 애플리케이션의 특정 페이지에 대한 권한 있는 액세스를 구성하려면 일반적으로 익명 사용자가 특정 페이지 또는 폴더에 액세스할 수 없도록 지정합니다. 해당 구성은 web.config 파일에서 수행됩니다.

<?xml version="1.0"?>
<configuration>
    <system.web>
      <authentication mode="Forms">
        <forms defaultUrl="~/home.aspx" loginUrl="~/login.aspx"
          slidingExpiration="true" timeout="2880"></forms>
      </authentication>

      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
</configuration>

authentication 구성 섹션은 애플리케이션의 양식 인증을 설정합니다. authorization 섹션은 전체 애플리케이션에서 익명 사용자를 거부하는 데 사용됩니다. 그러나 위치별로 더 세분화된 권한 부여 규칙을 제공할 뿐 아니라 역할 기반 권한 부여 검사를 적용할 수 있습니다.

<location path="login.aspx">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
  </system.web>
</location>

위 구성은 첫 번째 구성과 결합하는 경우 익명 사용자가 로그인 페이지에 액세스하여 인증되지 않은 사용자에 대한 사이트 전체 제한 사항을 재정의하도록 허용합니다.

<location path="/admin">
  <system.web>
    <authorization>
      <allow roles="Administrators" />
      <deny users="*" />
    </authorization>
  </system.web>
</location>

위 구성은 다른 구성과 결합하는 경우 /admin 폴더 및 포함된 모든 리소스에 대한 액세스를 “관리자” 역할의 멤버로 제한합니다. /admin 폴더 루트에 별도의 web.config 파일을 배치하여 해당 제한 사항을 적용할 수도 있습니다.

Web Forms의 인증 코드

web.config를 사용하여 액세스를 구성하는 것 외에도 Web Forms 애플리케이션에서 프로그래밍 방식으로 액세스 및 동작을 구성할 수 있습니다. 예를 들어 사용자 역할에 따라 특정 작업을 수행하거나 특정 데이터를 보는 능력을 제한할 수 있습니다.

해당 코드는 코드 숨김 논리뿐 아니라 페이지 자체 둘 다에서 사용할 수 있습니다.

<% if (HttpContext.Current.User.IsInRole("Administrators")) { %>
  <a href="/admin">Go To Admin</a>
<% } %>

사용자 역할 멤버 자격을 검사하는 것 외에도 인증 여부를 확인할 수 있습니다(그러나 위에서 설명한 위치 기반 구성을 사용하면 대개 해당 작업을 더 잘 수행할 수 있음). 해당 접근 방식의 예는 다음과 같습니다.

protected void Page_Load(object sender, EventArgs e)
{
    if (!User.Identity.IsAuthenticated)
    {
        FormsAuthentication.RedirectToLoginPage();
    }
    if (!Roles.IsUserInRole(User.Identity.Name, "Administrators"))
    {
        MessageLabel.Text = "Only administrators can view this.";
        SecretPanel.Visible = false;
    }
}

위 코드에서 RBAC(역할 기반 액세스 제어)는 현재 사용자의 역할에 따라 SecretPanel과 같은 페이지의 특정 요소를 표시할지를 결정하는 데 사용됩니다.

일반적으로 ASP.NET Web Forms 애플리케이션은 web.config 파일 내에서 보안을 구성하고 필요한 경우 .aspx 페이지 및 관련 .aspx.cs 코드 숨김 파일에서 다른 검사를 추가합니다. 대부분 애플리케이션은 대개 추가 역할 공급자와 함께 범용 멤버 자격 공급자를 이용합니다.

ASP.NET Core ID

여전히 인증 및 권한 부여 관련 작업을 수행하지만 ASP.NET Core Identity는 범용 공급자와 비교해 볼 때 다른 추상화 및 가정 세트를 사용합니다. 예를 들어 새 ID 모델은 타사 인증을 지원하므로 사용자는 소셜 미디어 계정 또는 다른 신뢰할 수 있는 인증 공급자를 사용하여 인증할 수 있습니다. ASP.NET Core Identity는 로그인, 로그아웃, 등록과 같이 일반적으로 필요한 페이지용 UI를 지원합니다. 데이터 액세스에 EF Core를 이용하고 EF Core 마이그레이션을 사용하여 데이터 모델을 지원하는 데 필요한 스키마를 생성합니다. 이 ASP.NET Core의 ID 소개에서는 ASP.NET Core Identity에 포함된 기능과 해당 기능으로 작업을 시작하는 방법에 대한 개요를 제공합니다. 애플리케이션 및 해당 데이터베이스에서 ASP.NET Core Identity를 아직 설정하지 않은 경우 해당 개요가 시작하는 데 도움이 됩니다.

역할, 클레임, 정책

범용 공급자와 ASP.NET Core Identity는 둘 다 역할 개념을 지원합니다. 사용자의 역할을 만들고 역할에 사용자를 할당할 수 있습니다. 사용자는 제한 없이 역할에 속할 수 있으며 관리자는 권한 부여 구현의 일부로 역할 멤버 자격을 확인할 수 있습니다.

역할 외에도 ASP.NET Core Identity는 클레임 및 정책의 개념을 지원합니다. 역할은 특히 해당 역할의 사용자가 액세스할 수 있어야 하는 리소스 세트와 일치해야 하지만 클레임은 단순히 사용자 ID의 일부입니다. 클레임은 주체가 수행할 수 있는 작업이 아니라 주체의 정의를 나타내는 이름 값 쌍입니다.

사용자의 클레임을 직접 검사하고 관련 값에 따라 리소스에 대한 액세스 권한을 사용자에게 부여해야 하는지를 결정할 수 있습니다. 그러나 해당 검사는 일반적으로 반복적이고 시스템 전체에 분산됩니다. 더 나은 접근 방식은 ‘정책’을 정의하는 것입니다.

권한 부여 정책은 하나 이상의 요구 사항으로 구성됩니다. 정책은 Startup.csConfigureServices 메서드에 권한 부여 서비스 구성의 일부로 등록됩니다. 예를 들어 다음 코드 조각은 “CanadiansOnly”라는 정책을 구성하며 해당 정책에는 사용자에게 값이 “Canada” 인 Country 클레임이 있어야 한다는 요구 사항이 있습니다.

services.AddAuthorization(options =>
{
    options.AddPolicy("CanadiansOnly", policy => policy.RequireClaim(ClaimTypes.Country, "Canada"));
});

설명서에서 사용자 지정 정책을 만드는 방법에 관해 자세히 알아볼 수 있습니다.

정책 또는 역할을 사용하는지와 관계없이 Blazor 애플리케이션의 특정 페이지에서 [Authorize] 특성이 포함된 역할 또는 정책은 @attribute 지시문을 통해 적용되도록 지정할 수 있습니다.

역할 필요:

@attribute [Authorize(Roles ="administrators")]

정책 충족 필요:

@attribute [Authorize(Policy ="CanadiansOnly")]

코드에서 사용자의 인증 상태, 역할 또는 클레임에 액세스해야 하는 경우 해당 기능을 달성하는 두 가지 기본 방법이 있습니다. 첫 번째는 인증 상태를 연계 매개 변수로 수신하는 것입니다. 두 번째는 삽입된 AuthenticationStateProvider를 사용하여 상태에 액세스하는 것입니다. 각각의 관련 접근 방식에 관한 자세한 내용은 Blazor 보안 설명서를 참조하세요.

다음 코드는 AuthenticationState를 연계 매개 변수로 수신하는 방법을 보여 줍니다.

[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }

해당 매개 변수를 적용하면 다음 코드를 사용하여 사용자를 가져올 수 있습니다.

var authState = await authenticationStateTask;
var user = authState.User;

다음 코드는 AuthenticationStateProvider를 삽입하는 방법을 보여 줍니다.

@using Microsoft.AspNetCore.Components.Authorization
@inject AuthenticationStateProvider AuthenticationStateProvider

공급자를 적용하면 다음 코드를 사용하여 사용자에 대한 액세스 권한을 얻을 수 있습니다.

AuthenticationState authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
ClaimsPrincipal user = authState.User;

if (user.Identity.IsAuthenticated)
{
  // work with user.Claims and/or user.Roles
}

참고: 이 장의 뒷부분에서 설명하는 AuthorizeView 구성 요소는 사용자가 페이지 또는 구성 요소에서 보는 항목을 제어하는 선언적 방법을 제공합니다.

Blazor 서버 애플리케이션에서 사용자 및 클레임으로 사용하려면 사용자의 클레임을 열거 및 수정하는 데 사용할 수 있는 UserManager<T>(기본값에 IdentityUser 사용)를 삽입해야 할 수도 있습니다. 먼저 형식을 삽입하고 이를 속성에 할당합니다.

@inject UserManager<IdentityUser> MyUserManager

그런 다음, 속성을 사용하여 사용자의 클레임을 처리합니다. 다음 샘플에서는 사용자에 대한 클레임을 추가하고 유지하는 방법을 보여 줍니다.

private async Task AddCountryClaim()
{
    var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
    var user = authState.User;
    var identityUser = await MyUserManager.FindByNameAsync(user.Identity.Name);

    if (!user.HasClaim(c => c.Type == ClaimTypes.Country))
    {
        // stores the claim in the cookie
        ClaimsIdentity id = new ClaimsIdentity();
        id.AddClaim(new Claim(ClaimTypes.Country, "Canada"));
        user.AddIdentity(id);

        // save the claim in the database
        await MyUserManager.AddClaimAsync(identityUser, new Claim(ClaimTypes.Country, "Canada"));
    }
}

역할을 사용해야 하는 경우 동일한 접근 방식을 따릅니다. 역할 자체를 나열하고 관리하려면 RoleManager<T>(기본 형식에 IdentityRole 사용)를 삽입해야 할 수 있습니다.

참고: Blazor WebAssembly 프로젝트에서 UserManager<T> 또는 RoleManager<T>를 직접 사용하는 대신 관련 작업을 수행할 수 있는 서버 API를 제공해야 합니다. BlazorWebAssembly 클라이언트 애플리케이션은 해당 용도로 공개된 API 엔드포인트를 안전하게 호출하여 클레임 및/또는 역할을 관리합니다.

마이그레이션 가이드

ASP.NET Web Forms 및 범용 공급자에서 ASP.NET Core Identity로 마이그레이션하려면 다음과 같은 여러 가지 단계가 필요합니다.

  1. 대상 데이터베이스에서 ASP.NET Core Identity 데이터베이스 스키마 만들기
  2. 범용 공급자 스키마에서 ASP.NET Core Identity 스키마로 데이터 마이그레이션
  3. 일반적으로 web.configProgram.cs(또는 클래스)에서 Startup서 구성을 미들웨어와 서비스로 마이그레이션합니다.
  4. 컨트롤 및 조건을 사용하여 개별 페이지를 업데이트하여 태그 도우미 및 새 ID API를 사용합니다.

각 단계는 다음 섹션에서 자세히 설명합니다.

ASP.NET Core Identity 스키마 만들기

ASP.NET Core Identity에 사용되는 필요한 테이블 구조를 만드는 방법에는 여러 가지가 있습니다. 가장 간단한 방법은 새 ASP.NET Core 웹 애플리케이션을 만드는 것입니다. 웹 애플리케이션을 선택한 다음, 인증 유형을 변경하여 개별 계정을 사용합니다.

개별 계정을 사용하는 새 프로젝트

명령줄에서 dotnet new webapp -au Individual을 실행하여 동일한 작업을 수행할 수 있습니다. 앱이 생성되면 앱을 실행하고 사이트에 등록합니다. 아래 표시된 페이지 같은 페이지를 트리거해야 합니다.

마이그레이션 적용 페이지

“마이그레이션 적용” 단추를 클릭하면 필요한 데이터베이스 테이블이 생성됩니다. 또한 다음과 같이 마이그레이션 파일이 프로젝트에 표시됩니다.

마이그레이션 파일

다음 명령줄 도구를 사용하여 웹 애플리케이션을 실행하지 않고 직접 마이그레이션을 실행할 수 있습니다.

dotnet ef database update

기존 데이터베이스에 새 스키마를 적용하는 스크립트를 실행하는 경우 명령줄에서 마이그레이션을 스크립팅할 수 있습니다. 다음 명령을 실행하여 스크립트를 생성합니다.

dotnet ef migrations script -o auth.sql

위 명령은 출력 파일 auth.sql에 SQL 스크립트를 생성하며 이후 원하는 모든 데이터베이스에 대해 해당 스크립트를 실행할 수 있습니다. dotnet ef 명령을 실행하는 데 문제가 있으면 EF Core 도구가 시스템에 설치되어 있는지 확인합니다.

소스 테이블에 추가 열이 있는 경우 새 스키마에서 해당 열에 대해 가장 적합한 위치를 식별해야 합니다. 일반적으로 aspnet_Membership 테이블에 있는 열은 AspNetUsers 테이블에 매핑되어야 합니다. aspnet_Roles의 열은 AspNetRoles에 매핑되어야 합니다. aspnet_UsersInRoles 테이블의 모든 추가 열은 AspNetUserRoles 테이블에 추가됩니다.

별도의 테이블에 추가 열을 배치하는 것이 좋을 수도 있습니다. 그러면 이후 마이그레이션에서 기본 ID 스키마의 사용자 지정을 고려할 필요가 없습니다.

범용 공급자에서 ASP.NET Core Identity로 데이터 마이그레이션

대상 테이블 스키마가 준비되면 다음 단계는 사용자 및 역할 레코드를 새 스키마로 마이그레이션하는 것입니다. 새 열에 매핑되는 열을 포함하여 스키마 차이점의 전체 목록은 여기에서 찾을 수 있습니다.

멤버 자격에서 새 ID 테이블로 사용자를 마이그레이션하려면 설명서에 설명된 단계를 수행해야 합니다. 제공된 해당 단계 및 스크립트를 수행한 후 사용자는 다음에 로그인할 때 암호를 변경해야 합니다.

사용자 암호를 마이그레이션할 수 있지만 프로세스는 훨씬 더 복잡합니다. 사용자가 마이그레이션 프로세스의 일부로 암호를 업데이트하도록 요구하고 고유한 새 암호를 사용하도록 권장하면 애플리케이션의 전반적인 보안이 강화될 수 있습니다.

web.config에서 앱 시작으로 보안 설정 마이그레이션

위에 설명된 대로 ASP.NET 멤버 자격 및 역할 공급자는 애플리케이션의 web.config 파일에서 구성됩니다. ASP.NET Core 앱은 IIS에 연결되지 않고 구성에 별도 시스템을 사용하기 때문에 해당 설정을 다른 곳에서 구성해야 합니다. 대부분의 경우 ASP.NET Core Identity는 Program.cs 파일에서 구성됩니다. 이전에 (ID 테이블 스키마를 생성하기 위해) 만든 웹 프로젝트를 열고 그 Program.cs(또는 Startup.cs) 파일을 검토합니다.

이 코드로 EF Core 및 ID에 대한 지원이 추가됩니다.

// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options =>
    options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

AddDefaultIdentity 확장 메서드는 기본 ApplicationDbContext 및 프레임워크의 IdentityUser 형식을 사용하도록 ID를 구성하는 데 사용됩니다. 사용자 지정 IdentityUser를 사용하는 경우 여기에서 형식을 지정해야 합니다. 이러한 확장 메서드가 애플리케이션에서 작동하지 않는 경우 적절한 using 지시문이 있고 필요한 NuGet 패키지 참조가 있는지 확인합니다. 예를 들어 프로젝트에서 일부 버전의 Microsoft.AspNetCore.Identity.EntityFrameworkCoreMicrosoft.AspNetCore.Identity.UI 패키지를 참조해야 합니다.

그리고 Program.cs에서 사이트에 대해 구성된 필요한 미들웨어를 확인해야 합니다. 특히 UseAuthenticationUseAuthorization이 적절한 위치에 설정되어야 합니다.

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/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.UseAuthentication();
app.UseAuthorization();

//app.MapControllers();
app.MapBlazorHub();
app.MapFallbackToPage("/_Host");

ASP.NET Identity는 Program.cs에서 위치에 대한 익명 또는 역할 기반 액세스를 구성하지 않습니다. 위치별 권한 부여 구성 데이터를 ASP.NET Core의 필터로 마이그레이션해야 합니다. 해당 업데이트가 필요한 폴더와 페이지를 기록해 둡니다. 다음 섹션에서 이와 같이 변경합니다.

개별 페이지를 업데이트하여 ASP.NET Core Identity 추상화 사용

ASP.NET Web Forms 애플리케이션에서 특정 페이지 또는 폴더에 대한 익명 사용자의 액세스를 거부하는 web.config 설정이 있는 경우 해당 페이지에 [Authorize] 특성을 추가하여 변경 내용을 마이그레이션합니다.

@attribute [Authorize]

특정 역할에 속한 사용자 이외에도 액세스를 추가로 거부한 경우 역할을 지정하는 특성을 추가하여 이 동작을 비슷하게 마이그레이션합니다.

@attribute [Authorize(Roles ="administrators")]

[Authorize] 특성은 Blazor 라우터를 통해 연결되는 @page 구성 요소에서만 작동합니다. 특성은 자식 구성 요소에서 작동하지 않으며 대신 AuthorizeView를 사용해야 합니다.

특정 사용자에게 일부 코드를 표시할지를 결정하는 논리를 페이지 태그 내에서 사용하는 경우 이 논리를 AuthorizeView 구성 요소로 바꿀 수 있습니다. AuthorizeView 구성 요소는 사용자에게 볼 수 있는 권한이 있는지에 따라 선택적으로 UI를 표시합니다. 또한 사용자 정보에 액세스하는 데 사용할 수 있는 context 변수를 공개합니다.

<AuthorizeView>
    <Authorized>
        <h1>Hello, @context.User.Identity.Name!</h1>
        <p>You can only see this content if you are authenticated.</p>
    </Authorized>
    <NotAuthorized>
        <h1>Authentication Failure!</h1>
        <p>You are not signed in.</p>
    </NotAuthorized>
</AuthorizeView>

[CascadingParameter] 특성으로 구성된 Task<AuthenticationState에서 사용자에게 액세스하여 절차적 논리 내에서 인증 상태에 액세스할 수 있습니다. 이 구성을 통해 사용자에게 액세스할 수 있으며 액세스한 후 사용자가 인증되고 특정 역할에 속하는지 확인할 수 있습니다. 절차적으로 정책을 평가해야 하는 경우 IAuthorizationService의 인스턴스를 삽입하고 해당 인스턴스에서 AuthorizeAsync 메서드를 호출할 수 있습니다. 다음 샘플 코드에서는 사용자 정보를 가져오고 권한 있는 사용자가 content-editor 정책으로 제한된 작업을 수행할 수 있도록 하는 방법을 보여 줍니다.

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

<button @onclick="@DoSomething">Do something important</button>

@code {
    [CascadingParameter]
    private Task<AuthenticationState> authenticationStateTask { get; set; }

    private async Task DoSomething()
    {
        var user = (await authenticationStateTask).User;

        if (user.Identity.IsAuthenticated)
        {
            // Perform an action only available to authenticated (signed-in) users.
        }

        if (user.IsInRole("admin"))
        {
            // Perform an action only available to users in the 'admin' role.
        }

        if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
            .Succeeded)
        {
            // Perform an action only available to users satisfying the
            // 'content-editor' policy.
        }
    }
}

이와 같이 연계 매개 변수에 바인딩하기 전에 먼저 AuthenticationState를 연계 값으로 설정해야 합니다. 일반적으로 이 작업에는 CascadingAuthenticationState 구성 요소를 사용합니다. 해당 구성은 대개 App.razor에서 수행합니다.

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData"
                DefaultLayout="@typeof(MainLayout)" />
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

요약

Blazor는 ASP.NET Core와 동일한 보안 모델인 ASP.NET Core Identity를 사용합니다. 원래 데이터 스키마에 너무 많은 사용자 지정이 적용되지 않은 경우에는 범용 공급자에서 ASP.NET Core Identity로 마이그레이션이 비교적 간단합니다. 데이터가 마이그레이션된 후 Blazor 앱에서 인증 및 권한 부여 작업을 사용하는 방법은 잘 문서화되어 있으며 대부분 보안 요구 사항을 구성할 수 있고 프로그래밍 방식이 지원됩니다.

참조