Cookies SameSite et Open Web Interface for .NET (OWIN)
Par Rick Anderson
SameSite
est un brouillon IETF conçu pour fournir une protection contre les attaques de falsification de requête intersite (CSRF). Le brouillon SameSite 2019 :
- Traite les cookies comme
SameSite=Lax
par défaut. - États des cookies qui affirment
SameSite=None
explicitement afin d’activer la livraison intersites doivent être marqués commeSecure
.
Lax
fonctionne pour la plupart des cookies d’application. Certaines formes d’authentification comme OpenID Connect (OIDC) et WS-Federation sont par défaut des redirections basées sur POST. Les redirections basées sur POST déclenchent les protections du SameSite
navigateur. Elles sont donc SameSite
désactivées pour ces composants. La plupart des connexions OAuth ne sont pas affectées en raison de différences dans la façon dont les flux de requête sont effectués. Tous les autres composants ne sont pas définis SameSite
par défaut et utilisent le comportement par défaut des clients (ancien ou nouveau).
Le None
paramètre provoque des problèmes de compatibilité avec les clients qui ont implémenté la norme préliminaire 2016 précédente (par exemple, iOS 12). Consultez Prise en charge des navigateurs plus anciens dans ce document.
Chaque composant OWIN qui émet des cookies doit décider si SameSite
c’est approprié.
Pour obtenir la version ASP.NET 4.x de cet article, consultez Utiliser les cookies SameSite dans ASP.NET.
Microsoft.Owin
a sa propre SameSite
implémentation :
- Cela ne dépend pas directement de celui en
System.Web
. SameSite
fonctionne sur toutes les versions ciblant lesMicrosoft.Owin
packages, .NET 4.5 et versions ultérieures.- Seul le composant SystemWebCookieManager interagit directement avec la
System.Web
HttpCookie
classe.
SystemWebCookieManager
dépend des API .NET 4.7.2 System.Web
pour activer SameSite
la prise en charge et les correctifs pour modifier le comportement.
Les raisons d’utilisation SystemWebCookieManager
sont décrites dans les problèmes d’intégration des cookies de réponse OWIN et System.Web. SystemWebCookieManager
est recommandé lors de l’exécution sur System.Web
.
Le code suivant définit SameSite
la valeur Lax
suivante :
owinContext.Response.Cookies.Append("My Key", "My Value", new CookieOptions()
{
SameSite = SameSiteMode.Lax
});
Les API suivantes utilisent SameSite
:
- Microsoft.Owin.SameSiteMode
- CookieOptions.SameSite
- CookieAuthenticationOptions, classe
- CookieAuthenticationOptions.CookieSameSite
- ICookieManager
- SystemWebCookieManager
- SystemWebChunkingCookieManager
- CookieAuthenticationOptions.CookieManager
- OpenIdConnectAuthenticationOptions.CookieManager
Microsoft.Owin n’a jamais pris en charge la SameSite
norme brouillon 2016.
La prise en charge du brouillon SameSite 2019 est disponible uniquement dans Microsoft.Owin
la version 4.1.0 et ultérieure. Il n’existe aucun correctif pour les versions antérieures.
Le projet de SameSite
spécification 2019 :
- N’est pas rétrocompatible avec le brouillon de 2016. Pour plus d’informations, consultez Prise en charge des navigateurs plus anciens dans ce document.
- Spécifie que les cookies sont traités comme des
SameSite=Lax
par défaut. - Spécifie que les cookies qui appelent explicitement l’assertion
SameSite=None
pour activer la livraison intersites doivent être marqués commeSecure
.None
est une nouvelle entrée à refuser. - Est prévu pour être activé par Chrome par défaut en février 2020. Les navigateurs ont commencé à passer à cette norme en 2019.
- Est pris en charge par les correctifs émis comme décrit dans les articles de la Base de connaissances. Pour plus d’informations, consultez les articles de la base de connaissances qui prennent en charge SameSite dans .NET Framework.
La norme 2016 SameSite
a mandaté que les valeurs inconnues doivent être traitées comme SameSite=Strict
des valeurs. Les applications accessibles à partir de navigateurs plus anciens qui prennent en charge la norme 2016 SameSite
peuvent s’interrompre lorsqu’elles obtiennent une SameSite
propriété avec une valeur de None
. Les applications web doivent implémenter la détection de navigateur si elles ont l’intention de prendre en charge les navigateurs plus anciens. ASP.NET n’implémente pas la détection du navigateur, car les valeurs User-Agents sont très volatiles et changent fréquemment. Un point d’extension dans ICookieManager permet de brancher une logique spécifique à l’agent utilisateur.
Dans Startup.Configuration
, ajoutez du code similaire à ce qui suit :
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
// … Your preexisting options …
CookieManager = new SameSiteCookieManager(
new SystemWebCookieManager())
});
// Remaining code removed for brevity.
Le code précédent nécessite le correctif .NET 4.7.2 ou ultérieur SameSite
.
Le code suivant montre un exemple d’implémentation de SameSiteCookieManager
:
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 (options.SameSite == Microsoft.Owin.SameSiteMode.None
&& DisallowsSameSiteNone(context))
{
options.SameSite = null;
}
}
Dans l’exemple précédent, DisallowsSameSiteNone
est appelé dans la CheckSameSite
méthode. DisallowsSameSiteNone
est une méthode utilisateur qui détecte si l’agent utilisateur ne prend pas en charge SameSite
None
:
private void CheckSameSite(IOwinContext context, CookieOptions options)
{
if (options.SameSite == Microsoft.Owin.SameSiteMode.None
&& DisallowsSameSiteNone(context))
{
options.SameSite = null;
}
}
Le code suivant montre un exemple de méthode DisallowsSameSiteNone
:
Avertissement
Le code suivant est destiné à la démonstration uniquement :
- Il ne doit pas être considéré comme complet.
- Il n’est pas géré ou pris en charge.
public static bool DisallowsSameSiteNone(IOwinContext context)
{
var userAgent = context.Request.Headers["User-Agent"];
if (string.IsNullOrEmpty(userAgent))
{
return false;
}
// Cover all iOS based browsers here. This includes:
// - Safari on iOS 12 for iPhone, iPod Touch, iPad
// - WkWebview on iOS 12 for iPhone, iPod Touch, iPad
// - Chrome on iOS 12 for iPhone, iPod Touch, iPad
// All of which are broken by SameSite=None, because they use the iOS
// networking stack.
if (userAgent.Contains("CPU iPhone OS 12") ||
userAgent.Contains("iPad; CPU OS 12"))
{
return true;
}
// Cover Mac OS X based browsers that use the Mac OS networking stack.
// This includes:
// - Safari on Mac OS X.
// This does not include:
// - Chrome on Mac OS X
// Because they do not use the Mac OS networking stack.
if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") &&
userAgent.Contains("Version/") && userAgent.Contains("Safari"))
{
return true;
}
// Cover Chrome 50-69, because some versions are broken by SameSite=None,
// and none in this range require it.
// Note: this covers some pre-Chromium Edge versions,
// but pre-Chromium Edge does not require SameSite=None.
if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6"))
{
return true;
}
return false;
}
Les applications qui interagissent avec des sites distants, par le biais d’une connexion tierce, par exemple, doivent :
- Testez l’interaction sur plusieurs navigateurs.
- Appliquez la détection et l’atténuation du navigateur décrites dans ce document.
Testez les applications web à l’aide d’une version cliente qui peut accepter le nouveau SameSite
comportement. Chrome, Firefox et Chromium Edge ont tous de nouveaux indicateurs de fonctionnalités d’adhésion qui peuvent être utilisés pour les tests. Une fois que votre application applique les correctifs, testez-le SameSite
avec des versions clientes plus anciennes, en particulier Safari. Pour plus d’informations, consultez Prise en charge des navigateurs plus anciens dans ce document.
Chrome 78+ donne des résultats trompeurs, car une atténuation temporaire est en place. L’atténuation temporaire de Chrome 78+ autorise les cookies de moins de deux minutes. Chrome 76 ou 77 avec les indicateurs de test appropriés activés fournit des résultats plus précis. Pour tester le nouveau SameSite
comportement bascule chrome://flags/#same-site-by-default-cookies
sur Activé. Les versions antérieures de Chrome (75 et versions ultérieures) échouent avec le nouveau None
paramètre. Consultez Prise en charge des navigateurs plus anciens dans ce document.
Google ne met pas à disposition d’anciennes versions de Chrome. Suivez les instructions fournies dans Télécharger Chromium pour tester les anciennes versions de Chrome. Ne téléchargez pas Chrome à partir des liens fournis en recherchant des versions antérieures de Chrome.
Safari 12 a strictement implémenté le brouillon précédent et échoue lorsque la nouvelle None
valeur se trouve dans un cookie. None
est évité via le code de détection du navigateur Prise en charge des navigateurs plus anciens dans ce document. Testez les connexions de style de système d’exploitation Safari 12, Safari 13 et WebKit à l’aide de MSAL ou de la bibliothèque que vous utilisez. Le problème dépend de la version sous-jacente du système d’exploitation. OSX Mojave (10.14) et iOS 12 sont connus pour avoir des problèmes de compatibilité avec le nouveau SameSite
comportement. La mise à niveau du système d’exploitation vers OSX Catalina (10.15) ou iOS 13 résout le problème. Safari ne dispose pas actuellement d’un indicateur d’adhésion pour tester le nouveau comportement de spécification.
La prise en charge de Firefox pour la nouvelle norme peut être testée sur la version 68+ en acceptant sur la page about:config
avec l’indicateur de fonctionnalité network.cookie.sameSite.laxByDefault
. Il n’y a pas eu de rapports de problèmes de compatibilité avec les versions antérieures de Firefox.
Edge prend en charge l’ancienne SameSite
norme. Edge version 44 n’a pas de problèmes de compatibilité connus avec la nouvelle norme.
SameSite
les indicateurs sont définis sur la edge://flags/#same-site-by-default-cookies
page. Aucun problème de compatibilité n’a été détecté avec Edge Chromium.
Les versions d’Electron incluent des versions antérieures de Chromium. Par exemple, la version d’Electron utilisée par Teams est Chromium 66, qui présente l’ancien comportement. Vous devez effectuer vos propres tests de compatibilité avec la version d’Electron utilisée par votre produit. Consultez Prise en charge des navigateurs plus anciens dans la section suivante.