Google chrome 如何在OAUTH2之后使用SameSite=Strict重定向并仍然获得cookie?

Google chrome 如何在OAUTH2之后使用SameSite=Strict重定向并仍然获得cookie?,google-chrome,cookies,oauth-2.0,Google Chrome,Cookies,Oauth 2.0,再见!除此之外,接受的答案是设置SameSite=Lax: 我如何设置重定向到我自己的SameSite=Strictcookie,这样我就可以从Chrome56.0.2924.87中获取cookie,即使用户的请求本身是从我的OAUTH2提供商的登录页面重定向的 完整的请求链是: POSThttps://provider.com/callback→ 302已找到带有: Location: https://me/login?code=xxx&state=yyy GEThttps://

再见!除此之外,接受的答案是设置
SameSite=Lax

我如何设置重定向到我自己的
SameSite=Strict
cookie,这样我就可以从Chrome
56.0.2924.87
中获取cookie,即使用户的请求本身是从我的OAUTH2提供商的登录页面重定向的

完整的请求链是:

  • POSThttps://provider.com/callback
    → <代码>302已找到带有:

    Location: https://me/login?code=xxx&state=yyy
    
  • GEThttps://example.com/login?code=xxx&state=yyy
    → <代码>302已找到或
    303请参阅其他
    (似乎无关紧要)与以下内容有关:

  • GEThttps://example.com/destination
    → <代码>401离开我的草坪,因为浏览器没有显示
    sid
    cookie

  • GEThttps://example.com/destination
    200 OK
    如果我刷新,因为站点是相同的,我的浏览器显示
    sid
    cookie

我很欣赏CSRF将
sid
呈现给
/destination
的潜力,因为一般情况下,用户上次加载的页面不在
example.com
上,但我只是从
/login
设置了它,而我现在是重定向到
/destination
的人


当然,我可以设置
SameSite=Lax
,但是如果有人能找到某种方法通过错误形成URL来触发他们选择从我的站点重定向,那么就不会有点击劫持的可能性了吗?

我认为出于安全原因,这是不可能做到的
SameSite=Strict
意味着,若用户被重定向或只是点击了指向您站点的链接(来自其他主机),则不应发送cookie。重定向就像是“链接”请求。因此,如果您的服务器重定向到另一个服务器,而此服务器立即重定向回3xx代码,则会发送cookie,因为您的服务器位于此链的“顶部”

但是,如果您重定向到oauth提供者,并且用户必须允许您访问他的帐户,这意味着此“链”已断开,并且即使您的站点设置了cookie,也不会再发送cookie(尽管已设置但未发送)。您的重定向只是单击的“允许”链接的“扩展”

如果你想阻止其他人点击你的网站,只要在链接中使用nonce,如果你认为,你必须阻止这种行为,如果你不这样做,这可能是危险的。但是请考虑,大多数提供者“强”都在检查< <强> >如果重新定义URL是由应用程序预先定义和允许的。

以下是其他解决方案(仅当您知道自己在做什么并且能够承担100%的责任时才使用)

  • 准备带有“继续站点”链接的站点(当然,点击链接后会发送cookie)
  • 用JavaScript重新加载窗口
  • 使用JavaScript准备站点,它将重定向用户
  • 将第一种和第三种方法结合起来,以获得更清晰的解决方案,并且在浏览器中不支持JavaScript

我在开发过程中使用了second,现在我使用的是同一个站点lax(这是Hapi中的默认值,最高可达15版本,所以还不错)。

HTTP OK带有HTML重定向确保重定向请求实际发送
SameSite=Strict
cookie

解决办法很简单。发送带有以下正文的200而不是302:


搬到

我的OIDC场景涉及:

  • 得到302https://strict 重定向到其他域
  • 得到302https://oidc 重定向
  • 拿200https://oidc/2 嗯
  • 邮政302http://strict
  • 拿200https://strict/redirect?returnUrl=target (新的HTML重定向)
  • 拿200https://strict/target
通常我们将302重定向到OIDC POST上的目标,但是,这不适用于
SameSite=Strict
。浏览器拒绝发送cookie,即使它存储了cookie。如果关闭浏览器并重新打开,它将发送cookie。通过添加额外的HTML重定向,浏览器在请求最终URL时发送cookie

在.NET Core中,我能够使用SameSite=Strict Cookie,方法是用HTML重定向解决方案替换
Response.Redirect

公共密封类OpenIdConnectHtmlRedirectHandler:OpenIdConnectHandler
{
公共OpenIdConnectHtmlRedirectHandler(IOptionsMonitor选项,
iLogger工厂记录器,
HtmlEncoder HtmlEncoder,
URL编码器,
ISystemClock时钟):基本(选项、记录器、htmlEncoder、编码器、时钟){}
公共重写异步任务HandleRequestAsync()
{
如果(!wait base.HandleRequestAsync())
返回false;
var headers=Response.GetTypedHeaders();
if(null==headers.Location)
返回true;
Response.ContentType=“text/html”;
Response.StatusCode=200;
headers.Location=null;
等待响应。WriteAsync($“”,
Encoding.UTF8,Context.RequestAborted);
返回true;
}
}
Location: https://example.com/destination
Set-Cookie: sid=zzzz; Secure; HttpOnly; SameSite=Strict; Path=/