ASP.NET MVC 的防伪令牌机制是基于当前HttpContext.User
。当您调用时,它使用该值来构造令牌Html.AntiForgeryToken()
。基本上是可以的(见解释最后一段在这里 https://stackoverflow.com/questions/7233939/mvc3-antiforgerytoken-issue/7238884#7238884)但是当您通过以下方式登录时会出现问题阿贾克斯调用.
在我的代码中,当用户登录时,凭据将作为 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);
详细说明here https://stackoverflow.com/questions/7233939/mvc3-antiforgerytoken-issue/7238884#7238884,但它不起作用。
Note: 这个解决方案 https://stackoverflow.com/questions/4074199/jquery-ajax-calls-and-the-html-antiforgerytoken/4074289#4074289由于我的具体情况,对我不起作用:An Ajaxlogin这会更改服务器上的用户身份,因此登录之前生成的每个令牌都无效;这个解决方案 https://stackoverflow.com/questions/1347728/using-an-mvc-htmlhelper-from-a-webform/2553583#2553583也不适用,因为它解决了不同的问题。