.NET Core 3.1 の破壊的変更

.NET Core または ASP.NET Core のバージョン 3.1 に移行する場合、この記事の一覧にある破壊的変更がお使いのアプリに影響する可能性があります。

ASP.NET Core

HTTP: ブラウザー SameSite の変更による認証への影響

Chrome や Firefox などの一部のブラウザーでは、Cookie の SameSite の実装に破壊的変更が加えられました。 この変更は、OpenID Connect や WS-Federation などのリモート認証シナリオに影響します。これをオプトアウトするには、SameSite=None を送信します。 ただし、iOS 12 および一部の古いバージョンの他のブラウザーでは SameSite=None は中断します。 アプリはこれらのバージョンをスニッフィングし、SameSite を省略する必要があります。

この問題に関するディスカッションについては、dotnet/aspnetcore#14996 を参照してください。

導入されたバージョン

3.1 Preview 1

以前の動作

SameSite は、HTTP Cookie の 2016 ドラフト標準の拡張機能です。 これは、クロスサイト リクエスト フォージェリ (CSRF) を軽減することを目的としています。 もともと、これは、新しいパラメーターを追加することでサーバーでオプトインされる機能として設計されました。 ASP.NET Core 2.0 で SameSite の初期サポートが追加されました。

新しい動作

Google から、は下位互換性のない新しいドラフト標準が提案されました この標準では、既定のモードが Lax に変更され、オプトアウト対象の新しいエントリ None が追加されています。Lax はほとんどのアプリの Cookie に十分です。ただし、OpenID Connect や WS-Federation ログインなどのクロスサイト シナリオは中断されます。 ほとんどの OAuth ログインは、要求フローの違いによって影響を受けません。 新しい None パラメーターを使うと、以前のドラフト標準 (iOS 12 など) を実装したクライアントとの互換性の問題が発生します。 Chrome 80 にこの変更が含まれます。 Chrome 製品の発売タイムラインについては、「SameSite Updates」(SameSite の更新) を参照してください。

ASP.NET Core 3.1 は、新しい SameSite 動作を実装するように更新されました。 この更新により、SameSite=None が出力され、SameSite 属性を省略する新しい値 SameSiteMode.Unspecified が追加されるように SameSiteMode.None の動作が再定義されました。 すべての Cookie API の既定は Unspecified になりましたが、Cookie を使用する一部のコンポーネントでは、OpenID Connect の相関関係や nonce Cookie など、シナリオに固有の値を設定します。

この分野の最近の変更については、「HTTP:SameSite の cookie オプションの既定値が一部、None に変更されました」を参照してください。 ASP.NET Core 3.0 では、ほとんどの既定値が SameSiteMode.Lax から SameSiteMode.None に変更されました (ただし、以前の標準を使用しています)。

変更理由

既に概要を説明したように、ブラウザーと仕様が変わっています。

サードパーティ ログインなどを介してリモート サイトとやり取りするアプリは、以下を行う必要があります。

  • 複数のブラウザー上でこのようなシナリオをテストする。
  • 以前のブラウザーをサポートする」で説明されている Cookie ポリシー ブラウザー スニッフィングの軽減策を適用します。

テストとブラウザー スニッフィングの手順については、次のセクションを参照してください。

影響を受けているかどうかを判断する

新しい動作をオプトインできるクライアント バージョンを使用して、Web アプリをテストします。 Chrome、Firefox、Microsoft Edge Chromium のいずれにも、テストに使用できる新しいオプトイン機能フラグがあります。 パッチを適用した後、アプリが古いクライアント バージョンと互換性があることを確認します (特に Safari)。 詳細については、「以前のブラウザーをサポートする」を参照してください。

Chrome

Chrome 78 以降では、誤解を招くテスト結果が生成されます。 これらのバージョンには一時的な軽減策が適用されており、2 分前よりも短い Cookie が許可されます。 適切なテスト フラグを有効にすると、Chrome 76 および 77 からはより正確な結果が生成されます。 新しい動作をテストするには、chrome://flags/#same-site-by-default-cookies を有効に切り替えます。 Chrome 75 以前は、新しい None 設定を使うと失敗すると報告されています。 詳細については、「以前のブラウザーをサポートする」を参照してください。

Google は、以前のバージョンの Chrome を提供していません。 ただし、以前のバージョンの Chromium をダウンロードすることはできますが、テスト目的には十分です。 Chromium のダウンロードに関する記事の手順に従ってください。

Safari

Safari 12 では以前のドラフトが厳密に実装されており、Cookie に新しい None 値が存在すると失敗します。 これは、「以前のブラウザーをサポートする」に示されているブラウザー スニッフィング コードを使って防ぐ必要があります。 Microsoft Authentication Library (MSAL)、Active Directory 認証ライブラリ (ADAL)、または使用している任意のライブラリを使って、Safari 12 および 13 と WebKit ベースの OS スタイルのログインをテストしてください。 この問題は、基盤の OS バージョンによって変わります。 OSX Mojave 10.14 および iOS 12 には、新しい動作との互換性の問題があることがわかっています。 OSX Catalina 10.15 または iOS 13 にアップグレードすると、問題が解決します。 現在、Safari には新しい仕様の動作をテストするためのオプトイン フラグがありません。

Firefox

Firefox の新しい標準のサポートは、バージョン 68 以降で、機能フラグ network.cookie.sameSite.laxByDefault を指定して about:config ページで選択することでオプトインできます。 以前のバージョンの Firefox では、互換性の問題は報告されていません。

Microsoft Edge

Microsoft Edge では古い SameSite 標準がサポートされていますが、バージョン 44 の時点では、新しい標準との互換性の問題はありませんでした。

Microsoft Edge Chromium

機能フラグは edge://flags/#same-site-by-default-cookies です。 Microsoft Edge Chromium 78 を使ってテストした際には、互換性の問題は検出されませんでした。

Electron

Electron の複数のバージョンには、Chromium の古いバージョンが含まれています。 たとえば、Microsoft Teams で使用されている Electron のバージョンは Chromium 66 であり、以前の動作を示しています。 お使いの製品に使用されている Electron のバージョンを使って、ご自分で互換性テストを実行してください。 詳細については、「以前のブラウザーをサポートする」を参照してください。

以前のブラウザーをサポートする

2016 SameSite 標準では、不明な値を SameSite=Strict 値として扱うことが義務付けられていました。 そのため、元の標準をサポートする以前のブラウザーがある場合、値が NoneSameSite プロパティが表示されたときに、中断される可能性があります。 このような以前のブラウザーをサポートする場合、Web アプリではブラウザー スニッフィングを実装する必要があります。 User-Agent 要求ヘッダー値は非常に不安定であり、週単位で変わるため、ASP.NET Core ではブラウザー スニッフィングを実装していません。 代わりに、Cookie ポリシーの拡張ポイントを使って、User-Agent 固有のロジックを追加できます。

Startup.cs で、次のコードを追加します。

private void CheckSameSite(HttpContext httpContext, CookieOptions options)
{
    if (options.SameSite == SameSiteMode.None)
    {
        var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
        // TODO: Use your User Agent library of choice here.
        if (/* UserAgent doesn't support new behavior */)
        {
            options.SameSite = SameSiteMode.Unspecified;
        }
    }
}

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
        options.OnAppendCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
        options.OnDeleteCookie = cookieContext =>
            CheckSameSite(cookieContext.Context, cookieContext.CookieOptions);
    });
}

public void Configure(IApplicationBuilder app)
{
    // Before UseAuthentication or anything else that writes cookies.
    app.UseCookiePolicy();

    app.UseAuthentication();
    // code omitted for brevity
}
オプトアウト スイッチ

Microsoft.AspNetCore.SuppressSameSiteNone 互換性スイッチを使用すると、新しい ASP.NET Core Cookie の動作を一時的にオプトアウトできます。 プロジェクトの runtimeconfig.template.json ファイルに次の JSON を追加します。

{
  "configProperties": {
    "Microsoft.AspNetCore.SuppressSameSiteNone": "true"
  }
}
その他のバージョン

関連する SameSite パッチは以下に対して適用されます。

  • ASP.NET Core 2.1、2.2、および 3.0
  • Microsoft.Owin 4.1
  • System.Web (.NET Framework 4.7.2 以降の場合)

カテゴリ

ASP.NET

影響を受ける API


デプロイ

64 ビット Windows での x86 ホスト パス

MSBuild

デザイン時のビルドから最上位のパッケージ参照のみが返される

.NET Core SDK 3.1.400 以降では、RunResolvePackageDependencies ターゲットから最上位のパッケージ参照のみが返されます。

導入されたバージョン

.NET Core SDK 3.1.400

変更の説明

以前のバージョンの .NET Core SDK では、RunResolvePackageDependencies ターゲットにより、NuGet アセット ファイルの情報を含む次の MSBuild 項目が作成されていました。

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

このデータは、ソリューション エクスプローラーで [依存関係] ノードに設定するために、Visual Studio によって使用されます。 ただし、大量のデータになる場合があります。[依存関係] ノードが展開されていない限り、このデータは必要ありません。

.NET Core SDK バージョン 3.1.400 以降、これらの項目のほとんどは既定で生成されません。 型 Package の項目のみが返されます。 [依存関係] ノード設定するために、Visual Studio に項目が必要な場合、アセット ファイルから情報が直接読み取られます。

変更理由

この変更は、Visual Studio 内のソリューション読み込みのパフォーマンスを向上させるために導入されました。 以前はすべてのパッケージ参照が読み込まれ、ほとんどのユーザーが表示することのない多数の参照が読み込まれていました。

これらの項目が作成されることに依存する MSBuild ロジックがある場合は、プロジェクト ファイルで EmitLegacyAssetsFileItems プロパティを true に設定します。 この設定にすることで、すべての項目が作成される以前の動作が有効になります。

カテゴリ

MSBuild

影響を受ける API

N/A


SDK

ルート フォルダー内のツール マニフェスト

Windows フォーム

削除されたコントロール

.NET Core 3.1 より、一部の Windows フォーム コントロールが利用できません。

変更の説明

.NET Core 3.1 より、さまざまな Windows フォーム コントロールが利用できなくなっています。 デザインとサポートが改善された代替コントロールは .NET Framework 2.0 で導入されました。 非推奨コントロールは前にデザイナー ツールボックスから削除されましたが、引き続き利用できました。

次の型は現在なくなっています。

導入されたバージョン

3.1

削除されたコントロールにはいずれも、推奨の代替コントロールが与えられています。 次の表を参照してください。

削除されたコントロール (API) 推奨代替 削除されている関連 API
ContextMenu ContextMenuStrip
DataGrid DataGridView DataGridCell、DataGridRow、DataGridTableCollection、DataGridColumnCollection、DataGridTableStyle、DataGridColumnStyle、DataGridLineStyle、DataGridParentRowsLabel、DataGridParentRowsLabelStyle、DataGridBoolColumn、DataGridTextBox、GridColumnStylesCollection、GridTableStylesCollection、HitTestType
MainMenu MenuStrip
メニュー ToolStripDropDown、ToolStripDropDownMenu MenuItemCollection
MenuItem ToolStripMenuItem
ToolBar ToolStrip ToolBarAppearance
ToolBarButton ToolStripButton ToolBarButtonClickEventArgs、ToolBarButtonClickEventHandler、ToolBarButtonStyle、ToolBarTextAlign

カテゴリ

Windows フォーム

影響を受ける API


ヒントが表示されていると CellFormatting が発生しない

マウスでポイントしたときと、キーボードで選択したときに、DataGridView にセルのテキストとエラーのヒントが表示されるようになりました。 ヒントが表示されている場合、DataGridView.CellFormatting イベントは発生しません。

変更の説明

.NET Core 3.1 より前、ShowCellToolTips プロパティが true に設定されている DataGridView では、セルにマウスでポイントしたときにセルのテキストとエラーのヒントが表示されていました。 セルをキーボード (たとえば、Tab キー、ショートカット キー、矢印ナビゲーションなどを使用して) から選択したときはヒントが表示されませんでした。 ユーザーがセルを編集したときに DataGridView がまだ編集モードだった場合に ToolTipText プロパティが設定されていないセルをポイントすると、セルのテキストをセルに表示する書式設定をするための CellFormatting イベントが発生しました。

.NET Core 3.1 以降では、アクセシビリティの標準を満たすため、ShowCellToolTips プロパティが true に設定されている DataGridView には、セルがポイントされたときだけでなく、キーボードを使用して選択されたときにも、セルのテキストとエラーのヒントが表示されます。 この変更の結果、DataGridView が編集モードの間に ToolTipText プロパティが設定されていないセルをポイントしても、CellFormatting イベントは発生しません。 イベントが発生しないのは、ポイントされたセルの内容が、セルに表示される代わりにヒントとして表示されるためです。

導入されたバージョン

3.1

DataGridView が編集モードのときに、CellFormatting イベントに依存するすべてのコードをリファクターします。

カテゴリ

Windows フォーム

影響を受ける API

なし


関連項目