相关疑难解决方法(0)

登录后重新加载AntiForgeryToken

在成功登录同一页面中的另一个视图后,我需要在视图中的表单中重新加载AntiForgeryToken.

我可以通过jQuery在结果登录页面输入@ Html.AntiForgeryToken()键的形式更新吗?

如果是,这是推荐和安全吗?

我该怎么做?

编辑:

在布局中我有不同的PartialViews:

部分登录:

<ul class="menudrt" id="headerLogin">
    @{ Html.RenderAction(MVC.Account.LoginHeader()); }
</ul>
Run Code Online (Sandbox Code Playgroud)

在另一个部分,发送评论的可能性:

<div class="comentsform">

    <!-- Comments form -->
    @{ Html.RenderAction(MVC.Comment.Create()); }

</div>
Run Code Online (Sandbox Code Playgroud)

要发送评论,用户必须登录,因此在登录后,评论表格需要更新AntiForgeryToken或者我得到验证错误,因为现在登录已经不同了.

谢谢

security asp.net-mvc jquery razor

9
推荐指数
2
解决办法
6791
查看次数

MVC3 AntiForgeryToken打破了Ajax登录

ASP.NET MVC的AntiForgeryToken机制基于当前HttpContext.User.它在您调用时使用该值来构造令牌Html.AntiForgeryToken().基本上没关系(请参阅此处最后一段中的解释)但是当您通过Ajax调用登录时会出现问题.

在我的代码中,当用户登录时,凭据在Ajax中作为Json对象发送(AntiForgeryToken隐藏字段值也在Json内发送),服务器验证用户,应用FormsAuthentication.SetAuthCookie(),并返回Json结果包含一些用户特定的数据.这样,我可以在登录时避免整页刷新.

问题是现在每个后续的Ajax请求都会失败ValidateAntiForgeryTokenAttribute,因为它现在需要一个与防伪cookie不兼容的防伪标记.

如何将有效的防伪标记放入客户端的隐藏字段中,以便登录后的每个Json请求都会成功?

我试图手动获取一个新的隐藏字段标记(AntiForgery.GetHtml()在操作上使用,提取标记字符串本身,将其返回到Json中的客户端并在JavaScript中手动将其放置在防伪隐藏字段中)但它不起作用 - ValidateAntiForgeryTokenAttribute服务器上的后续Ajax调用失败.事实上,每次调用AntiForgery.GetHtml()(基本上是Html.AntiForgeryToken()帮助程序所做的)都会产生一个不同的令牌,这会使前一个令牌失效.

我也试着设置HttpContext.User = new GenericPrincipal(new GenericIdentity(email), null);详见这里,但它不工作.

注意: 由于我的具体情况,此解决方案对我不起作用:Ajax 登录更改服务器上的用户身份,因此登录前生成的每个令牌都无效; 此解决方案也不适用,因为它解决了不同的问题.

security ajax asp.net-mvc antiforgerytoken asp.net-mvc-3

8
推荐指数
1
解决办法
3549
查看次数