Rozbíjení změn v .NET Core 3.1
Pokud migrujete na verzi 3.1 rozhraní .NET Core nebo ASP.NET Core, mohou na vaši aplikaci mít vliv nejnovější změny uvedené v tomto článku.
ASP.NET Core
HTTP: Browser SameSite změny dopadu na ověření
Některé prohlížeče, jako je například Chrome a Firefox, provedly zásadní změny jejich implementace SameSite pro soubory cookie. Změny mají vliv na scénáře vzdáleného ověřování, například OpenID Connect a WS-Federation, které se musí odhlásit odesláním SameSite=None . Ale dojde SameSite=None k přerušení v systému iOS 12 a některých starších verzích jiných prohlížečů. Aplikace potřebuje tyto verze zachytit a vynechat SameSite .
Diskuzi o tomto problému najdete v tématu dotnet/aspnetcore # 14996.
Představená verze
3,1 Preview 1
Staré chování
SameSite je 2016 koncept standardního rozšíření pro soubory cookie HTTP. Slouží ke zmírnění omezení padělání žádostí mezi weby (CSRF). Tato možnost byla původně navržena jako funkce, které by servery mohly vyjádřit přidáním nových parametrů. ASP.NET Core 2,0 byla přidána počáteční podpora pro SameSite .
Nové chování
Společnost Google navrhla nový koncept Standard, který není zpětně kompatibilní. Standardní změní výchozí režim na Lax a přidá novou položku None k odhlášení. Lax postačí pro většinu souborů cookie aplikace, ale dojde k přerušení scénářů pro více webů, jako je OpenID Connect a WS-Federation přihlášení. Většina přihlášení OAuth není ovlivněná kvůli rozdílům ve způsobu, jakým jsou požadavky v toku. Nový None parametr způsobuje problémy s kompatibilitou s klienty, kteří implementovali předchozí koncept Standard (například iOS 12). Chrome 80 bude obsahovat změny. Podívejte se na SameSite aktualizace pro časovou osu spuštění produktu Chrome.
ASP.NET Core 3,1 byl aktualizován, aby implementoval nové SameSite chování. Aktualizace předefinuje chování SameSiteMode.None pro vygenerování SameSite=None a přidá novou hodnotu SameSiteMode.Unspecified pro vynechání SameSite atributu. Všechna rozhraní API pro cookie jsou teď ve výchozím nastavení Unspecified , i když některé komponenty, které používají soubory cookie, nastavily hodnoty lépe specifické pro jejich scénáře, jako je například korelace OpenID Connect a soubory.
Další nedávné změny v této oblasti najdete v tématu http: některé výchozí hodnoty SameSite souborů cookie se změnily na žádné. V ASP.NET Core 3,0 se většina výchozích hodnot změnila z SameSiteMode.Lax na SameSiteMode.None (ale pořád se používá předchozí Standard).
Důvod změny
Změny v prohlížeči a specifikaci, jak je uvedeno v předchozím textu.
Doporučená akce
Aplikace, které komunikují se vzdálenými lokalitami, například prostřednictvím přihlášení třetí strany, potřebují:
- Otestujte tyto scénáře ve více prohlížečích.
- Použijte zásady souborů cookie v prohlížeči zásady zmírnění rizika popsané v tématu Podpora starších prohlížečů.
Pokyny k testování a sledování v prohlížeči najdete v následující části.
Určení, jestli jste to ovlivnili
Otestujte webovou aplikaci pomocí verze klienta, která se může přihlásit k novému chování. Pro Chrome, Firefox a Microsoft Edge chrom existují nové příznaky funkcí pro výslovný souhlas, které lze použít k testování. Ověřte, jestli je vaše aplikace kompatibilní se staršími verzemi klientů, i když jste použili opravy, zejména Safari. Další informace najdete v tématu Podpora starších prohlížečů.
Chrome
Chrome 78 a novější je výsledkem zavádějících výsledků testů. Tyto verze mají dočasné omezení na místě a umožňují, aby soubory cookie byly starší než dvě minuty. S povolenými příznakem testu jsou k dispozici přesnější výsledky Chrome 76 a 77. Chcete-li otestovat nové chování, přepněte chrome://flags/#same-site-by-default-cookies na možnost povoleno. Rozhraní Chrome 75 a starší se hlásí jako neúspěšné s novým None nastavením. Další informace najdete v tématu Podpora starších prohlížečů.
Google nezpřístupňuje starší verze Chrome. Můžete si však stáhnout starší verze Chromu, které budou postačovat pro testování. Postupujte podle pokynů na webu Stažení Chromu.
Safari
Prohlížeč Safari 12 striktně implementuje předchozí koncept a v případě, že v souborech cookie uvidí novou hodnotu, se nezdařil None . K tomu je potřeba se vyhnout prostřednictvím kódu sledování prohlížeče, který je uvedený v části Podpora starších prohlížečů. Ujistěte se, že otestujete prohlížeč Safari 12 a 13, stejně jako WebKit, přihlášení pomocí knihovny Microsoft Authentication Library (MSAL), Active Directory Authentication Library (ADAL) nebo libovolnou knihovnu, kterou používáte. Problém závisí na základní verzi operačního systému. OSX Mojave 10,14 a iOS 12 se nazývají problémy s kompatibilitou s novým chováním. Při upgradu na OSX Catalina 10,15 nebo iOS 13 se problém vyřeší. Prohlížeč Safari nemá v současné době příznak výslovného souhlasu pro testování nového chování specifikace.
Firefox
Podporu aplikace Firefox pro nový standard lze otestovat na verzi 68 a novější, a to tak, že na stránce zapnete about:config příznak funkce network.cookie.sameSite.laxByDefault . Ve starších verzích prohlížeče Firefox nebyly hlášeny žádné problémy s kompatibilitou.
Microsoft Edge
Zatímco Microsoft Edge podporuje starý SameSite Standard, od verze 44, nemá žádné problémy s kompatibilitou s novým standardem.
Microsoft Edge chrom
Příznak funkce je edge://flags/#same-site-by-default-cookies . Při testování s Microsoft Edge chrom 78 nebyly pozorovány žádné problémy s kompatibilitou.
Chyt
K verzím elektronů patří starší verze Chromu. Například verze elektronicky používaného Microsoft Teams je chrom 66, který vykazuje starší chování. Proveďte vlastní testování kompatibility s verzí elektronů, kterou váš produkt používá. Další informace najdete v tématu Podpora starších prohlížečů.
Podpora starších prohlížečů
SameSiteStandardní hodnota 2016, kterou považují neznámé hodnoty za SameSite=Strict hodnoty. V důsledku toho by se všechny starší prohlížeče, které podporují původní standard, mohly přerušit, když uvidí SameSite vlastnost s hodnotou None . Pokud mají uživatelé v úmyslu podporovat tyto staré prohlížeče, musí webové aplikace implementovat monitorování v prohlížeči. ASP.NET Core neimplementuje v prohlížeči monitorování, protože User-Agent hodnoty hlaviček žádostí jsou vysoce nestabilní a každý týden se mění. Místo toho umožňuje rozšiřující bod v zásadách souborů cookie přidat User-Agent logiku specifickou pro přidání.
V části Startup. cs přidejte následující kód:
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
}
Přepínače pro výslovný souhlas
Microsoft.AspNetCore.SuppressSameSiteNonePřepínač kompatibility vám umožní dočasně se odhlásit z nového chování ASP.NET Core souborů cookie. Do runtimeconfig.template.js souboru v projektu přidejte následující JSON:
{
"configProperties": {
"Microsoft.AspNetCore.SuppressSameSiteNone": "true"
}
}
Jiné verze
Související SameSite opravy jsou pro:
- ASP.NET Core 2,1, 2,2 a 3,0
Microsoft.Owin4,1System.Web(pro .NET Framework 4.7.2 a novější)
Kategorie
ASP.NET
Ovlivněná rozhraní 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
Sestavení v době návrhu vracejí pouze odkazy balíčků nejvyšší úrovně
Počínaje .NET Core SDK 3.1.400 jsou cíle vráceny pouze odkazy na balíčky nejvyšší úrovně RunResolvePackageDependencies .
Představená verze
.NET Core SDK 3.1.400
Popis změny
V předchozích verzích .NET Core SDK RunResolvePackageDependencies cíl vytvořil následující položky nástroje MSBuild, které obsahovaly informace ze souboru prostředků NuGet:
PackageDefinitionsPackageDependenciesTargetDefinitionsFileDefinitionsFileDependencies
Tato data používá Visual Studio k naplnění uzlu závislosti v Průzkumník řešení. Může to ale být velké množství dat a data nejsou potřebná, pokud uzel závislosti není rozbalený.
Počínaje verzí .NET Core SDK 3.1.400 není většina těchto položek ve výchozím nastavení vygenerována. Vrátí se pouze položky typu Package . Pokud Visual Studio potřebuje položky k naplnění uzlu závislosti, přečte informace přímo ze souboru prostředků.
Důvod změny
Tato změna byla představena za účelem zlepšení výkonu zatížení řešení v rámci sady Visual Studio. Dříve se načetly všechny odkazy na balíčky, které se při načítání velkého množství odkazů, které by většina uživatelů nikdy nezobrazily.
Doporučená akce
Máte-li logiku nástroje MSBuild, která závisí na těchto položkách, nastavte EmitLegacyAssetsFileItems vlastnost na hodnotu true v souboru projektu. Toto nastavení umožňuje předchozí chování, kde jsou vytvořeny všechny položky.
Kategorie
MSBuild
Ovlivněná rozhraní API
–
Windows Forms
Odebrané ovládací prvky
Počínaje rozhraním .NET Core 3,1 Některé ovládací prvky model Windows Forms již nejsou k dispozici.
Popis změny
Počínaje rozhraním .NET Core 3,1 nejsou k dispozici různé ovládací prvky model Windows Forms. Náhradní ovládací prvky, které mají lepší návrh a podporu, byly zavedeny v .NET Framework 2,0. Zastaralé ovládací prvky byly předtím odebrány z nástrojů návrháře, ale byly stále k dispozici pro použití.
Následující typy již nejsou k dispozici:
- ContextMenu
- DataGrid
- DataGrid.HitTestType
- DataGridBoolColumn
- DataGridCell
- DataGridColumnStyle
- DataGridLineStyle
- DataGridParentRowsLabelStyle
- DataGridPreferredColumnWidthTypeConverter
- DataGridTableStyle
- DataGridTextBox
- DataGridTextBoxColumn
- GridColumnStylesCollection
- GridTablesFactory
- GridTableStylesCollection
- IDataGridEditingService
- IMenuEditorService
- MainMenu
- Menu
- Menu.MenuItemCollection
- MenuItem
- ToolBar
- ToolBarAppearance
- ToolBarButton
- ToolBar.ToolBarButtonCollection
- ToolBarButtonClickEventArgs
- ToolBarButtonStyle
- ToolBarTextAlign
Představená verze
3.1
Doporučená akce
Každý odebraný ovládací prvek má doporučený ovládací prvek pro nahrazení. Podívejte se na následující tabulku:
| Odebraný ovládací prvek (API) | Doporučená náhrada | Přidružená rozhraní API k odebrání |
|---|---|---|
| ContextMenu | ContextMenuStrip | |
| DataGrid | DataGridView | DataGridCell, hodnota DataGridRow, DataGridTableCollection, DataGridColumnCollection, styl DataGridTableStyle, styl DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, funkce DataGridBoolColumn, DataGridTextBox, kolekce GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
| MainMenu | MenuStrip | |
| Nabídka | Ovládací prvek ToolStripDropDown, ToolStripDropDownMenu | MenuItemcollection |
| MenuItem | ToolStripMenuItem | |
| ToolBar | ToolStrip | ToolBarAppearance |
| ToolBarButton | Prvek ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Kategorie
Windows Forms
Ovlivněná rozhraní 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
Pokud je zobrazený popis, událost CellFormatting se neaktivuje.
V DataGridView této části se při stisknutí myši a při výběru přes klávesnici zobrazuje text buňky a popisky chyb. Pokud je zobrazen popis tlačítka, DataGridView.CellFormatting událost není vyvolána.
Popis změny
Před rozhraním .NET Core 3,1, u DataGridView kterého byla ShowCellToolTips vlastnost nastavena na hodnotu true zobrazenou pomocí tlačítka pro text buňky a chyby, když byla buňka najeďte myší. Při výběru buňky prostřednictvím klávesnice (například pomocí klávesy TAB, klávesových zkratek nebo navigace pomocí šipky) nebyly zobrazeny popisy tlačítek. Pokud uživatel buňku upravil a potom DataGridView v režimu úprav byl najeďte na buňku, která sadu vlastností nevytvořila, ToolTipText CellFormatting byla vyvolána událost, která naformátuje text buňky pro zobrazení v buňce.
Aby splňoval standard pro usnadnění přístupu, počínaje rozhraním .NET Core 3,1, DataGridView které má ShowCellToolTips vlastnost nastavenou na, se true zobrazí popisy tlačítek pro text buňky a chyby, které nejsou jenom v případě, že je buňka najetí myší, ale také když se vybere přes klávesnici. V důsledku této změny se CellFormatting událost neaktivuje, pokud not jsou buňky, které nemají ToolTipText sadu vlastností, nepřesunuty, když DataGridView je v režimu úprav. Událost není vyvolána, protože obsah buňky najetí myší se zobrazí jako popisek namísto zobrazení v buňce.
Představená verze
3.1
Doporučená akce
Refaktorujte jakýkoli kód, který závisí na CellFormatting události, zatímco DataGridView je v režimu úprav.
Kategorie
Windows Forms
Ovlivněná rozhraní API
Žádné