Share via


.NET 7의 ASP.NET Core에서 .NET 8로 마이그레이션

이 문서에서는 기존 ASP.NET Core 7.0 프로젝트를 ASP.NET Core 8.0으로 업데이트하는 방법을 설명합니다.

필수 조건

에서 .NET SDK 버전 업데이트 global.json

특정 .NET Core SDK 버전을 대상으로 하는 파일을 사용하는 global.json 경우 설치된 .NET 8.0 SDK 버전으로 속성을 업데이트 version 합니다. 예시:

{
  "sdk": {
-    "version": "7.0.100"
+    "version": "8.0.100"
  }
}

대상 프레임워크 업데이트

프로젝트 파일의 TFM(대상 프레임워크 모니커)net8.0으로 업데이트합니다.

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
  </PropertyGroup>

</Project>

패키지 참조 업데이트

프로젝트 파일에서 각 Microsoft.AspNetCore.*, Microsoft.EntityFrameworkCore.*System.Net.Http.JsonMicrosoft.Extensions.*패키지 참조의 Version 특성을 8.00 이상으로 업데이트합니다. 예시:

<ItemGroup>
-   <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="7.0.12" />
-   <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.12" />
-   <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
-   <PackageReference Include="System.Net.Http.Json" Version="7.0.1" />
+   <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="8.0.0" />
+   <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0" />
+   <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
+   <PackageReference Include="System.Net.Http.Json" Version="8.0.0" />
</ItemGroup>

Blazor

다음 마이그레이션 시나리오를 다룹니다.

ASP.NET Core 앱에 지원을 추가하는 Blazor 방법에 대한 지침은 ASP.NET Core Razor 구성 요소를 ASP.NET Core 앱에 통합을 참조하세요.

Blazor Server 앱 업데이트

.NET 8에서 Web Apps를 사용하는 Blazor 것이 좋지만 Blazor Server 지원됩니다. .NET 8에서 계속 사용 Blazor Server 하려면 이 문서의 처음 세 섹션에 있는 지침을 따릅니다.

Web Apps에 Blazor 도입된 새로운 Blazor 기능은 .NET 8에서 실행되도록 업데이트된 앱에서 사용할 수 Blazor Server 없습니다. 새 .NET 8 Blazor 기능을 채택하려는 경우 다음 섹션 중 하나의 지침을 따르세요.

모든 Blazor 웹앱 규칙 채택

필요에 따라 모든 새 Blazor 웹앱 규칙을 채택하려면 다음 프로세스를 사용하는 것이 좋습니다.

  • 웹앱 프로젝트 템플릿에서 Blazor 새 앱을 만듭니다. 자세한 내용은 ASP.NET Core Blazor 도구를 참조하세요.
  • 앱의 구성 요소 및 코드를 새 Blazor 웹앱으로 이동하여 새 기능을 채택하도록 수정합니다.
  • 웹앱의 레이아웃 및 스타일을 Blazor 업데이트합니다.

새로운 .NET 8 기능은 ASP.NET Core 8.0의 새로운 기능에서 다룹니다. .NET 6 이하에서 앱을 업데이트하는 경우 중간 릴리스에 대한 마이그레이션 및 릴리스 정보(새로운 문서)를 참조하세요.

Blazor Server 앱을 웹앱으로 Blazor 변환

Blazor Server 앱은 코드 변경 없이 .NET 8에서 지원됩니다. 다음 지침을 사용하여 앱을 해당하는 .NET 8 Blazor 웹앱으로 변환 Blazor Server 하면 모든 새 .NET 8 기능을 사용할 수 있습니다.

Important

이 섹션에서는 .NET 7 Blazor Server 앱을 .NET 8 Blazor 웹앱으로 변환하는 데 필요한 최소한의 변경 사항에 중점을 둡니다. 모든 새 Blazor 웹앱 규칙을 채택하려면 모든 Blazor 웹앱 규칙 채택 섹션의 지침을 따르세요.

  1. 이 문서의 처음 세 섹션에 있는 지침을 따릅니다.

  2. 구성 요소()의 App 내용을 프로젝트의 루트 폴더에 추가된 새 Routes 구성 요소 파일(Routes.razor)로App.razor 이동합니다. 프로젝트의 루트 폴더에 있는 앱의 빈 App.razor 파일을 그대로 둡니다.

  3. 약식 렌더링 모드를 앱에서 _Imports.razor 사용할 수 있도록 파일에 항목을 추가합니다.

    @using static Microsoft.AspNetCore.Components.Web.RenderMode
    
  4. 페이지(Pages/_Host.cshtml)의 _Host 콘텐츠를 빈 App.razor 파일로 이동합니다. 구성 요소를 다음과 같은 내용으로 변경합니다 App .

    참고 항목

    다음 예제에서 프로젝트의 네임스페이스는 BlazorServerApp입니다. 프로젝트와 일치하도록 네임스페이스를 조정합니다.

    파일 맨 위에서 다음 줄을 제거합니다.

    - @page "/"
    - @using Microsoft.AspNetCore.Components.Web
    - @namespace BlazorServerApp.Pages
    - @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    

    앞의 줄을 인스턴스를 삽입하는 줄로 IHostEnvironment 바꿉니다.

    @inject IHostEnvironment Env
    

    태그에서 타일(~)을 href<base> 제거하고 앱의 기본 경로로 바꿉니다.

    - <base href="~/" />
    + <base href="/" />
    

    구성 요소에 대한 구성 요소 태그 도우미를 HeadOutlet 제거하고 구성 요소로 HeadOutlet 바꿉다.

    다음 줄을 제거합니다.

    - <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
    

    앞의 줄을 다음으로 바꿉다.

    <HeadOutlet @rendermode="InteractiveServer" />
    

    구성 요소에 대한 구성 요소 태그 도우미를 App 제거하고 구성 요소로 Routes 바꿉다.

    다음 줄을 제거합니다.

    - <component type="typeof(App)" render-mode="ServerPrerendered" />
    

    앞의 줄을 다음으로 바꿉다.

    <Routes @rendermode="InteractiveServer" />
    

    참고 항목

    이전 구성에서는 앱의 구성 요소가 대화형 서버 렌더링을 채택한다고 가정합니다. SSR(정적 서버 쪽 렌더링)을 채택하는 방법을 비롯한 자세한 내용은 ASP.NET Core Blazor 렌더링 모드를 참조하세요.

    오류 UI에 대한 환경 태그 도우미를 제거하고 다음 Razor 태그로 바꿉 있습니다.

    다음 줄을 제거합니다.

    - <environment include="Staging,Production">
    -     An error has occurred. This application may no longer respond until reloaded.
    - </environment>
    - <environment include="Development">
    -     An unhandled exception has occurred. See browser dev tools for details.
    - </environment>
    

    앞의 줄을 다음으로 바꿉다.

    @if (Env.IsDevelopment())
    {
        <text>
            An unhandled exception has occurred. See browser dev tools for details.
        </text>
    }
    else
    {
        <text>
            An error has occurred. This app may no longer respond until reloaded.
        </text>
    }
    

    스크립트를 Blazor 다음으로 blazor.server.jsblazor.web.js변경합니다.

    - <script src="_framework/blazor.server.js"></script>
    + <script src="_framework/blazor.web.js"></script>
    
  5. Pages/_Host.cshtml 파일을 삭제합니다.

  6. 다음과 같이 Program.cs를 업데이트합니다.

    참고 항목

    다음 예제에서 프로젝트의 네임스페이스는 BlazorServerApp입니다. 프로젝트와 일치하도록 네임스페이스를 조정합니다.

    using 프로젝트 네임스페이스의 파일 맨 위에 문을 추가합니다.

    using BlazorServerApp;
    

    을 ( AddServerSideBlazor 을)로 AddRazorComponents 바꾸고 연결된 호출로 대체합니다 AddInteractiveServerComponents.

    다음 줄을 제거합니다.

    - builder.Services.AddServerSideBlazor();
    

    이전 줄을 구성 요소 및 대화형 서버 구성 요소 서비스로 Razor 바꿉니다. 호출은 AddRazorComponents 기본적으로 위조 방지 서비스(AddAntiforgery)를 추가합니다.

    builder.Services.AddRazorComponents()
        .AddInteractiveServerComponents();
    

    다음 줄을 제거합니다.

    - app.MapBlazorHub();
    

    위의 줄을 호출 MapRazorComponents로 바꾸고, 구성 요소를 루트 구성 요소 형식으로 제공하고 App , 연결된 호출을 추가합니다 AddInteractiveServerRenderMode.

    app.MapRazorComponents<App>()
        .AddInteractiveServerRenderMode();
    

    다음 줄을 제거합니다.

    - app.MapFallbackToPage("/_Host");
    

    호출 후 요청 처리 파이프라인에 위조 방지 미들웨어를 추가합니다app.UseRouting. 호출 app.UseRoutingapp.UseEndpoints이 있는 경우 호출은 해당 호출 app.UseAntiforgery 간에 이동해야 합니다. 호출 후 app.UseAntiforgery 호출해야 app.UseAuthentication 합니다.app.UseAuthorization 앞에서 설명한 대로 자동으로 AddRazorComponents추가되므로 위조 방지 서비스(builder.Services.AddAntiforgery())를 추가할 필요가 없습니다.

    app.UseAntiforgery();
    
  7. 미리 렌더링을 Blazor Server 사용하지 않도록 앱이 구성된 경우 업데이트된 앱에 대한 미리 렌더링을 계속 사용하지 않도록 설정할 수 있습니다. 구성 요소에서 AppRoutes 구성 요소에 대한 지시문 특성에 HeadOutlet@rendermodeRazor 할당된 값을 변경합니다.

    미리 렌더링을 @rendermode 사용하지 않도록 설정하려면 구성 요소와 Routes 구성 요소 모두에 HeadOutlet 대한 지시문 특성 값을 변경합니다.

    - @rendermode="InteractiveServer"
    + @rendermode="new InteractiveServerRenderMode(prerender: false)"
    

    자세한 내용은 ASP.NET Core Blazor 렌더링 모드를 참조하세요.

Blazor WebAssembly 앱 업데이트

이 문서의 처음 세 섹션에 있는 지침을 따릅니다.

호스트 Blazor WebAssembly 된 앱을 웹앱으로 Blazor 변환

Blazor WebAssembly 앱은 코드 변경 없이 .NET 8에서 지원됩니다. 다음 지침을 사용하여 ASP.NET Core 호스팅 Blazor WebAssembly 앱을 해당하는 .NET 8 Blazor 웹앱으로 변환하여 새로운 .NET 8 기능을 모두 사용할 수 있도록 합니다.

Important

이 섹션에서는 .NET 7 ASP.NET Core 호스팅 Blazor WebAssembly 앱을 .NET 8 Blazor 웹앱으로 변환하는 데 필요한 최소한의 변경 사항에 중점을 둡니다. 모든 새 Blazor 웹앱 규칙을 채택하려면 모든 Blazor 웹앱 규칙 채택 섹션의 지침을 따르세요.

  1. 이 문서의 처음 세 섹션에 있는 지침을 따릅니다.

    Important

    위의 지침을 사용하여 솔루션의 .Client프로젝트를 .Server.Shared 업데이트합니다.

  2. .Client 프로젝트 파일(.csproj)에서 다음 MSBuild 속성을 추가합니다.

    <NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
    <StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
    

    또한 프로젝트 파일에서 .Client 패키지 참조를 제거합니다 Microsoft.AspNetCore.Components.WebAssembly.DevServer .

    - <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer"... />
    
  3. 파일 콘텐츠를 프로젝트의 루트 .Server 에서 .Client/wwwroot/index.html 만든 새 App 구성 요소 파일(App.razor)로 이동합니다. 파일의 내용을 이동한 후 파일을 삭제합니다 index.html .

    프로젝트에서 Routes.razor이름을 .로 .Client 바꿉니다App.razor.

    에서 Routes.razor특성 값을 AppAssembly .로 업데이트합니다 typeof(Program).Assembly.

  4. .Client 프로젝트에서 파일에 항목을 _Imports.razor 추가하여 약식 렌더링 모드를 앱에서 사용할 수 있도록 합니다.

    @using static Microsoft.AspNetCore.Components.Web.RenderMode
    

    프로젝트 _Imports.razor 파일의 복사본을 .Client 만들어 프로젝트에 추가합니다.Server.

  5. App.razor 파일에 다음 변경 내용을 적용합니다.

    웹 사이트의 기본 웹 사이트 제목(<title>...</title>)을 구성 요소로 HeadOutlet 바꿉니다. 나중에 사용할 웹 사이트 제목을 확인하고 제목 태그와 제목을 제거합니다.

    - <title>...</title>
    

    제목을 제거한 경우 대화형 WebAssembly 렌더링 모드를 할당하는 구성 요소를 배치 HeadOutlet 합니다(미리 렌더링 사용 안 함).

    <HeadOutlet @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)" />
    

    CSS 스타일 번들을 변경합니다.

    - <link href="{CLIENT PROJECT ASSEMBLY NAME}.styles.css" rel="stylesheet">
    + <link href="{SERVER PROJECT ASSEMBLY NAME}.styles.css" rel="stylesheet">
    

    이전 코드의 자리 표시자:

    • {CLIENT PROJECT ASSEMBLY NAME}: 클라이언트 프로젝트 어셈블리 이름입니다. 예: BlazorSample.Client
    • {SERVER PROJECT ASSEMBLY NAME}: 서버 프로젝트 어셈블리 이름입니다. 예: BlazorSample.Server

    다음 HTML 태그를 <div>...</div> 찾습니다.

    - <div id="app">
    -     ...
    - </div>
    

    대화형 WebAssembly 렌더링 모드(미리 렌더링 사용 안 함)를 사용하여 위의 <div>...</div> HTML 태그를 구성 요소로 Routes 바꿉다.

    <Routes @rendermode="new InteractiveWebAssemblyRenderMode(prerender: false)" />
    

    스크립트를 다음으로 blazor.webassembly.js 업데이트합니다.blazor.web.js

    - <script src="_framework/blazor.webassembly.js"></script>
    + <script src="_framework/blazor.web.js"></script>
    
  6. 프로젝트의 레이아웃 파일()을 .Client 열고 웹 사이트의 기본 제목(.Client/Shared/MainLayout.razor{TITLE}자리 표시자)을 사용하여 구성 요소를 추가 PageTitle 합니다.

    <PageTitle>{TITLE}</PageTitle>
    

    참고 항목

    다른 레이아웃 파일도 기본 웹 사이트 제목이 있는 PageTitle 구성 요소를 받아야 합니다.

    자세한 내용은 ASP.NET Core Blazor 앱의 헤드 콘텐츠 제어를 참조하세요.

  7. 다음 줄에서 .Client/Program.cs제거합니다.

    - builder.RootComponents.Add<App>("#app");
    - builder.RootComponents.Add<HeadOutlet>("head::after");
    
  8. 다음과 같이 .Server/Program.cs를 업데이트합니다.

    프로젝트에 구성 요소 및 대화형 WebAssembly 구성 요소 서비스를 추가 Razor 합니다. 연결 호출을 사용하여 호출 AddRazorComponents 합니다 AddInteractiveWebAssemblyComponents. 호출은 AddRazorComponents 기본적으로 위조 방지 서비스(AddAntiforgery)를 추가합니다.

    builder.Services.AddRazorComponents()
        .AddInteractiveWebAssemblyComponents();
    

    요청 처리 파이프라인에 위조 방지 미들웨어를 추가합니다.

    다음 코드를 배치합니다.

    • 호출 후 .app.UseRouting
    • 호출 app.UseRoutingapp.UseEndpoints이 있는 경우 호출은 해당 호출 app.UseAntiforgery 간에 이동해야 합니다.
    • 호출 후 app.UseAntiforgery 호출해야 app.UseAuthorization합니다(있는 경우).
    • 앞에서 설명한 대로 자동으로 AddRazorComponents추가되므로 위조 방지 서비스(builder.Services.AddAntiforgery())를 추가할 필요가 없습니다.
    app.UseAntiforgery();
    

    다음 줄을 제거합니다.

    - app.UseBlazorFrameworkFiles();
    

    다음 줄을 제거합니다.

    - app.MapFallbackToFile("index.html");
    

    위의 줄을 호출MapRazorComponents로 바꾸고, 구성 요소를 루트 구성 요소 유형으로 제공하고App, 연결된 호출을 AddInteractiveWebAssemblyRenderMode 추가합니다.AddAdditionalAssemblies

    app.MapRazorComponents<App>()
        .AddInteractiveWebAssemblyRenderMode()
        .AddAdditionalAssemblies(typeof({CLIENT APP NAMESPACE}._Imports).Assembly);
    

    앞의 예제 {CLIENT APP NAMESPACE} 에서 자리 표시자는 프로젝트의 네임스페이스 .Client (예: HostedBlazorApp.Client)입니다.

  9. 프로젝트에서 솔루션을 실행합니다..Server

    Visual Studio의 .Server 경우 앱을 실행할 때 솔루션 탐색기 프로젝트가 선택되어 있는지 확인합니다.

    .NET CLI를 사용하는 경우 프로젝트의 폴더에서 .Server 프로젝트를 실행합니다.

서비스 및 엔드포인트 옵션 구성 업데이트

.NET 8 Blazor 에서 Web Apps가 Blazor 릴리스되면 대화형 구성 요소 서비스 및 구성 요소 엔드포인트 구성을 위한 새 API가 도입되어 서비스 및 엔드포인트 옵션 구성이 업데이트됩니다.

업데이트된 구성 지침은 다음 위치에 표시됩니다.

  • 앱 환경 설정 및 읽기: 특히 웹앱의 환경 클라이언트 쪽 읽기 섹션에 업데이트된 지침이 Blazor 포함되어 있습니다.
  • 서버 쪽 회로 처리기 옵션: 새 BlazorSignalR 회로 및 허브 옵션 구성을 다룹니다.
  • JavaScript에서 구성 요소 렌더링Razor: 동적 구성 요소 등록을 RegisterForJavaScript포함합니다.
  • Blazor 사용자 지정 요소: Blazor 웹앱 등록: 루트 구성 요소 사용자 지정 요소 등록을 RegisterCustomElement포함합니다.
  • 자산의 Blazor WebAssembly 접두사: 자산의 접두사를 나타내는 경로 문자열의 제어를 Blazor WebAssembly 다룹니다.
  • 임시 리디렉션 URL 유효 기간: 서버 쪽 렌더링에서 내보내 Blazor 는 임시 리디렉션 URL에 대한 데이터 보호 유효성의 수명 제어를 다룹니다.
  • 자세한 오류: 구성 요소 서버 쪽 렌더링에 대한 Razor 자세한 오류를 사용하도록 설정하는 것을 다룹니다.
  • 미리 렌더링 구성: 미리 렌더링은 Web Apps에 Blazor 대해 기본적으로 사용하도록 설정됩니다. 사전 렌더링을 사용하지 않도록 설정하는 앱이 필요한 특별한 상황이 있는 경우 미리 렌더링을 사용하지 않도록 설정하는 방법에 대한 지침은 이 링크를 따르세요.
  • 양식 바인딩 옵션: 양식 바인딩 옵션 구성을 다룹니다.

Yarp 라우팅을 사용한 삭제 Blazor Server 해결 방법

이전에 Yarp를 사용하여 앱을 .NET 6 또는 .NET 7로 마이그레이션하기 Blazor Server 위한 증분 마이그레이션에서 Yarp로 ASP.NET Core Blazor Server 지원 사용의 지침을 따른 경우 문서의 지침을 따를 때 수행한 해결 단계를 되돌릴 수 있습니다. Yarp에 대한 Blazor Server 라우팅 및 딥 링크는 .NET 8에서 올바르게 작동합니다.

레이아웃 구성 요소의 구성 요소 마이그레이션 CascadingValue

연계 매개 변수는 렌더링 모드 경계를 넘어 데이터를 전달하지 않으며 레이아웃은 대화형 앱에서 정적으로 렌더링됩니다. 따라서 대화형으로 렌더링된 구성 요소에서 연계 매개 변수를 사용하려는 앱은 레이아웃에서 값을 연계할 수 없습니다.

마이그레이션에 대한 두 가지 방법은 다음과 같습니다.

  • (권장) 상태를 루트 수준 연계 값으로 전달합니다. 자세한 내용은 루트 수준 연계 값을 참조 하세요.
  • 구성 요소의 라우터를 Routes 구성 요소로 CascadingValue 래핑하고 Routes 구성 요소를 대화형으로 렌더링합니다. 예를 들어 구성 요소를 참조 CascadingValue 하세요.

자세한 내용은 Cascading 값/매개 변수 및 렌더링 모드 경계를 참조 하세요.

MSBuild 속성 마이그레이션 BlazorEnableCompression

압축을 사용하지 않도록 설정하고 .NET 7 이하를 대상으로 하지만 .NET 8 SDK로 빌드된 앱의 BlazorEnableCompression 경우 Blazor WebAssembly MSBuild 속성이 다음과 같이 CompressionEnabled변경되었습니다.

<PropertyGroup>
-   <BlazorEnableCompression>false</BlazorEnableCompression>
+   <CompressionEnabled>false</CompressionEnabled>
</PropertyGroup>

.NET CLI 게시 명령을 사용하는 경우 새 속성을 사용합니다.

dotnet publish -p:CompressionEnabled=false

자세한 내용은 다음 리소스를 참조하세요.

구성 요소를 연계 인증 상태 서비스로 마이그레이션 <CascadingAuthenticationState>

.NET 7 이전 CascadingAuthenticationState 버전에서는 구성 요소가 UI 트리의 일부(예: 라우터 주위 Blazor )를 중심으로 래핑되어 연속 인증 상태를 제공합니다.

<CascadingAuthenticationState>
    <Router ...>
        ...
    </Router>
</CascadingAuthenticationState>

.NET 8에서는 구성 요소를 사용하지 마세요.CascadingAuthenticationState

- <CascadingAuthenticationState>
      <Router ...>
          ...
      </Router>
- </CascadingAuthenticationState>

대신 파일에서 Program 호출 AddCascadingAuthenticationState 하여 서비스 컬렉션에 연계 인증 상태 서비스를 추가합니다.

builder.Services.AddCascadingAuthenticationState();

자세한 내용은 다음 리소스를 참조하세요.

HTTP 캐싱 문제에 대한 새 문서

주요 버전에서 앱을 업그레이드 Blazor 할 때 발생할 수 있는 몇 가지 일반적인 HTTP 캐싱 문제와 HTTP 캐싱 문제를 해결하는 방법을 설명하는 새 문서를 추가했습니다.

자세한 내용은 ASP.NET Core Blazor 앱을 업그레이드할 때 HTTP 캐싱 문제 방지를 참조하세요.

정적 서버 쪽 렌더링을 사용하는 클래스 라이브러리에 대한 새 문서(정적 SSR)

정적 서버 쪽 렌더링(정적 SSR)을 사용하여 클래스 라이브러리(RCL)의 구성 요소 라이브러리 작성 Razor 에 대해 설명하는 새 문서를 추가했습니다.

자세한 내용은 정적 서버 쪽 렌더링(정적 SSR)이 있는 ASP.NET Core Razor 클래스 라이브러리(RCL)를 참조하세요.

추가 어셈블리에서 구성 요소 검색

앱에서 Blazor Server 웹앱으로 마이그레이션할 Blazor 때 앱이 구성 요소 클래스 라이브러리와 같은 추가 어셈블리에서 라우팅 가능한 구성 요소를 사용하는 경우 ASP.NET Core Blazor 라우팅 및 탐색 의 지침에 액세스합니다.

쿼리 문자열에서 매개 변수를 제공할 때 특성 삭제 [Parameter]

[Parameter] 쿼리 문자열에서 매개 변수를 제공할 때 특성이 더 이상 필요하지 않습니다.

- [Parameter]
  [SupplyParameterFromQuery]

Blazor Server 스크립트 대체 정책 권한 부여

.NET 7 Blazor Server 에서 스크립트(blazor.server.js)는 정적 파일 미들웨어에서 제공됩니다. .NET 7 앱에서 인증 미들웨어(UseStaticFiles)를 호출하기 전에 요청 처리 파이프라인에 정적 파일 미들웨어(UseAuthorization)에 대한 호출을 배치하면 익명 사용자에게 스크립트를 제공하기 Blazor 에 충분합니다.

.NET 8 Blazor Server 에서 스크립트는 엔드포인트 라우팅을 사용하여 자체 엔드포인트에서 제공됩니다. 이 변경 내용은 고정 버그 - UseStaticFiles 중단 Blazor Server 에 옵션 전달(dotnet/aspnetcore#45897)에 의해 도입되었습니다.

다음과 같은 다중 테넌트 시나리오를 고려합니다.

  • 기본 정책과 대체 정책은 모두 동일하게 설정됩니다.
  • 테넌트는 요청 경로의 첫 번째 세그먼트(예: tld.com/tenant-name/...)를 사용하여 확인됩니다.
  • 테넌트 엔드포인트에 대한 요청은 요청 주체에 추가 ID를 추가하는 추가 인증 체계에 의해 인증됩니다.
  • 대체 권한 부여 정책에는 추가 ID를 통해 클레임을 검사 요구 사항이 있습니다.

스크립트 파일(blazor.server.js)에 대한 Blazor 요청은 프레임워크에서 하드 코딩된 위치에서 /_framework/blazor.server.js제공됩니다. 파일에 대한 요청은 테넌트에 대한 추가 인증 체계에 의해 인증되지 않지만 대체 정책으로 인해 여전히 문제가 발생하여 권한이 없는 결과가 반환됩니다.

이 문제는 현재 2024년 Razor11월에 .NET 9 릴리스로 예정된 FallbackPolicy RequireAuthenticatedUser(dotnet/aspnetcore51836)로 인해 끊어진 지도 구성 요소의 새로운 프레임워크 기능에 대해 평가 중입니다. 그때까지 다음 세 가지 방법 중 원하는 방법을 사용하여 이 문제를 해결할 수 있습니다.

  • 대체 정책을 사용하지 마세요. 파일의 [Authorize] 특성을 _Imports.razor 적용하여 앱의 모든 구성 요소에 적용합니다. 비 blazor 엔드포인트의 경우 명시적으로 사용 [Authorize] 하거나 RequireAuthorization.

  • 파일의 /_framework/blazor.server.js 엔드포인트에 추가 [AllowAnonymous] 합니다.Program

    app.MapBlazorHub().Add(endpointBuilder =>
    {
        if (endpointBuilder is 
            RouteEndpointBuilder
            { 
                RoutePattern: { RawText: "/_framework/blazor.server.js" }
            })
        {
            endpointBuilder.Metadata.Add(new AllowAnonymousAttribute());
        }
    });
    
  • 파일을 허용하도록 검사HttpContext사용자 지정 AuthorizationHandler/_framework/blazor.server.js 등록합니다.

Docker

Docker 이미지 업데이트

Docker를 사용하는 앱의 경우 DockerfileFROM 문 및 스크립트를 업데이트합니다. ASP.NET Core 8.0 런타임을 포함하는 기본 이미지를 사용합니다. ASP.NET Core 7.0과 8.0 간의 다음 docker pull 명령 차이점을 고려합니다.

- docker pull mcr.microsoft.com/dotnet/aspnet:7.0
+ docker pull mcr.microsoft.com/dotnet/aspnet:8.0

Docker 포트 업데이트

.NET 컨테이너 이미지에 구성된 기본 ASP.NET Core 포트가 포트 80에서 8080으로 업데이트되었습니다.

ASPNETCORE_HTTP_PORTS 환경 변수가 더 간단한 대안 ASPNETCORE_URLS으로 추가되었습니다.

자세한 내용은 다음을 참조하세요.

호환성이 손상되는 변경 검토

.NET Core .NET 7.0에서 8.0으로의 주요 변경 내용은 ASP.NET CoreEntity Framework Core 섹션을 포함하는 .NET 8의 주요 변경 내용을 참조하세요.