SameSite est une
extension de cookie HTTP 2016 conçue pour empêcher la falsification de demande intersite (CSRF). Initialement, sa conception était une fonctionnalité supplémentaire qui peut être utilisée en ajoutant une nouvelle propriété SameSite aux cookies. Il avait deux significations, Lax et Strict.
Lors de la définition de la valeur Lax, il est entendu que des cookies doivent être envoyés lors de la navigation sur un site ou via GET surfing sur votre site à partir d'autres sites. La valeur Strict limite les cookies aux demandes provenant d'un seul site. L'absence de définition de propriété n'impose aucune restriction sur la façon dont les cookies peuvent fonctionner dans les demandes. Les opérations d'authentification OpenIdConnect (par exemple, connexion, déconnexion) et d'autres fonctions qui envoient des demandes POST d'un site externe au site demandant l'opération peuvent utiliser des cookies pour corréler et / ou protéger CSRF. Ces opérations devraient rejeter SameSite sans définir la moindre propriété pour garantir que ces cookies sont envoyés lors de leurs flux de demandes spécialisés.
Google
met actuellement à
jour la norme et introduit les modifications proposées dans une future version de Chrome. La modification ajoute la même valeur SameSite «None» et change le comportement par défaut en «Lax». Cela rompt les connexions OpenIdConnect et éventuellement d'autres fonctionnalités sur lesquelles votre site Web peut s'appuyer. Ces fonctionnalités devront utiliser des cookies dont la propriété SameSite est définie sur None.
Cependant, les navigateurs qui adhèrent à la norme d'origine et ne connaissent pas la nouvelle valeur se comportent différemment des navigateurs qui utilisent la nouvelle norme. Cela signifie que votre site Web .NET devra maintenant ajouter un reniflement d'agent utilisateur pour décider d'envoyer une nouvelle valeur None ou de ne pas envoyer d'attribut du tout.

.NET recevra des mises à jour pour modifier le comportement de l'attribut SameSite dans .NET 4.7.2 et .NET Core 2.1 et versions ultérieures afin de s'adapter à l'introduction par Google de la nouvelle valeur. Les mises à jour pour .NET Framework seront disponibles le 19 novembre en tant que mise à jour supplémentaire via Microsoft Update et WSUS si vous utilisez la fonctionnalité Rechercher les mises à jour. Le 10 décembre, la mise à jour sera mise à la disposition du public et apparaîtra dans le Centre de mise à jour Microsoft. Les mises à jour de .NET Core seront disponibles en novembre avec la sortie de .NET Core 3.1, à partir de l'aperçu 1.
.NET Core 3.1 contiendra une
définition d'énumération mise à jour , SameSite.Unspecified, qui ne définira pas la propriété SameSite.
Le middleware OpenIdConnect pour Microsoft.Owin v4.1 et .NET Core sera mis à jour simultanément avec les mises à jour de .NET Framework et .NET, cependant, nous ne pouvons pas ajouter de code de reniflement d'agent utilisateur au framework, cela doit être implémenté dans le code de votre site. L'implémentation de la détection d'agent dépendra de la version d'ASP.NET ou d'ASP.NET Core que vous utilisez et des navigateurs que vous souhaitez prendre en charge.
Pour ASP.NET 4.7.2 avec Microsoft.Owin 4.1.0, le reniflage d'agent peut être implémenté à l'aide de
ICookieManager ;
public class SameSiteCookieManager : ICookieManager { private readonly ICookieManager _innerManager; public SameSiteCookieManager() : this(new CookieManager()) { } public SameSiteCookieManager(ICookieManager innerManager) { _innerManager = innerManager; } public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) { CheckSameSite(context, options); _innerManager.AppendResponseCookie(context, key, value, options); } public void DeleteCookie(IOwinContext context, string key, CookieOptions options) { CheckSameSite(context, options); _innerManager.DeleteCookie(context, key, options); } public string GetRequestCookie(IOwinContext context, string key) { return _innerManager.GetRequestCookie(context, key); } private void CheckSameSite(IOwinContext context, CookieOptions options) { if (DisallowsSameSiteNone(context) && options.SameSite == SameSiteMode.None) { options.SameSite = null; } } public static bool DisallowsSameSiteNone(IOwinContext context) {
Et puis configurez les paramètres OpenIdConnect pour utiliser le nouveau CookieManager;
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions {
Pour que SystemWebCookieManager fonctionne correctement, vous devez installer le même site fixe .NET 4.7.2 ou une version ultérieure.
Pour ASP.NET Core, vous devez installer les correctifs, puis injecter le code de détection d'agent dans
la stratégie de cookie . Pour les versions antérieures à 3.1, remplacez SameSiteMode.Unspecified par (SameSiteMode) (- 1).
private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite > SameSiteMode.Unspecified) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString();
Lors des tests avec l'équipe Azure Active Directory, nous avons constaté que les vérifications suivantes fonctionnent pour tous les agents utilisateurs courants qui, selon Azure Active Directory, ne comprennent pas la nouvelle valeur.
public static bool DisallowsSameSiteNone(string userAgent) {
Cette liste de navigateurs n'est en aucun cas quelque chose sur laquelle vous pouvez compter, et vous devez vérifier que les navigateurs habituels et les autres agents utilisateurs pris en charge par votre système se comportent correctement après l'installation de la mise à jour.
Chrome 80 devrait
passer à un nouveau comportement en février ou mars 2020. Si vous souhaitez découvrir le nouveau comportement, les anciennes versions de Chromium
sont disponibles en téléchargement .
Si vous ne pouvez pas mettre à niveau votre version de framework au moment où Chrome active le nouveau comportement au début de 2020, vous pourrez peut-être changer le flux OpenIdConnect en un flux de code, et non en un flux utilisé par ASP.NET et ASP.NET Core. Mais cela doit être considéré comme une mesure temporaire.
Nous vous recommandons vivement de télécharger les versions mises à jour de .NET Framework et .NET Core lorsqu'elles seront disponibles en novembre et de commencer à planifier la mise à jour avant que les modifications ne soient apportées à Chrome.