Modifications à venir des cookies SameSite dans ASP.NET et ASP.NET Core

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) { // TODO:    User Agent . var userAgent = context.Request.Headers["User-Agent"]; return userAgent.Contains("BrokenUserAgent") || userAgent.Contains("BrokenUserAgent2") } } 

Et puis configurez les paramètres OpenIdConnect pour utiliser le nouveau CookieManager;

 app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // …    … CookieManager = new SameSiteCookieManager(new SystemWebCookieManager()) }); 

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(); // TODO:    User Agent . if (/* UserAgent doesn't support new behavior */) { //  .NET Core < 3.1  SameSite = -1 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) { app.UseCookiePolicy(); // Before UseAuthentication or anything else that writes cookies. app.UseAuthentication(); // … } 

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) {    //      iOS.   :    // - Safari  iOS 12  iPhone, iPod Touch, iPad    // - WkWebview  iOS 12  iPhone, iPod Touch, iPad    // - Chrome  iOS 12  iPhone, iPod Touch, iPad    if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12"))    {        return true;    }    //     Mac OS X.   :    // - Safari  Mac OS X.    //  :    // - Chrome  Mac OS X    //        Mac OS.    if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && userAgent.Contains("Version/") && userAgent.Contains("Safari"))    {        return true;    }    //    Chrome 50-69,      SameSite=None.    if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))    {        return true;    }    return false; } 

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.

Source: https://habr.com/ru/post/fr473168/


All Articles