Anti Forgery Token竞赛条件

Mat*_*and 11 c# cookies asp.net-mvc iframe

我有一个MVC视图应该是iFramed.它的几个实例可能是iFramed在同一个主页中.在我看来,我有这个:

@Html.AntiForgeryToken()
Run Code Online (Sandbox Code Playgroud)

我用来尝试确保调用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>
Run Code Online (Sandbox Code Playgroud)

在我看来,我抓住令牌并在标题中提交它,以便我可以在我的API中检查它:

var headers = actionContext.Request.Headers;
var headerToken = headers.Contains("__RequestVerificationToken") ? headers.GetValues("__RequestVerificationToken").FirstOrDefault() : null;
var cookie = headers.GetCookies("__RequestVerificationToken").FirstOrDefault()?["__RequestVerificationToken"]?.Value;

AntiForgery.Validate(cookie,headerToken);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,在我的主机页面中,所有三个视图都是并行加载的.因此,他们都在隐藏字段中获取自己的随机令牌并尝试设置cookie.但是,虽然可以有三个独立的独立隐藏输入令牌,但只能有一个cookie.因此,在三个请求中,两个将失败,一个将成功.重新加载页面将使所有三个都重新工作,大概是因为它们在这一点上都获得了相同的防伪标记(因为它属于会话 - 如果我理解正确的话).

那我怎么能避免这个呢?我怎样才能确保他们都获得相同的标记?

And*_*ewP 0

您需要在 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>
Run Code Online (Sandbox Code Playgroud)

然后,在渲染子视图的页面上,检查是否设置了AFT,如果设置了则使用它,如果没有则使用@Html.AntiForgeryToken()