Kompatibilitástörő változások a .NET Core 3.1-ben
Ha a .NET Core vagy ASP.NET Core 3.1-es verziójára migrál, a cikkben felsorolt kompatibilitástörő változások hatással lehetnek az alkalmazásra.
ASP.NET Core
HTTP: A Browser SameSite módosításai hatással vannak a hitelesítésre
Egyes böngészők, például a Chrome és a Firefox, kompatibilitástörő módosításokat hajtottak végre a cookie-k implementációiban SameSite
. A módosítások hatással vannak a távoli hitelesítési forgatókönyvekre, például az OpenID Csatlakozás és a WS-Federationre, amelyeknek le kell tiltaniük a küldéstSameSite=None
. Az SameSite=None
iOS 12 és más böngészők néhány régebbi verziója azonban megszakad. Az alkalmazásnak ki kell szippantania ezeket a verziókat, és el kell hagynia SameSite
.
A probléma megvitatásához lásd: dotnet/aspnetcore#14996.
Bevezetett verzió
3.1 Előzetes verzió 1
Régi viselkedés
SameSite
2016-os szabványkiterjesztés a HTTP-cookie-khoz. Célja a helyek közötti hamisítás (CSRF) enyhítése. Ezt eredetileg olyan funkcióként tervezték, amelyet a kiszolgálók az új paraméterek hozzáadásával választottak. ASP.NET Core 2.0 kezdeti támogatása a következőhöz SameSite
: .
Új viselkedés
A Google egy olyan új szabványtervezetet javasolt, amely nem kompatibilis visszafelé. A standard módosítja az alapértelmezett módotLax
, és hozzáad egy új bejegyzést None
a letiltáshoz. Lax
elegendő a legtöbb alkalmazás cookie-hoz, azonban megszakítja a helyek közötti forgatókönyveket, például az OpenID Csatlakozás és a WS-Federation bejelentkezést. A legtöbb OAuth-bejelentkezést nem érintik a kérések folyamatának eltérései. Az új None
paraméter kompatibilitási problémákat okoz a korábbi szabványtervezetet implementáló ügyfelekkel (például iOS 12). A Chrome 80 tartalmazza a módosításokat. Lásd: SameSite Frissítések a Chrome termékindítási ütemtervéhez.
ASP.NET Core 3.1 frissült az új SameSite
viselkedés implementálásához. A frissítés újradefiniálja a kibocsátandó viselkedéstSameSiteMode.None
, és hozzáad egy új értéket SameSiteMode.Unspecified
az SameSite
attribútum kihagyásához.SameSite=None
Az összes cookie API alapértelmezés szerint Unspecified
az, bár egyes cookie-kat használó összetevők a forgatókönyveikre jellemzőbb értékeket állít be, például az OpenID Csatlakozás korrelációt és a nem használt cookie-kat.
Az ezen a területen végzett egyéb legutóbbi változásokért lásd : HTTP: Néhány cookie SameSite alapértelmezett értéke Nincs értékre módosult. A ASP.NET Core 3.0-ban a legtöbb alapértelmezett érték át lett váltva SameSiteMode.Lax SameSiteMode.None (de továbbra is a korábbi szabványt használja).
A változás oka
A böngésző és a specifikáció az előző szövegben leírtak szerint változik.
Javasolt művelet
A távoli webhelyekkel (például külső bejelentkezéssel) kommunikáló alkalmazásoknak a következőkre van szükségük:
- Tesztelje ezeket a forgatókönyveket több böngészőben.
- Alkalmazza a régebbi böngészők támogatásában tárgyalt cookie-házirend-böngésző-sniffing-kockázatcsökkentést.
A tesztelési és böngészőszkennelési utasításokért tekintse meg a következő szakaszt.
Annak megállapítása, hogy érintett-e
Tesztelje a webalkalmazást egy ügyfélverzióval, amely képes az új viselkedésre. A Chrome, a Firefox és a Microsoft Edge Chromium mind új, tesztelésre használható opt-in funkciójelzőkkel rendelkezik. Ellenőrizze, hogy az alkalmazás kompatibilis-e a régebbi ügyfélverziókkal a javítások alkalmazása után, különösen a Safari esetében. További információ: Régebbi böngészők támogatása.
Chrome
A Chrome 78 és újabb verziói félrevezető teszteredményeket eredményeznek. Ezek a verziók ideiglenesen enyhítik a működést, és engedélyezik a két percnél régebbi cookie-kat. A megfelelő tesztjelzők engedélyezésével a Chrome 76 és a 77 pontosabb eredményeket eredményez. Az új viselkedés teszteléséhez váltson chrome://flags/#same-site-by-default-cookies
az engedélyezésre. A Chrome 75-ös és korábbi verziói az új None
beállítással meghiúsulnak. További információ: Régebbi böngészők támogatása.
A Google nem teszi elérhetővé a régebbi Chrome-verziókat. Azonban letöltheti a Chromium régebbi verzióit, amelyek elegendőek a teszteléshez. Kövesse a Download Chromium utasításait.
Safari
A Safari 12 szigorúan implementálta az előző vázlatot, és meghiúsul, ha az új None
értéket látja a cookie-kban. Ezt a régebbi böngészők támogatásában megjelenő böngészőszniffing-kóddal kell elkerülni. Győződjön meg arról, hogy teszteli a Safari 12-et és a 13-at, valamint a WebKit-alapú, operációsrendszer-alapú bejelentkezéseket a Microsoft Authentication Library (MSAL), az Active Directory Authentication Library (ADAL) vagy a használt tár használatával. A probléma az operációs rendszer alapjául szolgáló verziótól függ. Az OSX Mojave 10.14 és az iOS 12 ismerten kompatibilitási problémákat okoz az új viselkedéssel. Az OSX Catalina 10.15-ös vagy iOS 13-ra való frissítés megoldja a problémát. A Safari jelenleg nem rendelkezik az új specifikáció viselkedésének tesztelésére szolgáló bejelentkezési jelzőval.
Firefox
Az új szabvány Firefox-támogatása a 68-es és újabb verzióban tesztelhető, ha a about:config
funkciójelzővel network.cookie.sameSite.laxByDefault
rendelkező oldalon jelentkezik. A Firefox régebbi verzióiban nem jelentettek kompatibilitási problémákat.
Microsoft Edge
Bár a Microsoft Edge támogatja a régi SameSite
szabványt, a 44-es verziótól nem volt kompatibilitási probléma az új szabványsal.
Microsoft Edge Chromium
A funkciójelző a következő edge://flags/#same-site-by-default-cookies
: . A Microsoft Edge Chromium 78-nal végzett tesztelés során nem figyeltek meg kompatibilitási problémákat.
Electron
Az Elektron verziói közé tartoznak a Chromium régebbi verziói. A Microsoft Teams által használt Elektron verziója például a Chromium 66, amely a régebbi viselkedést mutatja. Saját kompatibilitási tesztelést végezhet a termék által használt Electron verziójával. További információ: Régebbi böngészők támogatása.
Régebbi böngészők támogatása
A 2016-os SameSite
szabvány előírta, hogy az ismeretlen értékeket értékekként SameSite=Strict
kell kezelni. Következésképpen az eredeti szabványt támogató régebbi böngészők megszakadhatnak, ha olyan tulajdonságot SameSite
látnak, amelynek értéke a következő None
: . A webalkalmazásoknak böngészőszniffinget kell implementálniuk, ha támogatni szeretnék ezeket a régi böngészőket. ASP.NET Core nem valósítja meg a böngészőszippelést, mert User-Agent
a kérésfejlécek értékei erősen instabilak, és heti rendszerességgel változnak. Ehelyett a cookie-szabályzat bővítménypontja lehetővé teszi a -specifikus logika hozzáadását User-Agent
.
A Startup.cs adja hozzá a következő kódot:
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
}
Opt-out kapcsolók
A Microsoft.AspNetCore.SuppressSameSiteNone
kompatibilitási kapcsoló lehetővé teszi, hogy ideiglenesen kikapcsolja az új ASP.NET Core cookie viselkedését. Adja hozzá a következő JSON-t egy runtimeconfig.template.json fájlhoz a projektben:
{
"configProperties": {
"Microsoft.AspNetCore.SuppressSameSiteNone": "true"
}
}
Egyéb verziók
A kapcsolódó SameSite
javítások a következőkhöz lesznek hamarosan elérhetők:
- ASP.NET Core 2.1, 2.2 és 3.0
Microsoft.Owin
4.1System.Web
(.NET-keretrendszer 4.7.2 és újabb verziók esetén)
Kategória
ASP.NET
Érintett API-k
- 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
Telepítés
x86 gazdagép elérési útja 64 bites Windows rendszeren
Msbuild
A tervezési idejű buildek csak legfelső szintű csomaghivatkozásokat adnak vissza
A .NET Core SDK 3.1.400-tól kezdve a cél csak legfelső szintű csomaghivatkozásokat ad RunResolvePackageDependencies
vissza.
Bevezetett verzió
.NET Core SDK 3.1.400
Módosítás leírása
A .NET Core SDK korábbi verzióiban a cél a RunResolvePackageDependencies
következő MSBuild elemeket hozta létre, amelyek információkat tartalmaztak a NuGet-objektumok fájljából:
PackageDefinitions
PackageDependencies
TargetDefinitions
FileDefinitions
FileDependencies
Ezeket az adatokat a Visual Studio használja a Függőségek csomópont feltöltéséhez Megoldáskezelő. Ez azonban nagy mennyiségű adat lehet, és az adatokra nincs szükség, kivéve, ha a Függőségek csomópont ki van bontva.
A .NET Core SDK 3.1.400-es verziójától kezdve a legtöbb elem alapértelmezés szerint nem jön létre. A rendszer csak a típuselemeket Package
adja vissza. Ha a Visual Studiónak szüksége van az elemekre a Függőségek csomópont feltöltéséhez, az adatokat közvetlenül az eszközfájlból olvassa be.
A változás oka
Ezt a módosítást a Visual Studióban a megoldásbetöltési teljesítmény javítása érdekében vezettük be. Korábban az összes csomaghivatkozás betöltődött, ami sok olyan hivatkozást tartalmazott, amelyeket a felhasználók többsége soha nem látna.
Javasolt művelet
Ha olyan MSBuild logikával rendelkezik, amely ezektől az elemektől függ, állítsa be a tulajdonságot true
a EmitLegacyAssetsFileItems
projektfájlba. Ez a beállítás lehetővé teszi az összes elem létrehozásának korábbi viselkedését.
Kategória
Msbuild
Érintett API-k
n/a
SDK
Eszközjegyzékek a gyökérmappában
Windows Forms
Eltávolított vezérlők
A .NET Core 3.1-től kezdve bizonyos Windows Forms-vezérlők már nem érhetők el.
Módosítás leírása
A .NET Core 3.1-től kezdve a Windows Forms különböző vezérlői már nem érhetők el. A jobb kialakítású és támogatott cserevezérlőket a 2.0-s .NET-keretrendszer vezették be. Az elavult vezérlőket korábban eltávolították a tervezőeszközkészletekből, de továbbra is használhatók voltak.
A következő típusok már nem érhetők el:
- 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
Bevezetett verzió
3.1
Javasolt művelet
Minden eltávolított vezérlő ajánlott cserevezérlővel rendelkezik. Tekintse meg a következő táblázatot:
Eltávolított vezérlő (API) | Javasolt csere | Eltávolított társított API-k |
---|---|---|
Contextmenu | ContextMenuStrip | |
Datagrid | Datagridview | DataGridCell, DataGridRow, DataGridTableCollection, DataGridColumnCollection, DataGridTableStyle, DataGridColumnStyle, DataGridLineStyle, DataGridParentRowsLabel, DataGridParentRowsLabelStyle, DataGridBoolColumn, DataGridTextBox, GridColumnStylesCollection, GridTableStylesCollection, HitTestType |
MainMenu | MenuStrip | |
Menü | ToolStripDropDown, ToolStripDropDownMenu | MenuItemCollection |
Menuitem | ToolStripMenuItem | |
Eszköztár | Eszközsávon | ToolBarAppearance |
ToolBarButton | ToolStripButton | ToolBarButtonClickEventArgs, ToolBarButtonClickEventHandler, ToolBarButtonStyle, ToolBarTextAlign |
Kategória
Windows Forms
Érintett API-k
- 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
A CellFormatting esemény nem jelenik meg, ha megjelenik az elemleírás
Ekkor DataGridView megjelenik egy cella szövegének és hibaelemeinek elemleírása, ha az egérrel rámutat, és a billentyűzeten keresztül van kiválasztva. Ha elemleírás jelenik meg, az DataGridView.CellFormatting esemény nem jelenik meg.
Módosítás leírása
A .NET Core 3.1-et megelőzően egy DataGridView olyan tulajdonság volt ShowCellToolTips beállítva true
, amely elemleírást mutatott egy cella szövegéhez, és hibákat észlelt, amikor a cellát egérrel mozgatta. Az elemleírások nem jelennek meg, amikor egy cella ki van jelölve a billentyűzeten keresztül (például a Tab billentyűvel, a billentyűparancsokkal vagy a nyílnavigációval). Ha a felhasználó szerkesztett egy cellát, majd miközben még DataGridView szerkesztési módban volt, egy olyan cellára mutatott, amely nem rendelkezik a ToolTipText tulajdonságkészlettel, egy eseményt emeltek ki, CellFormatting amely formázza a cella szövegét a cellában való megjelenítéshez.
A .NET Core 3.1-től kezdődően az akadálymentességi szabványoknak való megfelelés érdekében a DataGridView tulajdonság úgy van ShowCellToolTips beállítva true
, hogy elemleírásokat jelenítsen meg egy cella szövegéhez és hibáihoz nem csak a cella rámutatásakor, hanem a billentyűzeten keresztüli kijelöléskor is. A változás következtében az esemény nem jön létre, ha a CellFormatting tulajdonsághalmazt nem ToolTipText tartalmazó cellák a DataGridView szerkesztési módban vannak. Az esemény nem merül fel, mert a rámutatott cella tartalma elemleírásként jelenik meg a cellában való megjelenítés helyett.
Bevezetett verzió
3.1
Javasolt művelet
Az eseménytől DataGridView függő CellFormatting kód újrabontása szerkesztési módban.
Kategória
Windows Forms
Érintett API-k
Egyik sem