Zásadní změny v .NET Core 3.1

Pokud migrujete na verzi 3.1 .NET Core nebo ASP.NET Core, můžou zásadní změny uvedené v tomto článku ovlivnit vaši aplikaci.

ASP.NET Core

HTTP: Změny samesite prohlížeče mají vliv na ověřování

Některé prohlížeče, jako je Chrome a Firefox, provedly zásadní změny ve svých implementacích SameSite souborů cookie. Změny mají vliv na scénáře vzdáleného ověřování, jako je OpenID Připojení a WS-Federation, které se musí odhlásit odesláním SameSite=None. SameSite=None V iOSu 12 a některých starších verzích jiných prohlížečů se ale přeruší. Aplikace musí tyto verze zašifrovat a vynechat SameSite.

Diskuzi o tomto problému najdete v tématu dotnet/aspnetcore#14996.

Zavedená verze

3.1 Preview 1

Staré chování

SameSite je standardní rozšíření konceptu 2016 pro soubory cookie HTTP. Cílem je zmírnit padělání žádostí mezi weby (CSRF). Původně byla navržena jako funkce, do které by se servery přihlásily přidáním nových parametrů. ASP.NET Core 2.0 přidala počáteční podporu pro SameSite.

Nové chování

Google navrhl nový koncept, který není zpětně kompatibilní. Standardní režim změní na výchozí režim Lax a přidá novou položku None pro odhlášení. Lax Stačí pro většinu souborů cookie aplikace, ale přeruší scénáře mezi weby, jako je OpenID Připojení a přihlášení WS-Federation. Většina přihlášení OAuth není ovlivněná kvůli rozdílům ve způsobu toku požadavků. Nový None parametr způsobuje problémy s kompatibilitou s klienty, kteří implementovali předchozí standard konceptu (například iOS 12). Chrome 80 bude obsahovat změny. Podívejte se na Aktualizace SameSite 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 generování SameSite=None a přidá novou hodnotu SameSiteMode.Unspecified , která vynechá SameSite atribut. Všechna rozhraní API souborů cookie se teď ve výchozím nastavení používajíUnspecified, i když některé komponenty, které používají soubory cookie, nastavují hodnoty konkrétnější pro jejich scénáře, jako je openID Připojení korelace a jiné soubory cookie.

Další nedávné změny v této oblasti najdete v tématu HTTP: Některé soubory cookie SameSite se ve výchozím nastavení změnily na Žádné. Ve verzi ASP.NET Core 3.0 se většina výchozích hodnot změnila na SameSiteMode.LaxSameSiteMode.None (ale stále používá předchozí standard).

Důvod změny

Prohlížeč a specifikace se mění, jak je uvedeno v předchozím textu.

Aplikace, které komunikují se vzdálenými weby, například prostřednictvím přihlášení třetích stran, musí:

  • Tyto scénáře otestujte v několika prohlížečích.
  • Použijte zmírnění rizik v prohlížeči zásad souborů cookie probírané ve starších prohlížečích podpory.

Pokyny k testování a šifrování prohlížeče najdete v následující části.

Určení, jestli se vás to týká

Otestujte webovou aplikaci pomocí klientské verze, která se může rozhodnout pro nové chování. Chrome, Firefox a Microsoft Edge Chromium mají nové příznaky funkce opt-in, které je možné použít k testování. Po použití oprav ověřte, že je vaše aplikace kompatibilní se staršími verzemi klientů, zejména Safari. Další informace najdete v tématu Podpora starších prohlížečů.

Chrome

Chrome 78 a novější přinášejí zavádějící výsledky testu. Tyto verze mají dočasné omezení rizik a umožňují soubory cookie starší než dvě minuty. S povolenými příslušnými testovacími příznaky dají Chrome 76 a 77 přesnější výsledky. Pokud chcete otestovat nové chování, přepněte chrome://flags/#same-site-by-default-cookies na povolenou možnost. Chrome 75 a starší se oznamují selhání s novým None nastavením. Další informace najdete v tématu Podpora starších prohlížečů.

Google nezpřístupní starší verze Chromu. Můžete si ale stáhnout starší verze Chromium, které budou stačit pro testování. Postupujte podle pokynů ke stažení Chromium.

Safari

Safari 12 striktně implementoval předchozí koncept a selže, pokud se v souborech cookie zobrazí nová None hodnota. To se musí vyhnout prostřednictvím kódu pro šifrování prohlížeče zobrazeného ve starších prohlížečích podpory. Ujistěte se, že testujete Safari 12 a 13 a také přihlášení založená na webové sadě OS pomocí knihovny Microsoft Authentication Library (MSAL), knihovny ADAL (Active Directory Authentication Library) nebo knihovny, kterou používáte. Problém závisí na základní verzi operačního systému. OSX Mojave 10.14 a iOS 12 jsou známé, že mají problémy s kompatibilitou s novým chováním. Problém řeší upgrade na OSX Catalina 10.15 nebo iOS 13. Safari momentálně nemá příznak výslovného souhlasu pro testování nového chování specifikace.

Firefox

Podporu firefoxu pro nový standard lze testovat na verzi 68 a novější tím, že se přihlásíte na about:config stránce s příznakem network.cookie.sameSite.laxByDefaultfunkce . Ve starších verzích Firefoxu nebyly hlášeny žádné problémy s kompatibilitou.

Microsoft Edge

Microsoft Edge sice podporuje starý SameSite standard, ale verze 44 nemá žádné problémy s kompatibilitou s novým standardem.

Microsoft Edge Chromium

Příznak funkce je edge://flags/#same-site-by-default-cookies. Při testování s Microsoft Edge Chromium 78 nebyly pozorovány žádné problémy s kompatibilitou.

Electron

Verze Elektronu zahrnují starší verze Chromium. Například verze elektronu, kterou Microsoft Teams používá, je Chromium 66, což vykazuje starší chování. Proveďte vlastní testování kompatibility s verzí elektronu, kterou váš produkt používá. Další informace najdete v tématu Podpora starších prohlížečů.

Podpora starších prohlížečů

Standard 2016 SameSite nařídil, aby neznámé hodnoty byly považovány za SameSite=Strict hodnoty. V důsledku toho mohou všechny starší prohlížeče, které podporují původní standard, přerušit, když uvidí SameSite vlastnost s hodnotou None. Webové aplikace musí implementovat šifrování prohlížeče, pokud mají v úmyslu podporovat tyto staré prohlížeče. ASP.NET Core pro vás neimplementuje šifrování prohlížeče, protože User-Agent hodnoty hlaviček požadavků jsou vysoce nestabilní a mění se každý týden. Místo toho bod rozšíření v zásadách souborů cookie umožňuje přidat User-Agent-specifickou logiku.

Do 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 odhlášení

Přepínač Microsoft.AspNetCore.SuppressSameSiteNone kompatibility umožňuje dočasně odhlásit nové chování souborů cookie ASP.NET Core. Do souboru runtimeconfig.template.json v projektu přidejte následující KÓD JSON:

{
  "configProperties": {
    "Microsoft.AspNetCore.SuppressSameSiteNone": "true"
  }
}
Jiné verze

Související SameSite opravy jsou připravované pro:

  • ASP.NET Core 2.1, 2.2 a 3.0
  • Microsoft.Owin 4.1
  • System.Web (pro rozhraní .NET Framework 4.7.2 a novější)

Kategorie

ASP.NET

Ovlivněná rozhraní API


Nasazení

Cesta hostitele x86 v 64bitovém systému Windows

MSBuild

Sestavení v době návrhu vrací pouze odkazy na balíčky nejvyšší úrovně.

Počínaje sadou .NET Core SDK 3.1.400 se cíl vrátí pouze odkazy RunResolvePackageDependencies na balíčky nejvyšší úrovně.

Zavedená verze

.NET Core SDK 3.1.400

Změna popisu

V předchozích verzích sady .NET Core SDK RunResolvePackageDependencies cíl vytvořil následující položky nástroje MSBuild, které obsahovaly informace ze souboru prostředků NuGet:

  • PackageDefinitions
  • PackageDependencies
  • TargetDefinitions
  • FileDefinitions
  • FileDependencies

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řeba, pokud není rozbalený uzel Závislosti.

Počínaje sadou .NET Core SDK verze 3.1.400 se většina těchto položek ve výchozím nastavení nevygeneruje. 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 zavedena za účelem zlepšení výkonu načítání řešení v sadě Visual Studio. Dříve byly načteny všechny odkazy na balíčky, které zahrnovaly načítání mnoha odkazů, které by většina uživatelů nikdy nezobrazovala.

Pokud máte logiku NÁSTROJE MSBuild, která závisí na vytváření těchto položek, nastavte EmitLegacyAssetsFileItems vlastnost do true souboru projektu. Toto nastavení umožňuje předchozí chování, ve kterém jsou vytvořeny všechny položky.

Kategorie

MSBuild

Ovlivněná rozhraní API


Sada SDK

Manifesty nástrojů v kořenové složce

Windows Forms

Odebrané ovládací prvky

Počínaje verzí .NET Core 3.1 už některé ovládací prvky model Windows Forms nejsou k dispozici.

Změna popisu

Od verze .NET Core 3.1 už nejsou k dispozici různé ovládací prvky model Windows Forms. V rozhraní .NET Framework 2.0 byly zavedeny náhradní ovládací prvky, které mají lepší návrh a podporu. Zastaralé ovládací prvky byly dříve odebrány z nástrojů návrháře, ale byly stále k dispozici k použití.

Následující typy už nejsou k dispozici:

Zavedená verze

3.1

Každý odebraný ovládací prvek má doporučený náhradní ovládací prvek. Informace najdete v následující tabulce:

Odebrání ovládacího prvku (API) Doporučená náhrada Přidružená rozhraní API, která se odeberou
ContextMenu ContextMenuStrip
DataGrid Datagridview DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType
Mainmenu MenuStrip
Nabídka ToolStripDropDown, ToolStripDropDownMenu MenuItemCollection
MenuItem Toolstripmenuitem
ToolBar ToolStrip ToolBarAppearance
Toolbarbutton Toolstripbutton ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign

Kategorie

Windows Forms

Ovlivněná rozhraní API


Událost CellFormatting se nevyvolá, pokud je zobrazen popis

Při DataGridView najetí myší myší a po výběru pomocí klávesnice se teď zobrazí popisy textu a chyby buňky. Pokud se zobrazí popis, DataGridView.CellFormatting událost se nevyvolá.

Změna popisu

Před .NET Core 3.1, DataGridView který měl nastavenou ShowCellToolTips vlastnost true zobrazovat popis textu buňky a chyby při najetí myší na buňku. Popisy nebyly zobrazeny, když byla buňka vybrána pomocí klávesnice (například pomocí klávesy Tab, klávesových zkratek nebo navigace se šipkami). Pokud uživatel upravil buňku a potom, i když DataGridView byl stále v režimu úprav, najedl myší na buňku, která nemá nastavenou ToolTipText vlastnost, CellFormatting byla vyvolána událost, která naformátuje text buňky pro zobrazení v buňce.

Pro splnění standardů přístupnosti počínaje rozhraním .NET Core 3.1, která má vlastnost nastavenou ShowCellToolTips tak, DataGridView aby true zobrazovala popisy textu buňky a chyby nejen v případě, že je buňka najetá myší, ale také když je vybraná přes klávesnici. V důsledku této změny není událost vyvolána, pokud buňky, CellFormatting které nemají nastavenou ToolTipText vlastnost, jsou najet myší, když DataGridView je v režimu úprav. Událost není vyvolána, protože obsah najeté buňky se místo zobrazení v buňce zobrazí jako popis.

Zavedená verze

3.1

Refaktoring libovolného CellFormatting kódu, který závisí na události, když DataGridView je v režimu úprav.

Kategorie

Windows Forms

Ovlivněná rozhraní API

Nic


Viz také