.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 プレビュー 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 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 の複数のバージョンには、Chromium の古いバージョンが含まれています。 たとえば、Microsoft Teams で使用されている Electron のバージョンは Chromium 66 であり、以前の動作を示しています。 お使いの製品に使用されている Electron のバージョンを使って、ご自分で互換性テストを実行してください。 詳細については、「以前のブラウザーをサポートする」を参照してください。
以前のブラウザーをサポートする
2016 SameSite 標準では、不明な値を SameSite=Strict 値として扱うことが義務付けられていました。 そのため、元の標準をサポートする以前のブラウザーがある場合、値が None の SameSite プロパティが表示されたときに、中断される可能性があります。 このような以前のブラウザーをサポートする場合、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.Owin4.1-
System.Web(.NET Framework 4.7.2 以降の場合)
カテゴリ
ASP.NET
影響を受ける API
- Microsoft.AspNetCore.Builder.CookiePolicyOptions.MinimumSameSitePolicy
- Microsoft.AspNetCore.Http.CookieBuilder.SameSite
- Microsoft.AspNetCore.Http.CookieOptions.SameSite
- Microsoft.AspNetCore.Http.SameSiteMode
- Microsoft.Net.Http.Headers.SameSiteMode
- Microsoft.Net.Http.Headers.SetCookieHeaderValue.SameSite
デプロイメント
MSBuild
デザイン時ビルドでは、最上位レベルのパッケージ参照のみが返されます
.NET Core SDK 3.1.400 以降では、最上位レベルのパッケージ参照のみが RunResolvePackageDependencies ターゲットによって返されます。
導入されたバージョン
.NET Core SDK 3.1.400
変更の説明
以前のバージョンの .NET Core SDK では、 RunResolvePackageDependencies ターゲットによって、NuGet アセット ファイルの情報を含む次の MSBuild 項目が作成されました。
PackageDefinitionsPackageDependenciesTargetDefinitionsFileDefinitionsFileDependencies
このデータは、ソリューション エクスプローラーの [依存関係] ノードを設定するために Visual Studio によって使用されます。 ただし、大量のデータになる可能性があり、依存関係ノードが展開されない限り、データは必要ありません。
.NET Core SDK バージョン 3.1.400 以降では、これらの項目のほとんどは既定では生成されません。 Package型の項目のみが返されます。 依存関係ノードに項目を設定する必要がある場合、Visual Studio は資産ファイルから直接情報を読み取ります。
変更の理由
これは、Visual Studio 内のソリューション読み込みパフォーマンスを向上させるために導入されました。 以前は、すべてのパッケージ参照が読み込まれており、それには、ほとんどのユーザーが決して表示しない多くの参照の読み込みも含まれていました。
推奨されるアクション
作成されるこれらの項目に依存する MSBuild ロジックがある場合は、 EmitLegacyAssetsFileItems プロパティをプロジェクト ファイル内の true に設定します。 この設定により、すべての項目が作成される前の動作が有効になります。
カテゴリ
MSBuild
影響を受ける API
なし
SDK
Windows フォーム
削除されたコントロール
.NET Core 3.1 以降では、一部の Windows フォーム コントロールは使用できなくなりました。
変更の説明
.NET Core 3.1 以降では、さまざまな Windows フォーム コントロールは使用できなくなりました。 .NET Framework 2.0 では、より優れた設計とサポートを備える代替コントロールが導入されました。 非推奨のコントロールは、以前はデザイナー ツールボックスから削除されていましたが、引き続き使用できます。
次の種類は使用できなくなりました。
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGrid.HitTestInfo
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridColumnStyle.DataGridColumnHeaderAccessibleObject
- DataGridColumnStyle.CompModSwitches
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
導入されたバージョン
3.1
推奨されるアクション
削除された各コントロールには、推奨される置換コントロールがあります。 次の表を参照してください。
| 削除されたコントロール (API) | 推奨される置換 | 削除される関連 API |
|---|---|---|
| コンテキストメニュー | ContextMenuStrip | |
| DataGrid | DataGridView(データグリッドビュー) | DataGridCell、DataGridRow、DataGridTableCollection、DataGridColumnCollection、DataGridTableStyle、DataGridColumnStyle、DataGridLineStyle、DataGridParentRowsLabel、DataGridParentRowsLabelStyle、DataGridBoolColumn、DataGridTextBox、GridColumnStylesCollection、GridTableStylesCollection、HitTestType |
| メインメニュー | MenuStrip | |
| メニュー | ToolStripDropDown、ToolStripDropDownMenu | メニューアイテムコレクション |
| メニュー項目 | ToolStripMenuItem | |
| ToolBar | ツールストリップ | ツールバーの外観 |
| ツールバーボタン | ToolStripButton | ToolBarButtonClickEventArgs、ToolBarButtonClickEventHandler、ToolBarButtonStyle、ToolBarTextAlign |
カテゴリ
Windows フォーム
影響を受ける API
- System.Windows.Forms.ContextMenu
- System.Windows.Forms.GridColumnStylesCollection
- System.Windows.Forms.GridTablesFactory
- System.Windows.Forms.GridTableStylesCollection
- System.Windows.Forms.IDataGridEditingService
- System.Windows.Forms.MainMenu
- System.Windows.Forms.Menu
- System.Windows.Forms.Menu.MenuItemCollection
- System.Windows.Forms.MenuItem
- System.Windows.Forms.ToolBar
- System.Windows.Forms.ToolBar.ToolBarButtonCollection
- System.Windows.Forms.ToolBarAppearance
- System.Windows.Forms.ToolBarButton
- System.Windows.Forms.ToolBarButtonClickEventArgs
- System.Windows.Forms.ToolBarButtonStyle
- System.Windows.Forms.ToolBarTextAlign
- System.Windows.Forms.DataGrid
- System.Windows.Forms.DataGrid.HitTestType
- System.Windows.Forms.DataGridBoolColumn
- System.Windows.Forms.DataGridCell
- System.Windows.Forms.DataGridColumnStyle
- System.Windows.Forms.DataGridLineStyle
- System.Windows.Forms.DataGridParentRowsLabelStyle
- System.Windows.Forms.DataGridPreferredColumnWidthTypeConverter
- System.Windows.Forms.DataGridTableStyle
- System.Windows.Forms.DataGridTextBox
- System.Windows.Forms.DataGridTextBoxColumn
- System.Windows.Forms.Design.IMenuEditorService
ツールチップが表示されている場合、CellFormatting イベントが発生しない
マウスでポイントしたときと、キーボードで選択したときに、DataGridView にセルのテキストとエラーのヒントが表示されるようになりました。 ツールヒントが表示されている場合、 DataGridView.CellFormatting イベントは発生しません。
変更の説明
.NET Core 3.1 より前のバージョンでは、DataGridView プロパティが ShowCellToolTips に設定されたtrueは、セルのテキストとエラーに関して、マウスでセルをホバーしたときにツールチップが表示されていました。 キーボードを使用してセルを選択したときにヒントが表示されませんでした (たとえば、Tab キー、ショートカット キー、矢印ナビゲーションを使用)。 ユーザーがセルを編集し、 DataGridView がまだ編集モードの間に、 ToolTipText プロパティが設定されていないセルの上にマウス ポインターを置いた場合、セルに表示するセルのテキストを書式設定するために CellFormatting イベントが発生しました。
アクセシビリティ標準を満たすために、.NET Core 3.1 以降では、DataGridView プロパティが ShowCellToolTips に設定されたtrueには、セルのテキストのヒントと、セルがホバーされたときだけでなく、キーボードで選択されたときのエラーも表示されます。 この変更の結果、CellFormatting が編集モードのときに、 プロパティが設定されていないセルにマウスポインターを合わせても、ToolTipText イベントは発生DataGridView。 ホバーされたセルの内容がセルではなくツールチップとして表示されるため、イベントはトリガーされません。
導入されたバージョン
3.1
推奨されるアクション
CellFormattingが編集モードの間、DataGridView イベントに依存するすべてのコードをリファクタリングします。
カテゴリ
Windows フォーム
影響を受ける API
無し
こちらも参照ください
.NET