Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防伪令牌竞争条件_C#_Asp.net Mvc_Iframe_Cookies - Fatal编程技术网

C# 防伪令牌竞争条件

C# 防伪令牌竞争条件,c#,asp.net-mvc,iframe,cookies,C#,Asp.net Mvc,Iframe,Cookies,我有一个MVC视图,应该是iFramed。它的多个实例可能在同一主机页中构建。我认为: @Html.AntiForgeryToken() 我使用它来确保对web api的调用仅来自此页面。我的主机页可能如下所示: <iframe src="http://myserver.com/myview?someparameters=0000"></iframe> <iframe src="http://myserver.com/myview?someparameters=0

我有一个MVC视图,应该是iFramed。它的多个实例可能在同一主机页中构建。我认为:

@Html.AntiForgeryToken()
我使用它来确保对web api的调用仅来自此页面。我的主机页可能如下所示:

<iframe src="http://myserver.com/myview?someparameters=0000"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0001"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0002"></iframe>
我遇到的问题是,在我的主页中,所有三个视图都是并行加载的。结果,他们都在一个隐藏字段中获得自己的随机令牌,并尝试设置cookie。但是,虽然可以有三个独立的隐藏输入令牌,但只能有一个cookie。因此,在三个请求中,两个将失败,一个将成功。重新加载页面将使所有三个都再次工作,可能是因为它们此时都获得了相同的防伪令牌(因为它属于会话-如果我理解正确的话)


那么我该如何避免这种情况呢?如何确保它们都获得相同的令牌?

您需要在iFrame之外创建您的AntiForgeryToken,并以某种方式将其传递到子页面

在外部页面中,将防伪令牌作为查询参数传递给子页面

@{    
  var aft = @Html.AntiForgeryToken; 
}
<iframe src="http://myserver.com/myview?someparameters=0000&aft=@aft"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0001&aft=@aft"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0002&aft=@aft"></iframe>
@{
var aft=@Html.AntiForgeryToken;
}

然后,在呈现子视图的页面上,检查是否设置了AFT,如果设置了AFT,请使用它,如果未设置,请使用
@Html.AntiForgeryToken()

尝试使用partialview。在每个部分视图中,您可以使用iframe,所有部分视图都将添加到包含Html.AntiForgeryToken()的main.cshtml文件中

@Html.AntiForgeryToken()
@{Html.RenderPartial(“_iFrame1”);}
@{Html.RenderPartial(“_iFrame2”);}
@{Html.RenderPartial(“_iFrame3”);}

您可以通过不使用iframe来避免这种情况。所以问题是:你能改变设计吗?你需要iFrame吗?每个iframe是否都包含一个表单?因为防伪令牌将只用于发布信息。@RuardvanElburg-不太可能。我们的想法是,这是一个小部件类型的东西,我们的客户可以把它放到他们自己的页面上。问题是,他们想在同一个页面上放置几个,并在其周围放置自己的内容。iframed页面本身必须进行一些后端调用,这些调用通过检查令牌进行保护,但也许我必须重新考虑这一点。javascript解决方案?@HoomanBahreini-令牌不是问题所在。cookie是@HoomanBahreini-它是一个仅限http的cookie。无法从javascript访问它。此外,检查它是否已经设置,仍然会导致完全相同的竞争条件。事实上,这正是内部发生的
@Html.AntiForgeryToken()
。它检查是否已设置cookie,如果未设置cookie,则创建一个新cookie,并在html中创建一个隐藏的
input
标记。问题是两个请求同时进入,并且它们都没有cookie。
@{    
  var aft = @Html.AntiForgeryToken; 
}
<iframe src="http://myserver.com/myview?someparameters=0000&aft=@aft"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0001&aft=@aft"></iframe>
<iframe src="http://myserver.com/myview?someparameters=0002&aft=@aft"></iframe>