この記事では、.NET 10 の ASP.NET Coreを .NET 11 で ASP.NET Coreに更新する方法について説明します。
[前提条件]
ASP.NET および Web 開発ワークロードを含む Visual Studio。
global.json で .NET SDK のバージョンを更新する
特定の .NET SDK バージョンを対象とする global.json ファイルに依存している場合は、 version プロパティをインストールされている .NET 11 SDK バージョンに更新します。 例えば次が挙げられます。
{
"sdk": {
- "version": "10.0.102"
+ "version": "11.0.100"
}
}
ターゲット フレームワークを更新する
プロジェクト ファイルのターゲット フレームワーク モニカー (TFM) を net11.0 に更新します。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
- <TargetFramework>net10.0</TargetFramework>
+ <TargetFramework>net11.0</TargetFramework>
</PropertyGroup>
</Project>
パッケージ参照の更新
プロジェクト ファイルで、各 Microsoft.AspNetCore.*、 Microsoft.EntityFrameworkCore.*、 Microsoft.Extensions.*、 System.Net.Http.Json パッケージ参照の Version 属性を 11.0.0 以降に更新します。 例えば次が挙げられます。
<ItemGroup>
- <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="10.0.0" />
- <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.0" />
- <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0" />
- <PackageReference Include="System.Net.Http.Json" Version="10.0.0" />
+ <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="11.0.0" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="11.0.0" />
+ <PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="11.0.0" />
+ <PackageReference Include="System.Net.Http.Json" Version="11.0.0" />
</ItemGroup>
Blazor
Blazor のリリース ノート
新機能の対象範囲については、「 .NET 11 の ASP.NET Core の新機能」を参照してください。
JS コンポーネントから削除されたインライン NavMenu イベント ハンドラーを採用する
このセクションは Blazor Web App にのみ適用されます。
ナビゲーション バー トグルャーのインライン JS イベント ハンドラーは、.NET 11 以降のNavMenu プロジェクト テンプレートのBlazor Web App コンポーネントには存在しません。 プロジェクト テンプレートから生成されたアプリは、 併置された JS モジュール アプローチを使用して、レンダリングされたページのナビゲーション リンクを表示または非表示にします。 このアプローチでは、インライン の安全でないハッシュを CSP に含める必要がないため、JSが向上します。
既存のアプリのナビゲーション リンク トグルツールに新しい JS モジュール アプローチを採用するには、次の手順に従います。
NavMenu.razor.js:
// Handle navigation menu toggle
const navScrollable = document.getElementById("nav-scrollable");
const navToggler = document.querySelector(".navbar-toggler");
if (navScrollable && navToggler) {
navScrollable.addEventListener("click", function() {
navToggler.click();
});
}
アプリのNavMenu コンポーネント (NavMenu.razor) の上部に、併置された<script> モジュールのJS タグを追加します。
- アプリがグローバル対話機能を持つクライアント側レンダリング (
.Clientプロジェクトを持つ) を採用する場合 (レンダリング モードはアプリのAppコンポーネントによってアプリに対してグローバルに設定されます)、次のタグを使用します。これは、Layoutフォルダー内のモジュールへのパスを示します。
<script type="module" src="@Assets["Layout/NavMenu.razor.js"]"></script>
- それ以外の場合は、
Components/Layoutフォルダー内のモジュールへのパスを示す次のタグを使用します。
<script type="module" src="@Assets["Components/Layout/NavMenu.razor.js"]"></script>
また、アプリの NavMenu コンポーネントで、インライン JS を含む行を変更して、ナビゲーション リンクを切り替えます。
- <div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
+ <div id="nav-scrollable" class="nav-scrollable">
アプリに、前の手順で削除されたインライン の安全でないハッシュを含むJS がある場合は、アンセーフ ハッシュを削除します。
- 'unsafe-hashes' 'sha256-qnHnQs7NjQNHHNYv/I9cW+I62HzDJjbnyS/OFzqlix0='
QuickGrid URL ベースの改ページと並べ替えを採用
QuickGrid コンポーネントは、URL クエリ文字列 (たとえば、 ?page=2&sort=Name&order=asc) に改ページ位置と並べ替えの状態を保持します。これにより、リンク共有、ブラウザーの前後のナビゲーション、静的サーバー側レンダリング (静的 SSR) での操作が可能になります。 この動作は既定で有効になっています。
JavaScript ランタイムなしで動作するために、並べ替え可能な列ヘッダーと改ページ調整コントロールが、<a>要素ではなく<button> (リンク) 要素としてレンダリングされるようになりました。 前のマークアップを対象とするカスタム CSS を更新します。
- button.col-title { ... }
+ button.col-title, a.col-title { ... }
- nav button:disabled { ... }
+ nav button:disabled, nav a[aria-disabled="true"] { ... }
無効な改ページ調整リンクでは、HTML aria-disabled="true"属性ではなくdisabledが使用されます。これは、<a>要素では無効です。 組み込みの QuickGrid CSS では、両方のマークアップ スタイルが既にカバーされています。
同じページに複数の QuickGrid が表示される場合は、各グリッドに一意の QueryParameterNamePrefix を設定し、それぞれに固有の PaginationState も指定して、グリッド同士で page、sort、order のクエリ パラメーターが共有されないようにします。
- <QuickGrid Items="@cities" Pagination="@pagination2">...</QuickGrid>
+ <QuickGrid Items="@cities" Pagination="@pagination2" QueryParameterNamePrefix="cities">...</QuickGrid>
対話型レンダリング モードを必要とする前の <button> ベースのマークアップに戻すには、次の AppContext スイッチを false に設定します。
AppContext.SetSwitch(
"Microsoft.AspNetCore.Components.QuickGrid.EnableUrlBasedQuickGridNavigationAndSorting",
false);
スイッチは、レンダリングされた HTML 要素のみを制御します。並べ替えとページの状態は、設定に関係なく、URL クエリ文字列から読み取られ、URL クエリ文字列に書き込まれます。
セキュリティ
自動 CSRF 保護
.NET 11 では、クロスサイト リクエスト フォージェリ (CSRF) の自動保護が追加されます。 アプリが WebApplication.CreateBuilder を使用してビルドされ、エンドポイントがある場合、ミドルウェアは既定で配線され、 Sec-Fetch-Site と Origin ヘッダーが検査され、要求に対する検証の判定が記録されます。
ミドルウェアは、偽造防止検証をオプトインするエンドポイント(つまり、IAntiforgeryMetadataがRequiresValidationされているtrueを実装するメタデータを持つエンドポイント)を検証します。 フレームワークは、次の目的でこれを自動的に設定します。
- すべての Blazor サーバー側レンダリング (SSR) エンドポイント。 それぞれは既定で保護されています。ページは、
@attribute [RequireAntiforgeryToken(false)]を使用してオプトアウトできます。 - フォーム データをバインドする最小限の API エンドポイント。
-
[ValidateAntiForgeryToken]や[AutoValidateAntiforgeryToken]で注釈が付けられたものなど、偽造防止検証を使用する MVC アクション。
プレーンな MapPost や Web API [HttpPost] アクションなど、JSON をバインドするエンドポイントには動作の変更はありません。
今後、自動 CSRF 保護が推奨される防御であり、ほとんどのアプリではトークンベースの偽造防止システムは不要です。 アプリが Sec-Fetch-Siteを送信しないブラウザー、 IAntiforgeryAdditionalDataProviderを使用するブラウザー、またはコンプライアンス要件の独立したレイヤーとしてトークン防御を保持する必要がある場合は、トークンベースのシステムを維持します。 両方の保護を共存させることができます。
偽造防止を明示的に構成するアプリを簡略化するには、 AddAntiforgery 呼び出しと UseAntiforgery 呼び出しを削除し、自動保護に依存します。 ほとんどのアプリでは、これは 1 行の変更であり、他のコードの更新はありません。
Blazor 静的 SSR では、app.UseAntiforgery() を削除すると、レンダリングされるフォームのアンチフォージェリ トークンの生成も停止されます。詳細については、Blazorサーバー側レンダリングではアンチフォージェリ検証をミドルウェアに委ねるを参照してください。
クロスオリジン フォーム投稿の 400 - Bad Request は、意図したとおりに動作する CSRF 保護です。 要求が正当な配信元からのものである場合は、チェックを抑制するのではなく、その配信元を許可します。
- エンドポイントの解決済みポリシーに呼び出し元の配信元が含まれるように CORS を構成します。 CSRF ミドルウェアは、そのポリシーを受け入れ、要求を許可します。
-
.DisableAntiforgery()(最小限の API) または[IgnoreAntiforgeryToken](MVC) を使用してエンドポイントをオプトアウトするのは、ブラウザーから到達できないエンドポイントや、cookie以外のメカニズム (ベアラー認証など) で認証されるエンドポイントなど、CSRF に対して脆弱でない場合のみです。
ミドルウェア、検証規則、トークン ベースの偽造防止システムとの対話方法の詳細については、ASP.NET Coreの CSRF の自動保護に関するページを参照してください。
重大な変更
.NET の破壊的変更に関する記事を使用して、アプリを新しいバージョンの .NET にアップグレードするときに適用される可能性のある破壊的変更を見つけます。
ASP.NET Core