问题描述

Azure应用程序网关设置 set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD 登录使用cookie时使用不了。

 

分析过程

重写网关的set-cookie属性时,会删除其他的set-cookie属性,所以如果重写该Cookie的话可能会删除原来网站响应返回的cookie,可以参考:https://docs.azure.cn/zh-cn/application-gateway/rewrite-http-headers-url#limitations

限制

如果响应中包含多个同名的标头,则重写其中某个标头的值会导致删除该响应中的其他标头。 这种情况往往出现于 Set-Cookie 标头,因为在一个响应中可以包含多个 Set-Cookie 标头。 例如,如果将应用服务与应用程序网关一起使用,并在应用程序网关上配置了基于 Cookie 的会话关联,则就会出现此类情况。 在这种情况下,响应将包含两个 Set-Cookie 标头:一个用于应用服务(例如 Set-Cookie: ARRAffinity=ba127f1caf6ac822b2347cc18bba0364d699ca1ad44d20e0ec01ea80cda2a735;Path=/;HttpOnly;Domain=sitename.chinacloudsites.cn),另一个用于应用程序网关关联(例如 Set-Cookie: ApplicationGatewayAffinity=c1a2bd51lfd396387f96bl9cc3d2c516; Path=/)。 在此情况下重写其中一个 Set-Cookie 标头可能会导致从响应中删除另一个 Set-Cookie 标头。

当应用程序网关配置为重定向请求或显示自定义错误页时,不支持重写。

标头名称可以包含任何字母数字字符和 RFC 7230 中定义的特定符号。 目前不支持在标头名称中使用特殊字符下划线 (_)。

无法重写 Connection 和 Upgrade 标头

在AAD的文档文档中,指明了AAD只支持 samesite=none 的这种设置,如果要将samesite值设为lax或者strict,那么AAD验证时无法通过的,可以参考:https://docs.azure.cn/zh-cn/active-directory/develop/howto-handle-samesite-cookie-changes-chrome-browser?tabs=java

什么是 SameSite?

SameSite 是一个属性,可在 HTTP Cookie 中设置该属性,以防止 Web 应用程序遭受跨站点请求伪造 (CSRF) 攻击:

当 SameSite 设置为 SameSite时,cookie 将在同一站点中的请求和来自其他站点的 GET 请求中发送。 不会在跨域的 GET 请求中发送 Cookie。

使用 Strict 值可确保仅在同一站点内的请求中发送 Cookie。

默认情况下,不会在浏览器中设置 SameSite 值,正因如此,在请求中发送的 Cookie 没有限制。 应用程序需要根据要求设置 Lax 或 Strict 来启用 CSRF 保护。

 

PS: 最后的临时解决方案为:不在应用程序网关(Application Gateway)中重写Cookie,而是把 set-cookie=key=value;SameSite=Strict;HTTPOnly 设置在Nginx:

 

参考文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。