IE11不会设置x-cfrtoken HTTP标头,除非使用InPrivate窗口,否则将导致服务器以HTTP 403 Access Denied进行响应

亚伯

我已经为此感到困惑了两天。情况:

  • 简单的网站,在Websharper中运行,登录屏幕,单一视图,通过XHR与应用程序/ json响应
  • 该站点是在iframe具有不同域的站点中运行的(我无法更改它,但是我可以访问两个站点)。没有iframe,就不会有问题。
  • 您应该会看到登录错误的错误,但是在Windows 7上的IE11中不起作用。它在InPrivate模式下与在Windows 10上的任何IE11中都可以在同一IE11中工作这不是一个缓存问题。
  • 该网站设置了cookie,但是如果无法设置cookie(即iPhone),则无法使用cookie。

似乎在InPrivate模式下,x-csfrtoken在请求标头中设置了,在InPrivate模式之外,此标头未设置然后,服务器返回HTTP 403错误,这似乎是问题的根源。

我不知道如何指示服务器(IIS)忽略此令牌。

要查看此行为的实际效果,请转到该站点并输入任何内容,然后单击“ Inloggen”。您应该看到一个登录错误(荷兰语),但是在Windows 7的IE11中,不会出现此错误。

我尝试对Microsoft进行此解决方案,以对进行不当的使用LocalLow,但该解决方案无法解决该问题,因此似乎无关。

亚伯

显然,这是Windows 7和Windows 8 / 8.1上IE11中的错误。我发现浏览器确实发送了csrftokencookie,但是忘记了必需的x-csrftokenHTTP Header参数,所有其他浏览器(包括Windows 10上的IE和IE11的旧版本和新版本)都正确发送了该参数。

如果您的工具链通过验证x-csrftoken(任何框架都建议)来保护自己,则IE11失败。在这里WebSharper讨论,但没有一个完整的解决方案呢。

我发现可以正常工作的解决方法如下。它很容易处理,它会在到达时更改HTTP标头,但其他工具也可以这样做(以代理服务器为例)。global.asax.fs如果您使用的是WebSharper ,请在F#中放置以下代码(有点混乱,但是我将整理一下作为读者的练习;)。

member __.Application_BeginRequest(sender: obj, args: System.EventArgs) =
    HttpContext.Current
    |> function
    | null -> ()
    | ctx ->
        match ctx.Request with
        | null -> ()
        | req ->
            match req.Cookies.Item "csrftoken", req.Headers.Item "x-csrftoken" with
            | null, null -> ()
            | cookie, null ->
                // fix for IE11, which does not always set the HTTP Header "x-csrftoken"
                try req.Headers.Item "x-csrftoken" <- cookie.Value
                with _ -> ()       // ignore possible errors
            | null, _ ->
                // if header is set but cookie is not, there's nothing we can do (cookie collection is read-only)
                ()
            | cookie, csrfHeader when cookie.Value <> csrfHeader ->
                try req.Headers.Item "x-csrftoken" <- cookie.Value
                with _ -> ()       // ignore possible errors
            | _ ->
                ()      // all is fine, the default: cookie "csfrtoken" and header "x-csfrtoken" are equal

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章