ASP.NET MVC 的AntiForgeryToken机制基于当前的HttpContext.User. 当您调用Html.AntiForgeryToken(). 基本上没问题(请参阅此处最后一段中的解释),但是当您通过Ajax 调用登录时会出现问题。
在我的代码中,当用户登录时,凭据在 Ajax 中作为 Json 对象发送(AntiForgeryToken隐藏字段值也在 Json 内部发送),服务器对用户进行身份验证,应用 FormsAuthentication.SetAuthCookie(),并返回一个 Json结果包含一些用户特定的数据。这样,我可以避免登录时刷新整页。
问题是现在对服务器的每个后续 Ajax 请求都失败了ValidateAntiForgeryTokenAttribute,因为它现在需要一个与防伪 cookie 不兼容的防伪令牌。
如何获取有效的防伪令牌以放入客户端的隐藏字段,以便登录后的每个 Json 请求都会成功?
我试图手动获取一个新的隐藏字段令牌(AntiForgery.GetHtml()在操作中使用,提取令牌字符串本身,将其返回到 Json 中的客户端并在 JavaScript 中手动将其放置在防伪隐藏字段中)但它不起作用 -服务器上的后续 Ajax 调用失败ValidateAntiForgeryTokenAttribute。事实上,每次调用AntiForgery.GetHtml()(本质上是Html.AntiForgeryToken()helper 所做的)都会产生一个不同的令牌,这会使前一个令牌无效。
我也尝试在这里HttpContext.User = new GenericPrincipal(new GenericIdentity(email), null);设置为详细,但它不起作用。
注意:由于我的具体情况, 此解决方案对我不起作用: Ajax登录会更改服务器上的用户身份,因此在登录之前生成的每个令牌都无效;该解决方案也不适用,因为它解决了不同的问题。